[
  {
    "path": ".github/FUNDING.yml",
    "content": "github: Cyclenerd\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: 'Bug: Good title'\nlabels: 'bug'\nassignees: ''\n\n---\n\n**Describe the bug**\nA clear and concise description of what the bug is.\n\n**To Reproduce**\nSteps to reproduce the behavior:\n1. Go to '...'\n2. Click on '....'\n3. Scroll down to '....'\n4. See error\n\n**Expected behavior**\nA clear and concise description of what you expected to happen.\n\n**Screenshots**\nIf applicable, add screenshots to help explain your problem.\n\n**Desktop (please complete the following information):**\n - OS: [e.g. iOS]\n - Browser [e.g. chrome, safari]\n - Version [e.g. 22]\n\n**Smartphone (please complete the following information):**\n - Device: [e.g. iPhone6]\n - OS: [e.g. iOS8.1]\n - Browser [e.g. stock browser, safari]\n - Version [e.g. 22]\n\n**Additional context**\nAdd any other context about the problem here.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "content": "blank_issues_enabled: false\ncontact_links:\n  - name: Contact me on Mastodon\n    url: https://fosstodon.org/@cyclenerd\n    about: Feel free to follow me on Mastodon and send me a message"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "content": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: 'Feature request: Good title'\nlabels: 'enhancement'\nassignees: ''\n\n---\n\n**Is your feature request related to a problem? Please describe.**\nA clear and concise description of what the problem is. Ex. I'm always frustrated when [...]\n\n**Describe the solution you'd like**\nA clear and concise description of what you want to happen.\n\n**Describe alternatives you've considered**\nA clear and concise description of any alternative solutions or features you've considered.\n\n**Additional context**\nAdd any other context or screenshots about the feature request here.\n"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "content": "First off, thanks for taking the time to contribute!\n\n## Please Complete the Following\n\n- [ ] I read `CONTRIBUTING.md`\n- [ ] I used tabs to indent\n- [ ] I have tested my change\n\n## Notes\n\nFeel free to put whatever you want here."
  },
  {
    "path": ".gitignore",
    "content": "/site/**\n/build/*.csv\n/build/*.gz\n/build/*.json\n/build/*.yml\n/build/*.conf\n/build/*.db\n/build/*.db-journal\n/build/machine-types-regions.sql\n/build/machine-types-regions.sql.gz\n/build/publicipranges.json\n/build/publicipaddresses.sql\n.~lock*\n"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nWe as members, contributors, and leaders pledge to make participation in our\ncommunity a harassment-free experience for everyone, regardless of age, body\nsize, visible or invisible disability, ethnicity, sex characteristics, gender\nidentity and expression, level of experience, education, socio-economic status,\nnationality, personal appearance, race, religion, or sexual identity\nand orientation.\n\nWe pledge to act and interact in ways that contribute to an open, welcoming,\ndiverse, inclusive, and healthy community.\n\n## Our Standards\n\nExamples of behavior that contributes to a positive environment for our\ncommunity include:\n\n* Demonstrating empathy and kindness toward other people\n* Being respectful of differing opinions, viewpoints, and experiences\n* Giving and gracefully accepting constructive feedback\n* Accepting responsibility and apologizing to those affected by our mistakes,\n  and learning from the experience\n* Focusing on what is best not just for us as individuals, but for the\n  overall community\n\nExamples of unacceptable behavior include:\n\n* The use of sexualized language or imagery, and sexual attention or\n  advances of any kind\n* Trolling, insulting or derogatory comments, and personal or political attacks\n* Public or private harassment\n* Publishing others' private information, such as a physical or email\n  address, without their explicit permission\n* Other conduct which could reasonably be considered inappropriate in a\n  professional setting\n\n## Enforcement Responsibilities\n\nCommunity leaders are responsible for clarifying and enforcing our standards of\nacceptable behavior and will take appropriate and fair corrective action in\nresponse to any behavior that they deem inappropriate, threatening, offensive,\nor harmful.\n\nCommunity leaders have the right and responsibility to remove, edit, or reject\ncomments, commits, code, wiki edits, issues, and other contributions that are\nnot aligned to this Code of Conduct, and will communicate reasons for moderation\ndecisions when appropriate.\n\n## Scope\n\nThis Code of Conduct applies within all community spaces, and also applies when\nan individual is officially representing the community in public spaces.\nExamples of representing our community include using an official e-mail address,\nposting via an official social media account, or acting as an appointed\nrepresentative at an online or offline event.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be\nreported to the community leaders responsible for enforcement at\nnils [at] nkn-it (dot) de.\nAll complaints will be reviewed and investigated promptly and fairly.\n\nAll community leaders are obligated to respect the privacy and security of the\nreporter of any incident.\n\n## Enforcement Guidelines\n\nCommunity leaders will follow these Community Impact Guidelines in determining\nthe consequences for any action they deem in violation of this Code of Conduct:\n\n### 1. Correction\n\n**Community Impact**: Use of inappropriate language or other behavior deemed\nunprofessional or unwelcome in the community.\n\n**Consequence**: A private, written warning from community leaders, providing\nclarity around the nature of the violation and an explanation of why the\nbehavior was inappropriate. A public apology may be requested.\n\n### 2. Warning\n\n**Community Impact**: A violation through a single incident or series\nof actions.\n\n**Consequence**: A warning with consequences for continued behavior. No\ninteraction with the people involved, including unsolicited interaction with\nthose enforcing the Code of Conduct, for a specified period of time. This\nincludes avoiding interactions in community spaces as well as external channels\nlike social media. Violating these terms may lead to a temporary or\npermanent ban.\n\n### 3. Temporary Ban\n\n**Community Impact**: A serious violation of community standards, including\nsustained inappropriate behavior.\n\n**Consequence**: A temporary ban from any sort of interaction or public\ncommunication with the community for a specified period of time. No public or\nprivate interaction with the people involved, including unsolicited interaction\nwith those enforcing the Code of Conduct, is allowed during this period.\nViolating these terms may lead to a permanent ban.\n\n### 4. Permanent Ban\n\n**Community Impact**: Demonstrating a pattern of violation of community\nstandards, including sustained inappropriate behavior,  harassment of an\nindividual, or aggression toward or disparagement of classes of individuals.\n\n**Consequence**: A permanent ban from any sort of public interaction within\nthe community.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage],\nversion 2.0, available at\nhttps://www.contributor-covenant.org/version/2/0/code_of_conduct.html.\n\nCommunity Impact Guidelines were inspired by [Mozilla's code of conduct\nenforcement ladder](https://github.com/mozilla/diversity).\n\n[homepage]: https://www.contributor-covenant.org\n\nFor answers to common questions about this code of conduct, see the FAQ at\nhttps://www.contributor-covenant.org/faq. Translations are available at\nhttps://www.contributor-covenant.org/translations.\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# How to contribute\n\nFirst off, thanks for taking the time to contribute!\n\n## Submitting changes\n\nPlease send a GitHub Pull Request with a clear list of what you've done (read more about [pull requests](http://help.github.com/pull-requests/)).\n\nAlways write a clear log message for your commits. One-line messages are fine for small changes, but bigger changes should look like this:\n\n```\n$ git commit -m \"A brief summary of the commit\n> \n> A paragraph describing what changed and its impact.\"\n```\n\n## Coding style\n\nStart reading the code and you'll get the hang of it. It is optimized for readability:\n\n* Please also update the documentation.\n* Space before the opening curly of a multi-line BLOCK.\n* No space before the semicolon.\n* Space around most operators.\n* No space between function name and its opening parenthesis.\n* Line up corresponding things vertically, especially if it'd be too long to fit on one line anyway.\n* Please use tabs to indent.\n* Be nice.\n\nOne more thing:\n\n* Keep it simple! 👍\n\nThanks! ❤️❤️❤️\n"
  },
  {
    "path": "LICENSE",
    "content": "                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "README.md",
    "content": "# Google Cloud Compute Comparison\n\n[![Badge: Google Cloud](https://img.shields.io/badge/Google%20Cloud-%234285F4.svg?logo=google-cloud&logoColor=white)](#readme)\n[![Badge: LICENSE](https://img.shields.io/github/license/cyclenerd/google-cloud-compute-machine-types)](https://github.com/Cyclenerd/google-cloud-compute-machine-types/blob/master/LICENSE)\n\nThis Google Compute Engine machine type comparison [webapp](https://gcloud-compute.com/) helps to find the optimal GCE machine type or instance in the many Google Cloud Platform (GCP) regions. A lot of information has been collected from various Google Cloud websites and different sources.\n\n## Instance Picker\n\n[![Screenshot: gcloud-compute.com - Instance Picker](./img/grid.png)](https://gcloud-compute.com/)\n\n## Comparison\n\n[![Screenshot: gcloud-compute.com - Comparison](./img/compare.png)](https://gcloud-compute.com/comparison/e2-standard-4/vs/t2a-standard-4.html)\n\n## 🖊️ Add, edit or change machine type information\n\nThe Google Compute Engine API is used to get all machine types in all regions and zones.\nAdditional information is read via SQL files during the build process.\nDive into the [build](./build/) folder to see how the data is retrieved, processed, and integrated.\nFeel free to explore and contribute!\n\n## ❤️ Contributing\n\nHave a patch that will benefit this project?\nAwesome! Follow these steps to have it accepted.\n\n1. Please read [how to contribute](CONTRIBUTING.md).\n1. Fork this Git repository and make your changes.\n1. Create a Pull Request.\n1. Incorporate review feedback to your changes.\n1. Accepted!\n\n## 📜 License\n\nAll files in this repository are under the [Apache License, Version 2.0](LICENSE) unless noted otherwise.\n\nPortions of this webapp are modifications based on work created and shared by [Google](https://developers.google.com/readme/policies)\nand used according to terms described in the [Creative Commons 4.0 Attribution License](https://creativecommons.org/licenses/by/4.0/).\n\nPlease note:\n\n* No warranty\n* No official Google product"
  },
  {
    "path": "build/00_config.sh",
    "content": "#!/usr/bin/env bash\n\nDB='gce.db'\nCSV_GCLOUD_MACHINE_TYPES=\"machinetypes.csv\"\nCSV_GCLOUD_ZONES=\"zones.csv\"\nCSV_GCLOUD_DISK_TYPES=\"disktypes.csv\"\nCSV_GCLOUD_IMAGES=\"images.csv\"\nCSV_EXPORT='machine-types-regions.csv'\nSQL_EXPORT='machine-types-regions.sql'\n"
  },
  {
    "path": "build/01_create_database.sh",
    "content": "#!/usr/bin/env bash\nset -e\n\n#\n# Create SQLite3 database for GCE machine type informations\n#\n\nsource \"00_config.sh\"\n\nsqlite3 \"$DB\" < \"01_create_database.sql\""
  },
  {
    "path": "build/01_create_database.sql",
    "content": "/*\n * Create SQLite3 database for GCE machine type informations\n */\n\nDROP TABLE IF EXISTS \"machinetypes\";\nCREATE TABLE \"machinetypes\" (\n\t\"name\"                         TEXT NOT NULL DEFAULT '',\n\t'description'                  TEXT NOT NULL DEFAULT '',\n\t'location'                     TEXT NOT NULL DEFAULT '',\n\t'region'                       TEXT NOT NULL DEFAULT '',\n\t'zone'                         TEXT NOT NULL DEFAULT '',\n\t'guestCpus'                    INT  NOT NULL DEFAULT '0',\n\t'isSharedCpu'                  TEXT NOT NULL DEFAULT 'false',\n\t'memoryGB'                     REAL NOT NULL DEFAULT '0.0',\n\t'guestAcceleratorCount'        INT  NOT NULL DEFAULT '0',\n\t'guestAcceleratorType'         TEXT NOT NULL DEFAULT '',\n\t'maximumPersistentDisks'       INT  NOT NULL DEFAULT '0',\n\t'maximumPersistentDisksSizeGb' INT  NOT NULL DEFAULT '0',\n\tPRIMARY KEY(\"name\", \"zone\")\n);\n\nDROP TABLE IF EXISTS \"zones\";\nCREATE TABLE \"zones\" (\n\t\"name\"                  TEXT NOT NULL DEFAULT '',\n\t'availableCpuPlatforms' TEXT NOT NULL DEFAULT '',\n\tPRIMARY KEY(\"name\")\n);\n\nDROP TABLE IF EXISTS \"instances\";\nCREATE TABLE \"instances\" (\n\t\"name\"                      TEXT NOT NULL DEFAULT '',\n\t\"series\"                    TEXT DEFAULT 'TODO',\n\t\"family\"                    TEXT DEFAULT 'TODO',\n\t\"description\"               TEXT DEFAULT '',\n\t\"location\"                  TEXT NOT NULL DEFAULT '',\n\t\"region\"                    TEXT NOT NULL DEFAULT '',\n\t\"regionLocation\"            TEXT NOT NULL DEFAULT '',\n\t\"regionLocationLong\"        TEXT NOT NULL DEFAULT '',\n\t\"regionLocationCountryCode\" TEXT NOT NULL DEFAULT '',\n\t\"regionCfe\"                 REAL DEFAULT '',\n\t\"regionCo2Kwh\"              REAL DEFAULT '',\n\t\"regionLowCo2\"              REAL DEFAULT '0.0',\n\t\"regionLat\"                 REAL DEFAULT '0.0',\n\t\"regionLng\"                 REAL DEFAULT '0.0',\n\t\"regionPublicIpv4Addr\"      REAL DEFAULT '0.0',\n\t\"zoneCount\"                 REAL DEFAULT '0.0',\n\t\"zones\"                     TEXT DEFAULT '',\n\t\"vCpus\"                     REAL DEFAULT '0.0',\n\t\"sharedCpu\"                 TEXT DEFAULT 'false',\n\t\"intel\"                     REAL DEFAULT '0.0',\n\t\"amd\"                       REAL DEFAULT '0.0',\n\t\"arm\"                       REAL DEFAULT '0.0',\n\t\"cpuPlatformCount\"          REAL DEFAULT '0.0',\n\t\"cpuPlatform\"               TEXT DEFAULT '',\n\t\"cpuBaseClock\"              REAL DEFAULT '0.0',\n\t\"cpuTurboClock\"             REAL DEFAULT '0.0',\n\t\"cpuSingleMaxTurboClock\"    REAL DEFAULT '0.0',\n\t\"availableCpuPlatformCount\" REAL DEFAULT '0.0',\n\t\"availableCpuPlatform\"      TEXT DEFAULT '',\n\t\"coremarkScore\"             REAL DEFAULT '',\n\t\"standardDeviation\"         REAL DEFAULT '',\n\t\"sampleCount\"               REAL DEFAULT '',\n\t\"memoryGB\"                  REAL DEFAULT '0.0',\n\t\"acceleratorCount\"          REAL DEFAULT '0.0',\n\t\"acceleratorType\"           TEXT DEFAULT '',\n\t\"disks\"                     REAL DEFAULT '0.0',\n\t\"disksSizeGb\"               REAL DEFAULT '0.0',\n\t\"localSsd\"                  REAL DEFAULT '0.0',\n\t\"bandwidth\"                 REAL DEFAULT '0.0',\n\t\"tier1\"                     REAL DEFAULT '0.0',\n\t\"sap\"                       REAL DEFAULT '0.0',\n\t\"saps\"                      REAL DEFAULT '',\n\t\"hana\"                      REAL DEFAULT '0.0',\n\t\"sud\"                       REAL DEFAULT '0.0',\n\t\"spot\"                      REAL DEFAULT '0.0',\n\t\"hour\"                      REAL DEFAULT '0.0',\n\t\"hourSpot\"                  REAL DEFAULT '0.0',\n\t\"month\"                     REAL DEFAULT '0.0',\n\t\"month1yCud\"                REAL DEFAULT '0.0',\n\t\"month3yCud\"                REAL DEFAULT '0.0',\n\t\"monthSpot\"                 REAL DEFAULT '0.0',\n\t\"monthSles\"                 REAL DEFAULT '0.0',\n\t\"monthSlesSap\"              REAL DEFAULT '0.0',\n\t\"monthSlesSap1yCud\"         REAL DEFAULT '0.0',\n\t\"monthSlesSap3yCud\"         REAL DEFAULT '0.0',\n\t\"monthRhel\"                 REAL DEFAULT '0.0',\n\t\"monthRhel1yCud\"            REAL DEFAULT '0.0',\n\t\"monthRhel3yCud\"            REAL DEFAULT '0.0',\n\t\"monthRhelSap\"              REAL DEFAULT '0.0',\n\t\"monthRhelSap1yCud\"         REAL DEFAULT '0.0',\n\t\"monthRhelSap3yCud\"         REAL DEFAULT '0.0',\n\t\"monthWindows\"              REAL DEFAULT '0.0',\n\tPRIMARY KEY(\"name\", \"region\")\n);\n\nDROP TABLE IF EXISTS \"disktypes\";\nCREATE TABLE \"disktypes\" (\n\t\"name\"        TEXT NOT NULL DEFAULT '',\n\t'description' TEXT NOT NULL DEFAULT '',\n\t'location'    TEXT NOT NULL DEFAULT '',\n\t'region'      TEXT NOT NULL DEFAULT '',\n\t'zone'        TEXT NOT NULL DEFAULT '',\n\tPRIMARY KEY(\"name\", \"zone\")\n);\n\nDROP TABLE IF EXISTS \"disks\";\nCREATE TABLE \"disks\" (\n\t\"name\"           TEXT NOT NULL DEFAULT '',\n\t\"description\"    TEXT DEFAULT '',\n\t\"location\"       TEXT NOT NULL DEFAULT '',\n\t\"region\"         TEXT NOT NULL DEFAULT '',\n\t\"regionLocation\" TEXT NOT NULL DEFAULT '',\n\t\"zoneCount\"      REAL DEFAULT '0.0',\n\t\"zones\"          TEXT DEFAULT '',\n\t\"monthGb\"        REAL DEFAULT '0.0',\n\tPRIMARY KEY(\"name\", \"region\")\n);\n\nDROP TABLE IF EXISTS \"images\";\nCREATE TABLE \"images\" (\n\t\"name\"         TEXT NOT NULL DEFAULT '',\n\t\"description\"  TEXT DEFAULT '',\n\t\"diskSizeGb\"   REAL DEFAULT '0.0',\n\t\"project\"      TEXT NOT NULL DEFAULT '',\n\t\"family\"       TEXT NOT NULL DEFAULT '',\n\t\"architecture\" TEXT NOT NULL DEFAULT '',\n\t\"creation\"     REAL DEFAULT '0.0',\n\tPRIMARY KEY(\"name\", \"project\", \"family\")\n);\n\n/* Index */\nCREATE INDEX IF NOT EXISTS \"instances-name-index\" ON instances(name COLLATE NOCASE);\nCREATE INDEX IF NOT EXISTS \"instances-region-index\" ON instances(region COLLATE NOCASE);\nCREATE INDEX IF NOT EXISTS \"instances-region-name-index\" ON instances(region, name COLLATE NOCASE);\nCREATE INDEX IF NOT EXISTS \"instances-region-hana-index\" ON instances(region, hana);\nCREATE INDEX IF NOT EXISTS \"instances-region-sap-index\" ON instances(region, sap);\nCREATE INDEX IF NOT EXISTS \"instances-region-series-index\" ON instances(region, series COLLATE NOCASE);\n\nCREATE INDEX IF NOT EXISTS \"disks-name-index\" ON disks(name COLLATE NOCASE);\nCREATE INDEX IF NOT EXISTS \"disks-region-index\" ON disks(region COLLATE NOCASE);"
  },
  {
    "path": "build/02_get.sh",
    "content": "#!/usr/bin/env bash\nset -e\n\n#\n# Export all Google Compute Engine machine types and zones via the\n# Google Compute Engine API and create CSV file\n#\n\nsource \"00_config.sh\"\n\necho \"Download pricing...\"\ncurl -OL \"https://github.com/Cyclenerd/google-cloud-pricing-cost-calculator/raw/master/pricing.yml\"\necho\n\n# Create CSV file with machine types\necho \"Executing: 'gcloud compute machine-types list', please wait...\"\nprintf \"%s;\" \\\n\t\"name\" \\\n\t\"description\" \\\n\t\"zone\" \\\n\t\"guestCpus\" \\\n\t\"isSharedCpu\" \\\n\t\"memoryGB\" \\\n\t\"guestAcceleratorCount\" \\\n\t\"guestAcceleratorType\" \\\n\t\"maximumPersistentDisks\" \\\n\t\"maximumPersistentDisksSizeGb\" \\\n\t\"deprecated\" > \"$CSV_GCLOUD_MACHINE_TYPES\"\necho \"\" >> \"$CSV_GCLOUD_MACHINE_TYPES\"\ngcloud compute machine-types list \\\n\t--quiet \\\n\t--filter=\"ZONE:-\" \\\n\t--format=\"csv[no-heading,separator=';']( \\\n\t\tname, \\\n\t\tdescription, \\\n\t\tzone, \\\n\t\tguestCpus, \\\n\t\tisSharedCpu, \\\n\t\tMEMORY_GB, \\\n\t\taccelerators.guestAcceleratorCount, \\\n\t\taccelerators.guestAcceleratorType, \\\n\t\tmaximumPersistentDisks, \\\n\t\tmaximumPersistentDisksSizeGb, \\\n\t\tdeprecated.state)\" >> \"$CSV_GCLOUD_MACHINE_TYPES\"\n\n# Create CSV file with zones and available CPU platforms\necho \"Executing: 'gcloud compute zones list', please wait...\"\nprintf \"%s;\" \\\n\t\"name\" \\\n\t\"availableCpuPlatforms\" > \"$CSV_GCLOUD_ZONES\"\necho \"\" >> \"$CSV_GCLOUD_ZONES\"\ngcloud compute zones list \\\n\t--quiet \\\n\t--format=\"csv[no-heading,separator=';'](name, availableCpuPlatforms.list())\" >> \"$CSV_GCLOUD_ZONES\"\n# Fix Google Axion CPU platform name:\n# Parse the CSV file line by line. If 'Google Axion' is in line and 'Google Axion_' remove 'Google Axion_'.\nperl -i -pe \"s/Google Axion_,//g if /Google Axion/\" \"$CSV_GCLOUD_ZONES\"\nperl -i -pe \"s/Google Axion_//g if /Google Axion/\" \"$CSV_GCLOUD_ZONES\"\n\n# Create CSV file with disk types\necho \"Executing: 'gcloud compute disk-types list', please wait...\"\nprintf \"%s;\" \\\n\t\"name\" \\\n\t\"zone\" \\\n\t\"description\" > \"$CSV_GCLOUD_DISK_TYPES\"\necho \"\" >> \"$CSV_GCLOUD_DISK_TYPES\"\ngcloud compute disk-types list \\\n\t--quiet \\\n\t--filter=\"ZONE:-\" \\\n\t--format=\"csv[no-heading,separator=';']( \\\n\t\tname, \\\n\t\tzone, \\\n\t\tdescription)\" >> \"$CSV_GCLOUD_DISK_TYPES\"\n\n# Create CSV files with images\necho \"Executing: 'gcloud compute images list', please wait...\"\n\n# Standard images\necho \"name;description;diskSizeGb;project;family;architecture;creation;deprecated;status\" > \"$CSV_GCLOUD_IMAGES\"\ngcloud compute images list \\\n\t--quiet \\\n\t--format=\"csv[no-heading,separator=';'](NAME,description,diskSizeGb,PROJECT,FAMILY,architecture,creationTimestamp,DEPRECATED,STATUS)\" >> \"$CSV_GCLOUD_IMAGES\"\n\n# Community images\n# https://cloud.google.com/compute/docs/images#almalinux\ngcloud compute images list \\\n\t--project almalinux-cloud \\\n\t--no-standard-images \\\n\t--quiet \\\n\t--format=\"csv[no-heading,separator=';'](NAME,description,diskSizeGb,PROJECT,FAMILY,architecture,creationTimestamp,DEPRECATED,STATUS)\" >> \"$CSV_GCLOUD_IMAGES\"\n# https://cloud.google.com/compute/docs/images#freebsd\ngcloud compute images list \\\n\t--project freebsd-org-cloud-dev \\\n\t--no-standard-images \\\n\t--quiet \\\n\t--format=\"csv[no-heading,separator=';'](NAME,description,diskSizeGb,PROJECT,FAMILY,architecture,creationTimestamp,DEPRECATED,STATUS)\" >> \"$CSV_GCLOUD_IMAGES\"\n\n# Deep Learning on Linux images\ngcloud compute images list \\\n\t--project ml-images \\\n\t--filter=\"creationTimestamp > -P1Y\" \\\n\t--no-standard-images \\\n\t--quiet \\\n\t--format=\"csv[no-heading,separator=';'](NAME,description,diskSizeGb,PROJECT,FAMILY,architecture,creationTimestamp,DEPRECATED,STATUS)\" >> \"$CSV_GCLOUD_IMAGES\"\n# https://cloud.google.com/deep-learning-vm/docs/images#listing-versions\ngcloud compute images list \\\n\t--project deeplearning-platform-release \\\n\t--filter=\"creationTimestamp > -P1Y\" \\\n\t--no-standard-images \\\n\t--quiet \\\n\t--format=\"csv[no-heading,separator=';'](NAME,description,diskSizeGb,PROJECT,FAMILY,architecture,creationTimestamp,DEPRECATED,STATUS)\" >> \"$CSV_GCLOUD_IMAGES\"\n\n# High Performance Computing (HPC)\ngcloud compute images list \\\n\t--project cloud-hpc-image-public \\\n\t--filter=\"creationTimestamp > -P1Y\" \\\n\t--no-standard-images \\\n\t--quiet \\\n\t--format=\"csv[no-heading,separator=';'](NAME,description,diskSizeGb,PROJECT,FAMILY,architecture,creationTimestamp,DEPRECATED,STATUS)\" >> \"$CSV_GCLOUD_IMAGES\"\necho \"DONE\""
  },
  {
    "path": "build/03_copy.pl",
    "content": "#!/usr/bin/env perl\n\n# Copyright 2022 Nils Knieling. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n#\n# Copy machine types from CSV export to SQLite database\n#\n\nuse utf8;\nbinmode(STDOUT, ':encoding(utf8)');\nuse strict;\nuse DBI;\n\n# CSV files without .csv\nmy $csv_gcloud_machine_types       = 'machinetypes';\nmy $csv_gcloud_zones               = 'zones';\nmy $csv_gcloud_disk_types          = 'disktypes';\nmy $csv_gcloud_images              = 'images';\nmy $csv_gcloud_community_images    = 'imagescommunity';\nmy $csv_gcloud_deeplearning_images = 'imagesdeeplearning';\n\n# SQLite database file\nmy $db_file  = 'gce.db';\n\n# Open CSV\nmy $csv = DBI->connect(\"dbi:CSV:\", undef, undef, {\n\tf_ext        => \".csv/r\",\n\tcsv_sep_char => \";\",\n\tcsv_class    => \"Text::CSV_XS\",\n\tRaiseError   => 1,\n}) or die \"ERROR: Cannot connect $DBI::errstr\\n\";\n\n# Open DB\nmy $db = DBI->connect(\"dbi:SQLite:dbname=$db_file\",\"\",\"\") or die \"ERROR: Cannot connect $DBI::errstr\\n\";\n\n\n###############################################################################\n# MACHINE TYPES\n###############################################################################\n\nprint \"Machine types\\n\";\n$db->do(\"DELETE FROM machinetypes\") or die \"ERROR: Cannot delete table $DBI::errstr\\n\";\n\n# Select machine types from CSV\nmy $select = qq ~\nSELECT \n\tname, description, zone,\n\tguestCpus, isSharedCpu,\n\tmemoryGB,\n\tguestAcceleratorCount, guestAcceleratorType,\n\tmaximumPersistentDisks, maximumPersistentDisksSizeGb,\n\tdeprecated\nFROM $csv_gcloud_machine_types\n~;\nmy $sth = $csv->prepare($select);\n$sth->execute;\n$sth->bind_columns (\\my (\n\t$name, $description, $zone,\n\t$guestCpus, $isSharedCpu,\n\t$memoryGB,\n\t$guestAcceleratorCount, $guestAcceleratorType,\n\t$maximumPersistentDisks, $maximumPersistentDisksSizeGb,\n\t$deprecated\n));\n# Create values for insert\nmy @values = ();\nwhile ($sth->fetch) {\n\tnext if ($deprecated); # Skip deprecated machine-types\n\tprint \"$name, $zone\\n\";\n\t# Location and region\n\tmy @zone_parts = split(/-/, $zone);\n\tmy $location   = \"$zone_parts[0]\";\n\tmy $region     = \"$zone_parts[0]-$zone_parts[1]\";\n\t$isSharedCpu   = lc($isSharedCpu);\n\t# Create value for SQL INSERT\n\tmy $value = qq ~\n\t\t (\n\t\t\t'$name', '$description', '$location', '$region', '$zone',\n\t\t\t'$guestCpus', '$isSharedCpu',\n\t\t\t'$memoryGB',\n\t\t\t'$guestAcceleratorCount', '$guestAcceleratorType',\n\t\t\t'$maximumPersistentDisks', '$maximumPersistentDisksSizeGb'\n\t\t)\n\t~;\n\t$value =~ s/\\t//g;\n\tpush(@values, $value);\n}\n$sth->finish;\n# Insert machine types to database table\nmy $insert = qq ~\nINSERT INTO machinetypes (\n\t'name', 'description', 'location', 'region', 'zone',\n\t'guestCpus', 'isSharedCpu',\n\t'memoryGB',\n\t'guestAcceleratorCount', 'guestAcceleratorType',\n\t'maximumPersistentDisks', 'maximumPersistentDisksSizeGb'\n) VALUES\n~;\n$insert .= join(\",\", @values);\n$insert .= \";\\n\";\n$db->do($insert) or die \"ERROR: Cannot insert machine types $DBI::errstr\\n\";\n\n\n###############################################################################\n# ZONES\n###############################################################################\n\nprint \"Zones\\n\";\n$db->do(\"DELETE FROM zones\") or die \"ERROR: Cannot delete table $DBI::errstr\\n\";\n\n# Select machine types from CSV\nmy $select_zones = \"SELECT name, availableCpuPlatforms FROM $csv_gcloud_zones\";\n$sth = $csv->prepare($select_zones);\n$sth->execute;\n$sth->bind_columns (\\my ($name, $availableCpuPlatforms));\n# Create values for insert\nmy @zones = ();\nwhile ($sth->fetch) {\n\tprint \"$name\\n\";\n\t# Create value for SQL INSERT\n\tmy $zone = \"('$name', '$availableCpuPlatforms')\";\n\tpush(@zones, $zone);\n}\n$sth->finish;\n\nmy $insert_zones = \"INSERT INTO zones ('name', 'availableCpuPlatforms') VALUES\";\n$insert_zones .= join(\",\", @zones);\n$insert_zones .= \";\\n\";\n$db->do($insert_zones) or die \"ERROR: Cannot insert zones $DBI::errstr\\n\";\n\n###############################################################################\n# DISK TYPES\n###############################################################################\n\nprint \"Disk types\\n\";\n$db->do(\"DELETE FROM disktypes\") or die \"ERROR: Cannot delete table $DBI::errstr\\n\";\n\n# Select disk types from CSV\nmy $select_disks = \"SELECT name, description, zone FROM $csv_gcloud_disk_types\";\n$sth = $csv->prepare($select_disks);\n$sth->execute;\n$sth->bind_columns (\\my ($name, $description, $zone));\n# Create values for insert\nmy @disks = ();\nwhile ($sth->fetch) {\n\tprint \"$name, $zone\\n\";\n\t# Location and region\n\tmy @zone_parts = split(/-/, $zone);\n\tmy $location   = \"$zone_parts[0]\";\n\tmy $region     = \"$zone_parts[0]-$zone_parts[1]\";\n\t# Create value for SQL INSERT\n\tmy $value = \"('$name', '$description', '$location', '$region', '$zone')\";\n\tpush(@disks, $value);\n}\n$sth->finish;\n# Insert machine types to database table\nmy $insert_disks = qq ~\nINSERT INTO disktypes (\n\t'name',\n\t'description',\n\t'location',\n\t'region',\n\t'zone'\n) VALUES\n~;\n$insert_disks .= join(\",\", @disks);\n$insert_disks .= \";\\n\";\n$db->do($insert_disks) or die \"ERROR: Cannot insert disk types $DBI::errstr\\n\";\n\n\n###############################################################################\n# IMAGES\n###############################################################################\n\nprint \"Images\\n\";\n$db->do(\"DELETE FROM images\") or die \"ERROR: Cannot delete table $DBI::errstr\\n\";\n\nmy $insert_images = qq ~\nREPLACE INTO images (\n\t'name',\n\t'description',\n\t'diskSizeGb',\n\t'project',\n\t'family',\n\t'architecture',\n\t'creation'\n) VALUES\n~;\nmy $select_images = \"SELECT name, description, diskSizeGb, project, family, architecture, creation FROM $csv_gcloud_images WHERE status LIKE 'READY'\";\n$sth = $csv->prepare($select_images);\n$sth->execute;\n$sth->bind_columns (\\my ($name, $description, $diskSizeGb, $project, $family, $architecture, $creation));\nwhile ($sth->fetch) {\n\tprint \"$project, $family, $name\\n\";\n\tmy $value = \"$insert_images ('$name', '$description', '$diskSizeGb', '$project', '$family', '$architecture', '$creation')\";\n\t$db->do($value) or die \"ERROR: Cannot insert images $DBI::errstr\\n\";\n}\n$sth->finish;\n\nprint \"DONE\\n\";\n"
  },
  {
    "path": "build/04_clean_up.sh",
    "content": "#!/usr/bin/env bash\nset -e\n\n#\n# Clean up (Remove disconnected data centers...)\n#\n\nsource \"00_config.sh\"\n\nsqlite3 \"$DB\" < \"../instances/clean_up.sql\""
  },
  {
    "path": "build/05_copy_disks.pl",
    "content": "#!/usr/bin/env perl\n\n# Copyright 2022 Nils Knieling. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n#\n# Copy disk types per region to disks table\n#\n\nuse utf8;\nbinmode(STDOUT, ':encoding(utf8)');\nuse strict;\nuse DBI;\n\nmy $db_file  = 'gce.db';\n\n# Open DB\nmy $db = DBI->connect(\"dbi:SQLite:dbname=$db_file\",\"\",\"\") or die \"ERROR: Cannot connect $DBI::errstr\\n\";\n\n###############################################################################\n# Copy DISK TYPES to DISKS\n###############################################################################\n$db->do(\"DELETE FROM disks\") or die \"ERROR: Cannot delete table $DBI::errstr\\n\";\n\n# Select 'disktypes'\nmy $select = qq ~\nSELECT\n\tname, description, location, region, \n\t(SELECT COUNT(zone)        FROM disktypes WHERE name LIKE D.name AND region LIKE D.region)               AS zoneCount,\n\t(SELECT GROUP_CONCAT(zone) FROM disktypes WHERE name LIKE D.name AND region LIKE D.region ORDER BY zone) AS zones\nFROM disktypes D\nGROUP BY name, region;\n~;\nmy $sth = $db->prepare($select);\n$sth->execute;\n$sth->bind_columns ( \\my (\n\t$name, $description, $location, $region,\n\t$zoneCount,\n\t$zones\n));\n\n# Insert disk type per region to disks table\nmy @values = ();\nwhile ($sth->fetch) {\n\tprint \"$name, $region\\n\";\n\t# Sort zones\n\tmy @zones_unsorted = split(',', $zones);\n\t$zones = join(', ', sort @zones_unsorted);\n\t# Create value for SQL INSERT\n\tmy $value = \"('$name', '$description', '$location', '$region', '$zoneCount', '$zones')\";\n\tpush(@values, $value);\n}\n$sth->finish;\n\nmy $insert = qq ~\nINSERT INTO disks (\n\t'name',\n\t'description',\n\t'location',\n\t'region',\n\t'zoneCount',\n\t'zones'\n) VALUES\n~;\n$insert .= join(\",\", @values);\n$insert .= \";\\n\";\n$db->do($insert) or die \"ERROR: Cannot insert $DBI::errstr\\n\";\n\nprint \"DONE\\n\";\n"
  },
  {
    "path": "build/05_copy_instances.pl",
    "content": "#!/usr/bin/env perl\n\n# Copyright 2022 Nils Knieling. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n#\n# Copy machine types per region to instances table\n#\n\nuse utf8;\nbinmode(STDOUT, ':encoding(utf8)');\nuse strict;\nuse DBI;\n\nmy $db_file  = 'gce.db';\n\n# Open DB\nmy $db = DBI->connect(\"dbi:SQLite:dbname=$db_file\",\"\",\"\") or die \"ERROR: Cannot connect $DBI::errstr\\n\";\n\n\n###############################################################################\n# Copy MACHINE TYPES to INSTANCES\n###############################################################################\n$db->do(\"DELETE FROM instances\") or die \"ERROR: Cannot delete table $DBI::errstr\\n\";\n\n# Select 'machinetypes'\nmy $select = qq ~\nSELECT\n\tname, description, location, region, \n\t(SELECT COUNT(zone)        FROM machinetypes WHERE name LIKE M.name AND region LIKE M.region)               AS zoneCount,\n\t(SELECT GROUP_CONCAT(zone) FROM machinetypes WHERE name LIKE M.name AND region LIKE M.region ORDER BY zone) AS zones,\n\tguestCpus, isSharedCpu,\n\tmemoryGB,\n\tguestAcceleratorCount, guestAcceleratorType,\n\tmaximumPersistentDisks, maximumPersistentDisksSizeGb\nFROM machinetypes M\nGROUP BY name, region;\n~;\nmy $sth = $db->prepare($select);\n$sth->execute;\n$sth->bind_columns ( \\my (\n\t$name, $description, $location, $region,\n\t$zoneCount,\n\t$zones,\n\t$guestCpus, $isSharedCpu,\n\t$memoryGB,\n\t$guestAcceleratorCount, $guestAcceleratorType,\n\t$maximumPersistentDisks, $maximumPersistentDisksSizeGb\n));\n\n# Insert machine type per region to instances table\nmy @values = ();\nwhile ($sth->fetch) {\n\tprint \"$name, $region\\n\";\n\t# Shared CPU\n\tif (lc($isSharedCpu) eq 'true') {\n\t\t$isSharedCpu = '1';\n\t} else {\n\t\t$isSharedCpu = '0'\n\t}\n\t# Sort zones\n\tmy @zones_unsorted = split(',', $zones);\n\t$zones = join(', ', sort @zones_unsorted);\n\t# Create value for SQL INSERT\n\tmy $value = qq ~\n\t\t (\n\t\t\t'$name', '$description', '$location', '$region', '$zoneCount', '$zones',\n\t\t\t'$guestCpus', '$isSharedCpu',\n\t\t\t'$memoryGB',\n\t\t\t'$guestAcceleratorCount', '$guestAcceleratorType',\n\t\t\t'$maximumPersistentDisks', '$maximumPersistentDisksSizeGb'\n\t\t)\n\t~;\n\t$value =~ s/\\t//g;\n\tpush(@values, $value);\n}\n$sth->finish;\n\nmy $insert = qq ~\nINSERT INTO instances (\n\t'name', 'description', 'location', 'region', 'zoneCount', 'zones',\n\t'vCpus', 'sharedCpu',\n\t'memoryGB',\n\t'acceleratorCount', 'acceleratorType',\n\t'disks', 'disksSizeGb'\n) VALUES\n~;\n$insert .= join(\",\", @values);\n$insert .= \";\\n\";\n$db->do($insert) or die \"ERROR: Cannot insert $DBI::errstr\\n\";\n\nprint \"DONE\\n\";\n"
  },
  {
    "path": "build/06_add_costs.pl",
    "content": "#!/usr/bin/env perl\n\n# Copyright 2022-2024 Nils Knieling. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n#\n# Add costs for machine types in region from pricing (https://github.com/Cyclenerd/google-cloud-pricing-cost-calculator)\n#\n\nuse utf8;\nbinmode(STDOUT, ':encoding(utf8)');\nuse strict;\nuse DBI;\nuse YAML::XS qw(LoadFile);\nuse App::Options (\n\toption => {\n\t\tpricing => {\n\t\t\trequired    => 1,\n\t\t\tdefault     => 'pricing.yml',\n\t\t\tdescription => \"YAML file with GCP pricing information\"\n\t\t},\n\t},\n);\n\n# Open DB\nmy $db_file  = 'gce.db';\nmy $db = DBI->connect(\"dbi:SQLite:dbname=$db_file\",\"\",\"\") or die \"ERROR: Cannot connect $DBI::errstr\\n\";\n\n# Load YAML file with GCP information\nmy $pricing_file = $App::options{pricing};\nunless (-r \"$pricing_file\") { # read\n\tdie \"ERROR: Cannot open YAML file '$pricing_file' for GCP information import!\\n\";\n}\nmy $gcp = LoadFile(\"$pricing_file\");\n\n\n###############################################################################\n# INSTANCES\n###############################################################################\nprint \"\\nInstances\\n\";\n\nforeach my $machine (keys %{ $gcp->{'compute'}->{'instance'} }) {\n\tprint \"$machine\\n\";\n\t# OS license per month\n\tmy $sles      = $gcp->{'compute'}->{'license'}->{$machine}->{'cost'}->{'sles'}->{'month'};\n\tmy $slesSap   = $gcp->{'compute'}->{'license'}->{$machine}->{'cost'}->{'sles-sap'}->{'month'};\n\tmy $slesSap1y = $gcp->{'compute'}->{'license'}->{$machine}->{'cost'}->{'sles-sap'}->{'month_1y'} || $slesSap;\n\tmy $slesSap3y = $gcp->{'compute'}->{'license'}->{$machine}->{'cost'}->{'sles-sap'}->{'month_3y'} || $slesSap;\n\tmy $rhel      = $gcp->{'compute'}->{'license'}->{$machine}->{'cost'}->{'rhel'}->{'month'};\n\tmy $rhel1y    = $gcp->{'compute'}->{'license'}->{$machine}->{'cost'}->{'rhel'}->{'month_1y'} || $rhel;\n\tmy $rhel3y    = $gcp->{'compute'}->{'license'}->{$machine}->{'cost'}->{'rhel'}->{'month_3y'} || $rhel;\n\tmy $rhelSap   = $gcp->{'compute'}->{'license'}->{$machine}->{'cost'}->{'rhel-sap'}->{'month'};\n\tmy $rhelSap1y = $gcp->{'compute'}->{'license'}->{$machine}->{'cost'}->{'rhel-sap'}->{'month_1y'} || $rhelSap;\n\tmy $rhelSap3y = $gcp->{'compute'}->{'license'}->{$machine}->{'cost'}->{'rhel-sap'}->{'month_3y'} || $rhelSap;\n\tmy $windows   = $gcp->{'compute'}->{'license'}->{$machine}->{'cost'}->{'windows'}->{'month'};\n\tforeach my $region (keys %{ $gcp->{'compute'}->{'instance'}->{$machine}->{'cost'} }) {\n\t\tprint \"\\t$region\\n\";\n\t\t# vCPU and memory in region per hour and month\n\t\tmy $hour       = $gcp->{'compute'}->{'instance'}->{$machine}->{'cost'}->{$region}->{'hour'}       || '0.0';\n\t\tmy $hour_spot  = $gcp->{'compute'}->{'instance'}->{$machine}->{'cost'}->{$region}->{'hour_spot'}  || $hour;\n\t\tmy $month      = $gcp->{'compute'}->{'instance'}->{$machine}->{'cost'}->{$region}->{'month'}      || '0.0';\n\t\tmy $month_1y   = $gcp->{'compute'}->{'instance'}->{$machine}->{'cost'}->{$region}->{'month_1y'}   || $month;\n\t\tmy $month_3y   = $gcp->{'compute'}->{'instance'}->{$machine}->{'cost'}->{$region}->{'month_3y'}   || $month;\n\t\tmy $month_spot = $gcp->{'compute'}->{'instance'}->{$machine}->{'cost'}->{$region}->{'month_spot'} || $month;\n\n\t\tmy $update = qq ~\n\t\tUPDATE instances SET\n\t\t\thour                      = '$hour',\n\t\t\thourSpot                  = '$hour_spot',\n\t\t\tmonth                     = '$month',\n\t\t\tmonth1yCud                = '$month_1y',\n\t\t\tmonth3yCud                = '$month_3y',\n\t\t\tmonthSpot                 = '$month_spot',\n\t\t\tmonthSles                 = '$sles',\n\t\t\tmonthSlesSap              = '$slesSap',\n\t\t\tmonthSlesSap1yCud         = '$slesSap1y',\n\t\t\tmonthSlesSap3yCud         = '$slesSap3y',\n\t\t\tmonthRhel                 = '$rhel',\n\t\t\tmonthRhel1yCud            = '$rhel1y',\n\t\t\tmonthRhel3yCud            = '$rhel3y',\n\t\t\tmonthRhelSap              = '$rhelSap',\n\t\t\tmonthRhelSap1yCud         = '$rhelSap1y',\n\t\t\tmonthRhelSap3yCud         = '$rhelSap3y',\n\t\t\tmonthWindows              = '$windows'\n\t\tWHERE name LIKE '$machine' AND region LIKE '$region'\n\t\t~;\n\t\t$db->do($update) or die \"ERROR: Cannot update $DBI::errstr\\n\";\n\t}\n}\n\n\n###############################################################################\n# DISKS\n###############################################################################\nprint \"\\nDisks\\n\";\n\n# gcosts -> gcloud disk-types name mapping\nmy %storage_types = (\n\t'local'             => 'local-ssd',\n\t'balanced'          => 'pd-balanced',\n\t'extreme'           => 'pd-extreme',\n\t'ssd'               => 'pd-ssd',\n\t'hdd'               => 'pd-standard',\n\t'hdd'               => 'pd-standard',\n\t'hyperdisk-extreme' => 'hyperdisk-extreme',\n);\nforeach my $storage_type (keys %storage_types) {\n\tmy $disk_type = $storage_types{$storage_type};\n\tprint \"$storage_type [$disk_type]\\n\";\n\tforeach my $region (keys %{ $gcp->{'compute'}->{'storage'}->{$storage_type}->{'cost'} }) {\n\t\tprint \"\\t$region\\n\";\n\t\tmy $month = $gcp->{'compute'}->{'storage'}->{$storage_type}->{'cost'}->{$region}->{'month'};\n\t\tmy $update = \"UPDATE disks SET monthGb = '$month' WHERE name LIKE '$disk_type' AND region LIKE '$region'\";\n\t\t$db->do($update) or die \"ERROR: Cannot update $DBI::errstr\\n\";\n\t}\n}\n\n\n###############################################################################\n# LOCATION NAME\n###############################################################################\nprint \"\\nRegion Locations\\n\";\n\n# Update region location\nforeach my $region (keys %{ $gcp->{'region'} }) {\n\tmy $regionLocation = $gcp->{'region'}->{$region}->{'location'};\n\tprint \"$region : $regionLocation\\n\";\n\t$db->do(\"UPDATE instances SET regionLocation = '$regionLocation', regionLocationLong = '$regionLocation' WHERE region LIKE '$region'\") or die \"ERROR: Cannot update $DBI::errstr\\n\";\n\t$db->do(\"UPDATE disks SET regionLocation = '$regionLocation' WHERE region LIKE '$region'\") or die \"ERROR: Cannot update $DBI::errstr\\n\";\n}\n\n\n###############################################################################\n# TEST\n###############################################################################\nprint \"\\nTest\\n\";\n\n# Check regions without location\nmy $sth = $db->prepare(\"SELECT region FROM instances WHERE regionLocation LIKE '' GROUP BY region\");\n$sth->execute;\n$sth->bind_columns (\\my ($region));\nwhile ($sth->fetch) {\n\tprint \"WARNING: Location of region '$region' missing!\\n\";\n\tmy $deleteLocation = \"DELETE FROM instances WHERE region LIKE '$region'\";\n\t$db->do($deleteLocation) or die \"ERROR: Cannot delete instances in unknown location $DBI::errstr\\n\";\n}\n\n# Check disks without price\n$sth = $db->prepare(\"SELECT name, region FROM disks WHERE monthGb <= 0\");\n$sth->execute;\n$sth->bind_columns (\\my ($name, $region));\nwhile ($sth->fetch) {\n\tprint \"WARNING: Costs per month missing for disk type '$name' in region '$region'.\\n\";\n}\n\n# Chech instances without price\n$sth = $db->prepare(\"SELECT name, region FROM instances WHERE hour <= 0\");\n$sth->execute;\n$sth->bind_columns (\\my ($name, $region));\nwhile ($sth->fetch) {\n\tprint \"WARNING: Costs per hour missing for machine type '$name' in region '$region'.\\n\";\n\tmy $deleteInstance = \"DELETE FROM instances WHERE name LIKE '$name' AND region LIKE '$region'\";\n\t$db->do($deleteInstance) or die \"ERROR: Cannot delete instance without price $DBI::errstr\\n\";\n}\n\nprint \"DONE\\n\";\n"
  },
  {
    "path": "build/07_add.sh",
    "content": "#!/usr/bin/env bash\nset -e\n\n#\n# Add additional machine type and region informations\n#\n\nsource \"00_config.sh\"\n\nfor MY_SERIES in ../instances/series/*.sql; do\n\techo \"$MY_SERIES\"\n\tsqlite3 \"$DB\" < \"$MY_SERIES\"\ndone\n\necho \"Add carbon data across GCP regions\"\nsqlite3 \"$DB\" < ../regions/carbon.sql\n\necho \"Add long location name, latitude and longitude of GCP regions\"\nsqlite3 \"$DB\" < ../regions/regions.sql\n\necho \"Add extra data for GCP regions\"\nsqlite3 \"$DB\" < ../regions/extra.sql\n\necho \"Add country names of GCP regions\"\nsqlite3 \"$DB\" < ../regions/country.sql"
  },
  {
    "path": "build/08_cpu.pl",
    "content": "#!/usr/bin/env perl\n\n# Copyright 2022 Nils Knieling. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n#\n# Check available CPU platforms per instance in region and update machine type\n#\n\nuse utf8;\nbinmode(STDOUT, ':encoding(utf8)');\nuse strict;\nuse DBI;\nuse Data::Dumper;\n\nmy $db_file  = 'gce.db';\n\n# Open DB\nmy $db = DBI->connect(\"dbi:SQLite:dbname=$db_file\",\"\",\"\") or die \"ERROR: Cannot connect $DBI::errstr\\n\";\n\nprint \"\\nZones\\n\";\nmy $select_zones = \"SELECT name, availableCpuPlatforms FROM zones ORDER BY name\";\nmy $sth = $db->prepare($select_zones);\n$sth->execute;\n$sth->bind_columns ( \\my ($zone, $availableCpuPlatforms) );\nmy $cpuPlatforms = {}; # all CPU platforms\nmy $availableCpuPlatformsInRegion = {}; # available CPU platforms in region\nwhile ($sth->fetch) {\n\tprint \"$zone\\n\";\n\tmy @zone_parts = split(/-/, $zone);\n\tmy $location   = \"$zone_parts[0]\";\n\tmy $region     = \"$zone_parts[0]-$zone_parts[1]\";\n\t# Store CPU platform in Perl Hash reference\n\tforeach my $cpu (split(',', $availableCpuPlatforms)) {\n\t\t$availableCpuPlatformsInRegion->{\"$region\"}->{\"$cpu\"} = '1';\n\t\t$cpuPlatforms->{\"$cpu\"} = '1';\n\t}\n}\n\nprint \"\\nMachine types\\n\";\nmy $select_instances = \"SELECT name, region, cpuPlatform FROM instances\";\nmy $sth = $db->prepare($select_instances);\n$sth->execute;\n$sth->bind_columns ( \\my ($name, $region, $cpuPlatform) );\nmy %unknown_cpuPlatform = ();\nwhile ($sth->fetch) {\n\tprint \"$name, $region\\n\";\n\tmy @cpuPlatformsInRegion    = (); # available CPU platforms for machine type in the region, cross-checked with the available CPU platforms in the zones.\n\tmy @cpuPlatformsForInstance = (); # CPU platforms for machine type\n\tforeach my $instance_cpuPlatform (sort split(',', $cpuPlatform)) {\n\t\tprint \"\\t$instance_cpuPlatform\";\n\t\t# Check if the CPU platform of the instance is known\n\t\tmy $found = 0;\n\t\tforeach my $cpu (keys %{$cpuPlatforms}) {\n\t\t\tif ($cpu =~ m/$instance_cpuPlatform/i) {\n\t\t\t\t$found = '1';\n\t\t\t\tpush (@cpuPlatformsForInstance, $cpu); # Store longer name\n\t\t\t}\n\t\t}\n\t\tif ($found) {\n\t\t\tprint \" [found]\";\n\t\t\t# Check if CPU platform for this machine type is available in the region\n\t\t\tforeach my $cpu (keys %{$availableCpuPlatformsInRegion->{\"$region\"}}) {\n\t\t\t\tif ($cpu =~ m/$instance_cpuPlatform/i) {\n\t\t\t\t\tprint \" [available]\";\n\t\t\t\t\tpush (@cpuPlatformsInRegion, $cpu);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tprint \" [unknown]\";\n\t\t\t$unknown_cpuPlatform{\"$instance_cpuPlatform\"} = '1';\n\t\t}\n\t\tprint \"\\n\";\n\t}\n\t# CPU platform for machine type\n\tmy $update_cpuPlatformCount          = scalar @cpuPlatformsForInstance;\n\tmy $update_cpuPlatform               = join(', ', sort @cpuPlatformsForInstance);\n\t# CPU platform for machine type and available in region\n\tmy $update_availableCpuPlatformCount = scalar @cpuPlatformsInRegion;\n\tmy $update_availableCpuPlatform      = join(', ', sort @cpuPlatformsInRegion);\n\t# Set Intel and AMD\n\tmy $intel = '0';\n\t   $intel = '1' if ($update_availableCpuPlatform =~ m/intel/i );\n\tmy $amd   = '0';\n\t   $amd   = '1' if ($update_availableCpuPlatform =~ m/amd/i );\n\tmy $arm   = '0';\n\t   $arm   = '1' if ($update_availableCpuPlatform =~ m/ampere/i );\n\t   $arm   = '1' if ($update_availableCpuPlatform =~ m/axion/i );\n\tmy $update = qq ~\n\t\tUPDATE instances\n\t\tSET\n\t\t\tintel = '$intel',\n\t\t\tamd   = '$amd',\n\t\t\tarm   = '$arm',\n\t\t\tcpuPlatformCount          = '$update_cpuPlatformCount',          cpuPlatform          = '$update_cpuPlatform',\n\t\t\tavailableCpuPlatformCount = '$update_availableCpuPlatformCount', availableCpuPlatform = '$update_availableCpuPlatform'\n\t\tWHERE name LIKE '$name'\n\t\tAND region LIKE '$region'\n\t~;\n\t$db->do($update) or die \"ERROR: Cannot update available CPU platform for instance in region $DBI::errstr\\n\";\n}\n\nif (keys %unknown_cpuPlatform) {\n\tprint \"Unknown CPU platforms:\\n\";\n\tforeach my $cpu (keys %unknown_cpuPlatform) {\n\t\tprint \"\\t $cpu\\n\";\n\t}\n\tdie \"Please check and fix!\\n\";\n}\n\nprint \"\\nClean up unavailable CPU platforms\\n\";\nmy $select_not_available = \"SELECT name, region FROM instances WHERE availableCpuPlatformCount == '0'\";\nmy $sth = $db->prepare($select_not_available);\n$sth->execute;\n$sth->bind_columns ( \\my ($name, $region) );\nmy $unavailable = 0;\nwhile ($sth->fetch) {\n\tprint \"$name, $region\\n\";\n\t$unavailable++;\n}\n$db->do(\"DELETE FROM instances WHERE availableCpuPlatformCount == '0'\") or die \"ERROR: Cannot clean up unavailable CPU platforms $DBI::errstr\\n\";\nif ($unavailable) {\n\tprint \"Unavailable CPU platforms for machine type in region: $unavailable\\n\";\n}\n\nprint \"DONE\\n\";\n"
  },
  {
    "path": "build/08_publicipranges.pl",
    "content": "#!/usr/bin/env perl\n\n# Copyright 2022 Nils Knieling. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n#\n# Calculate public IP addresses\n# Thank you PatMyron: https://github.com/PatMyron/cloud/issues/11#issuecomment-922591282\n#\n\nuse utf8;\nbinmode(STDOUT, ':encoding(utf8)');\nuse strict;\nuse JSON::XS;\n\nopen(FH, \"publicipranges.json\") or die \"JSON file 'publicipranges.json' can't be opened\";\nmy $json = \"\";\nwhile(<FH>){\n\t$json .= $_;\n}\nclose(FH);\nmy $publicipranges = JSON::XS->new->utf8->decode($json);\n\nmy %regions;\nmy $total = \"0\";\nforeach my $prefix (sort @{$publicipranges->{'prefixes'}}) {\n\tmy $name = $prefix->{'scope'};\n\tif ($prefix->{'ipv4Prefix'} =~ /\\/(\\d+)$/) {\n\t\tmy $mask = $1;\n\t\tmy $ipv4 = 2**(32-$mask);\n\t\t$regions{$name} += $ipv4;\n\t\t$total += $ipv4;\n\t}\n}\n\nforeach my $region (sort keys %regions) {\n\tmy $ipv4 = $regions{$region} || \"0.0\";\n\tprint \"UPDATE instances SET regionPublicIpv4Addr = '$ipv4' WHERE region LIKE '$region';\\n\";\n}"
  },
  {
    "path": "build/08_publicipranges.sh",
    "content": "#!/usr/bin/env bash\nset -e\n\n#\n# Add number of public IP addresses for each GCP region\n#\n\nsource \"00_config.sh\"\n\necho \"Get public IP ranges\"\ncurl -o \"publicipranges.json\" \"https://www.gstatic.com/ipranges/cloud.json\"\n\necho \"Calculate public IP addresses\"\nperl \"08_publicipranges.pl\" > \"publicipaddresses.sql\"\n\necho \"Add number of public IP addresses for each GCP region\"\nsqlite3 \"$DB\" < \"publicipaddresses.sql\""
  },
  {
    "path": "build/09_more.sh",
    "content": "#!/usr/bin/env bash\nset -e\n\n#\n# Add more machine type informations\n#\n\nsource \"00_config.sh\"\n\necho \"Frequency (GHz)\"\nsqlite3 \"$DB\" < \"../instances/series/cpu/frequency.sql\"\n\necho \"EEMBC CoreMark Benchmark\"\nsqlite3 \"$DB\" < \"../instances/series/cpu/coremark.sql\"\n\necho \"GPU Type Names\"\nsqlite3 \"$DB\" < \"../instances/series/gpu/gpu_names.sql\"\n\necho \"SAP certified machine types\"\nsqlite3 \"$DB\" < \"../instances/series/sap/sap.sql\"\n\necho \"SAP HANA certified machine types\"\nsqlite3 \"$DB\" < \"../instances/series/sap/hana.sql\""
  },
  {
    "path": "build/10_export.sh",
    "content": "#!/usr/bin/env bash\nset -e\n\n#\n# Export CSV and SQL file\n#\n\nsource \"00_config.sh\"\n\necho \"» SQL Export\"\n{\n\techo 'DROP TABLE IF EXISTS \"instances\";'\n\tsqlite3 \"$DB\" '.dump instances'\n\techo 'DROP TABLE IF EXISTS \"disks\";'\n\tsqlite3 \"$DB\" '.dump disks'\n\techo 'DROP TABLE IF EXISTS \"images\";'\n\tsqlite3 \"$DB\" '.dump images'\n} > \"$SQL_EXPORT\"\ngzip -fk \"$SQL_EXPORT\"\n\necho \"» CSV Export\"\nsqlite3     \\\n\t-header \\\n\t-csv \"$DB\" \"SELECT * FROM instances ORDER BY region, name;\" > \"$CSV_EXPORT\"\n"
  },
  {
    "path": "build/11_test.sh",
    "content": "#!/usr/bin/env bash\nset -e\n\n#\n# Test\n#\n\nsource \"00_config.sh\"\n\n# Check TODOs\nif grep 'TODO' < \"$CSV_EXPORT\"; then\n\techo \"ERROR: There are still TODOs\"\n\texit 9\nfi\n\n# Check costs\n# n2-standard-8 in europe-west4 with SUD : 249\nif ! cat \"$CSV_EXPORT\" | grep 'n2-standard-8,' | grep 'europe-west4,' | head -n 1 | grep ',249' > /dev/null; then\n\techo \"ERROR: n2-standard-8 in europe-west4 with cost 249 not found\"\n\texit 9\nfi\n\necho \"DONE\""
  },
  {
    "path": "build/README.md",
    "content": "# Build\n\nReady to tweak and test this webapp locally?\nFollow these instructions:\n\n## Requirements\n\n* [Google Cloud CLI](https://cloud.google.com/sdk/docs/install) (`gcloud`)\n* SQLite3 (`sqlite3`)\n* Perl 5 (`perl`)\n* Perl modules:\n\t* [App::Options](https://metacpan.org/pod/App::Options)\n\t* [Encode](https://metacpan.org/pod/Encode)\n\t* [YAML::XS](https://metacpan.org/pod/YAML::XS) (and `libyaml`)\n\t* [JSON::XS](https://metacpan.org/pod/JSON::XS)\n\t* [DBD::CSV](https://metacpan.org/pod/DBD::CSV)\n\t* [DBD::SQLite](https://metacpan.org/pod/DBD::SQLite)\n\t* [Template::Toolkit](https://metacpan.org/pod/Template::Toolkit)\n\t* [plackup](https://metacpan.org/dist/Plack/view/script/plackup)\n\n<details>\n<summary><b>Debian/Ubuntu</b></summary>\n\nPackages:\n\n```shell\nsudo apt update\nsudo apt install \\\n\tlibapp-options-perl \\\n\tlibdbd-csv-perl \\\n\tlibdbd-sqlite3-perl \\\n\tlibencode-perl \\\n\tlibjson-xs-perl \\\n\tlibplack-perl \\\n\tlibtemplate-perl \\\n\tlibyaml-libyaml-perl \\\n\tsqlite3\n```\n\n[Google Cloud CLI](https://cloud.google.com/sdk/docs/install#deb):\n\n```shell\nsudo apt-get install apt-transport-https ca-certificates gnupg\n# Add the gcloud CLI distribution URI as a package source\necho \"deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt cloud-sdk main\" | sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list\n# Import the Google Cloud public key.\ncurl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo tee /usr/share/keyrings/cloud.google.gpg\n# Update and install the gcloud CLI\nsudo apt-get update\nsudo apt-get install google-cloud-cli\n```\n</details>\n\n<details>\n<summary><b>macOS</b></summary>\n\nHomebrew packages:\n\n```shell\nbrew install perl\nbrew install cpanminus pkg-config\nbrew install sqlite3\nbrew install --cask google-cloud-sdk\n```\n\nPerl modules:\n\n```shell\ncpanm --installdeps .\n```\n</details>\n\n## Database\n\nRun:\n\n```shell\nbash build.sh\n```\n\n1. Create SQLite3 database `gce.db` for GCE machine type informations\n1. Export all Google Compute Engine machine types ans zones via the Google Compute Engine API to CSV file `machinetypes.csv` and `zones.csv`\n1. Copy machine types ans zones from CSV file to SQLite database `gce.db` table `machinetypes` and `zones`\n1. Clean up (Remove disconnected data centers...)\n1. Copy machine types per region to database table `instances` and disk types per region to table `disks`\n1. Add costs for machine types in region from [pricing](https://github.com/Cyclenerd/google-cloud-pricing-cost-calculator)\n7. Add [additional machine type informations](../instances/series/)\n1. Add CPU platforms and IP addresses\n\t1. Add available CPU platforms per instance in region\n\t1. Add number of public IP addresses for each GCP region\n1. Add even more\n\t* Frequency (GHz)\n\t* EEMBC CoreMark Benchmark\n\t* SAP and HANA certified machine types\n1. Export CSV and SQL file\n1. Test\n\n## Websites\n\nCreate:\n\n```shell\nperl site.pl\n```\n\nNo regions and comparison:\n\n```shell\nperl site.pl \\\n  --comparison=0 \\\n  --region=0\n```\n\nOnly `g1-small` and `europe-west4`:\n\n```shell\nperl site.pl \\\n  --comparison=1 \\\n  --limit_comparison=g1-small \\\n  --region=1 \\\n  --limit_region=europe-west4\n```\n\nThis Perl script creates static websites (Templates are located in the [src](./src/) folder).\nThe websites are stored in the directory `../site/`.\n\nThe JavaScript grid library [AG Grid Community](https://www.ag-grid.com/) is used.\n\nRun:\n\n```bash\nplackup --host \"127.0.0.1\" --port \"8080\"\n```"
  },
  {
    "path": "build/app.psgi",
    "content": "#!/usr/bin/env perl\nuse strict;\nuse warnings;\nuse Plack::App::Directory;\nmy $app = Plack::App::Directory->new({\n\troot => \"../site/\"\n})->to_app;"
  },
  {
    "path": "build/build.sh",
    "content": "#!/usr/bin/env bash\nset -e\n\necho \"1. Create\"\nbash \"01_create_database.sh\"\n\necho \"2. Get\"\nbash \"02_get.sh\"\n\necho \"3. Copy\"\nperl \"03_copy.pl\"\n\necho \"4. Clean up\"\nbash \"04_clean_up.sh\"\n\necho \"5. Copy instances and disks\"\nperl \"05_copy_instances.pl\"\nperl \"05_copy_disks.pl\"\n\necho \"6. Add costs\"\nperl \"06_add_costs.pl\"\n\necho \"7. Add informations\"\nbash \"07_add.sh\"\n\necho \"8.1. Add available CPU platforms\"\nperl \"08_cpu.pl\"\n\necho \"8.2. Add number of public IP addresses\"\nbash \"08_publicipranges.sh\"\n\necho \"9. Add more\"\nbash \"09_more.sh\"\n\necho \"10. Export\"\nbash \"10_export.sh\"\n\necho \"11. Test\"\nbash \"11_test.sh\""
  },
  {
    "path": "build/cpanfile",
    "content": "# Check version with 'cpan -D DBD::SQLite'\nrecommends  'perl', '5.34';\nrequires 'App::Options', '1.12';\nrequires 'Encode', '3.16';\nrequires 'JSON::XS', '4.03';\nrequires 'YAML::XS', '0.83';\nrequires 'DBD::CSV', '0.58';\nrequires 'DBD::SQLite', '1.70';\nrequires 'Template::Toolkit', '3.1';\nrequires 'Plack', '1.0048';"
  },
  {
    "path": "build/site.pl",
    "content": "#!/usr/bin/env perl\n\n# Copyright 2022-2026 Nils Knieling. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n#\n# Create static website with all GCE machines in regions\n#\n\nuse utf8;\nbinmode(STDOUT, ':encoding(utf8)');\nuse strict;\nuse DBI;\nuse Encode qw(decode);\nuse JSON::XS;\nuse Template;\nuse File::Copy;\nuse App::Options (\n\toption => {\n\t\tregion => {\n\t\t\trequired    => '1',\n\t\t\tdefault     => '1',\n\t\t\tdescription => \"Create instance in region websites (/:REGION/:INSTANCE.html)\"\n\t\t},\n\t\tlimit_region => {\n\t\t\trequired    => '0',\n\t\t\tdefault     => '',\n\t\t\tdescription => \"Create websites only for this region\"\n\t\t},\n\t\tcomparison => {\n\t\t\trequired    => '1',\n\t\t\tdefault     => '1',\n\t\t\tdescription => \"Create instance comparison websites (/comparison/:INSTANCE/vs/:INSTANCE.html)\"\n\t\t},\n\t\tlimit_comparison => {\n\t\t\trequired    => '0',\n\t\t\tdefault     => '',\n\t\t\tdescription => \"Create comparison websites only for this machine type\"\n\t\t},\n\t\tsite_folder => {\n\t\t\trequired    => '0',\n\t\t\tdefault     => '../site/',\n\t\t\tdescription => \"Site storage folder path\"\n\t\t},\n\t},\n);\n\nmy $create_region     = $App::options{region};\nmy $limit_region      = $App::options{limit_region};\nmy $create_comparison = $App::options{comparison};\nmy $limit_comparison  = $App::options{limit_comparison};\nmy $site_folder       = $App::options{site_folder};\n\n# Ensure site_folder ends with a slash\n$site_folder .= '/' unless $site_folder =~ /\\/$/;\n\nmy $db_file  = 'gce.db';\n\nmy $gmtime = gmtime();\nmy $timestamp = time();\n\n# Exports\nmy $csv_export = 'machine-types-regions.csv';\nmy $sql_export = 'machine-types-regions.sql.gz';\nmy $filesize_csv_export = -s \"$csv_export\" || die \"ERROR: Cannot get CSV '$csv_export' filesize!\\n\";\nmy $filesize_sql_export = -s \"$sql_export\" || die \"ERROR: Cannot get SQL '$sql_export' filesize!\\n\";\n# MiB\n$filesize_csv_export = sprintf '%.2f', $filesize_csv_export / 1048576;\n$filesize_sql_export = sprintf '%.2f', $filesize_sql_export / 1048576;\n\nprint \"Create websites...\\n\";\n\nmy $dbh = DBI->connect(\"dbi:SQLite:dbname=$db_file\",\"\",\"\") or die \"ERROR: Cannot connect $DBI::errstr\\n\";\n\nmy $template = Template->new(\n\tINCLUDE_PATH => './src',\n\tPRE_PROCESS  => 'config.tt2',\n\tVARIABLES => {\n\t\t'gmtime'    => $gmtime,\n\t\t'timestamp' => $timestamp,\n\t}\n);\nmy @files = ();\n\n\n###############################################################################\n# INSTANCES\n###############################################################################\n\nmy $sql_instances = qq ~\nSELECT\n\tUPPER(series) AS series, name, description, family,\n\tvCpus, LOWER(sharedCpu) AS sharedCpu,\n\tMAX(intel) AS intel,\n\tMAX(amd) AS amd,\n\tMAX(arm) AS arm,\n\tMAX(cpuPlatformCount) AS cpuPlatformCount,\n\t(SELECT cpuPlatform FROM instances WHERE name = I.name ORDER BY cpuPlatformCount) AS cpuPlatform,\n\tMAX(cpuBaseClock) AS cpuBaseClock, MAX(cpuTurboClock) AS cpuTurboClock, MAX(cpuSingleMaxTurboClock) AS cpuSingleMaxTurboClock,\n\tMAX(coremarkScore) AS coremarkScore, MAX(standardDeviation) AS standardDeviation, MAX(sampleCount) AS sampleCount,\n\tmemoryGB,\n\tbandwidth, tier1,\n\tdisks, disksSizeGb/1024 AS diskSizeTiB, localSsd,\n\tacceleratorCount, acceleratorType,\n\tMAX(sap) AS sap, MAX(saps) AS saps, MAX(hana) AS hana,\n\tMAX(spot) AS spot,\n\tCOUNT(region) AS regionCount,\n\t(SELECT GROUP_CONCAT(region) FROM instances WHERE name = I.name ORDER BY region) AS regions,\n\tMAX(sud) AS sud,\n\tROUND(MIN(hour), 4)                      AS minHour,                      ROUND(AVG(hour), 4)                      AS avgHour,                      ROUND(MAX(hour), 4)                      AS maxHour,\n\tROUND(MIN(hourSpot), 4)                  AS minHourSpot,                  ROUND(AVG(hourSpot), 4)                  AS avgHourSpot,                  ROUND(MAX(hourSpot), 4)                  AS maxHourSpot,\n\tROUND(MIN(month), 2)                     AS minMonth,                     ROUND(AVG(month), 2)                     AS avgMonth,                     ROUND(MAX(month), 2)                     AS maxMonth,\n\tROUND(MIN(month1yCud), 2)                AS minMonth1yCud,                ROUND(AVG(month1yCud), 2)                AS avgMonth1yCud,                ROUND(MAX(month1yCud), 2)                AS maxMonth1yCud,\n\tROUND(MIN(month3yCud), 2)                AS minMonth3yCud,                ROUND(AVG(month3yCud), 2)                AS avgMonth3yCud,                ROUND(MAX(month3yCud), 2)                AS maxMonth3yCud,\n\tROUND(MIN(monthSpot), 2)                 AS minMonthSpot,                 ROUND(AVG(monthSpot), 2)                 AS avgMonthSpot,                 ROUND(MAX(monthSpot), 2)                 AS maxMonthSpot,\n\tROUND(monthSles, 2)         AS monthSles,\n\tROUND(monthSlesSap, 2)      AS monthSlesSap,\n\tROUND(monthSlesSap1yCud, 2) AS monthSlesSap1yCud,\n\tROUND(monthSlesSap3yCud, 2) AS monthSlesSap3yCud,\n\tROUND(monthRhel, 2)         AS monthRhel,\n\tROUND(monthRhel1yCud, 2)    AS monthRhel1yCud,\n\tROUND(monthRhel3yCud, 2)    AS monthRhel3yCud,\n\tROUND(monthRhelSap, 2)      AS monthRhelSap,\n\tROUND(monthRhelSap1yCud, 2) AS monthRhelSap1yCud,\n\tROUND(monthRhelSap3yCud, 2) AS monthRhelSap3yCud,\n\tROUND(monthWindows, 2)      AS monthWindows\nFROM instances I\nGROUP BY name\nORDER BY vCpus, name;\n~;\nmy $sth = $dbh->prepare($sql_instances);\n$sth->execute();\nmy @instances = ();\nmy $id = '1';\nwhile (my $instance = $sth->fetchrow_hashref) {\n\t$instance->{'id'} = $id;\n\tpush(@instances, $instance);\n\t$id++;\n}\n$sth->finish;\npush(@files, 'instances.html');\n$template->process('instances.tt2', { 'instances' => \\@instances }, \"${site_folder}instances.html\") || die \"Template process failed: \", $template->error(), \"\\n\";\n\n# CPU\npush(@files, 'intel.html');\n$template->process('intel.tt2', { 'instances' => \\@instances }, \"${site_folder}intel.html\") || die \"Template process failed: \", $template->error(), \"\\n\";\npush(@files, 'amd.html');\n$template->process('amd.tt2', { 'instances' => \\@instances }, \"${site_folder}amd.html\") || die \"Template process failed: \", $template->error(), \"\\n\";\npush(@files, 'arm.html');\n$template->process('arm.tt2', { 'instances' => \\@instances }, \"${site_folder}arm.html\") || die \"Template process failed: \", $template->error(), \"\\n\";\npush(@files, 'gpu.html');\n$template->process('gpu.tt2', { 'instances' => \\@instances }, \"${site_folder}gpu.html\") || die \"Template process failed: \", $template->error(), \"\\n\";\n# SAP\npush(@files, 'sap.html');\n$template->process('sap.tt2', { 'instances' => \\@instances }, \"${site_folder}sap.html\") || die \"Template process failed: \", $template->error(), \"\\n\";\npush(@files, 'hana.html');\n$template->process('hana.tt2', { 'instances' => \\@instances }, \"${site_folder}hana.html\") || die \"Template process failed: \", $template->error(), \"\\n\";\n\n###############################################################################\n# DISKS\n###############################################################################\n\nmy $sql_disks = qq ~\nSELECT\n\tname,\n\tdescription,\n\tCOUNT(region) AS regionCount,\n\tROUND(MIN(monthGb), 2) AS minMonth,\n\tROUND(AVG(monthGb), 2) AS avgMonth,\n\tROUND(MAX(monthGb), 2) AS maxMonth\nFROM disks D\nGROUP BY name\nORDER BY name;\n~;\n$sth = $dbh->prepare($sql_disks);\n$sth->execute();\nmy @disks = ();\n$id = '1';\nwhile (my $disk = $sth->fetchrow_hashref) {\n\t$disk->{'id'} = $id;\n\tpush(@disks, $disk);\n\t$id++;\n}\n$sth->finish;\npush(@files, 'disks.html');\n$template->process('disks.tt2', { 'disks' => \\@disks }, \"${site_folder}disks.html\") || die \"Template process failed: \", $template->error(), \"\\n\";\n$template->process('disks.js', {}, \"${site_folder}disks.js\") || die \"Template process failed: \", $template->error(), \"\\n\";\n\n\n###############################################################################\n# DISKS in REGIONS\n###############################################################################\n\nmy $sql_disks_regions = qq ~\nSELECT\n\tregion          AS name,\n\tregionLocation  AS regionLocation,\n\tMAX(zoneCount)  AS zoneCount,\n\t(SELECT ROUND(MAX(monthGb), 3) FROM disks WHERE region = D.region AND name = \"local-ssd\")   AS local,\n\t(SELECT ROUND(MAX(monthGb), 3) FROM disks WHERE region = D.region AND name = \"pd-balanced\") AS balanced,\n\t(SELECT ROUND(MAX(monthGb), 3) FROM disks WHERE region = D.region AND name = \"pd-extreme\")  AS extreme,\n\t(SELECT ROUND(MAX(monthGb), 3) FROM disks WHERE region = D.region AND name = \"pd-ssd\")      AS ssd,\n\t(SELECT ROUND(MAX(monthGb), 3) FROM disks WHERE region = D.region AND name = \"pd-standard\") AS standard\nFROM disks D\nGROUP BY region\nORDER BY region;\n~;\n$sth = $dbh->prepare($sql_disks_regions);\n$sth->execute();\nmy @disks_regions = ();\nwhile (my $region = $sth->fetchrow_hashref) {\n\tpush(@disks_regions, $region);\n}\n$sth->finish;\n# Regions\npush(@files, 'diskpricing.html');\n$template->process('diskpricing.tt2', { 'disks_regions' => \\@disks_regions }, \"${site_folder}diskpricing.html\") || die \"Template process failed: \", $template->error(), \"\\n\";\n\n\n###############################################################################\n# REGIONS\n###############################################################################\n\nmy $sql_regions = qq ~\nSELECT\n\tregion                    AS name,\n\tregionLocation            AS regionLocation,\n\tregionLocationLong        AS regionLocationLong,\n\tregionLocationCountryCode AS regionLocationCountryCode,\n\tregionCfe                 AS regionCfe,\n\tregionCo2Kwh              AS regionCo2Kwh,\n\tregionLowCo2              AS regionLowCo2,\n\tregionLat                 AS regionLat,\n\tregionLng                 AS regionLng,\n\tMAX(regionPublicIpv4Addr) AS regionPublicIpv4Addr,\n\tMAX(zoneCount)            AS zoneCount,\n\t(SELECT COUNT(name) FROM instances WHERE region = I.region AND availableCpuPlatform LIKE \"%Haswell%\")      AS intelHaswell,\n\t(SELECT COUNT(name) FROM instances WHERE region = I.region AND availableCpuPlatform LIKE \"%Broadwell%\")    AS intelBroadwell,\n\t(SELECT COUNT(name) FROM instances WHERE region = I.region AND availableCpuPlatform LIKE \"%Skylake%\")      AS intelSkylake,\n\t(SELECT COUNT(name) FROM instances WHERE region = I.region AND availableCpuPlatform LIKE \"%Cascade Lake%\") AS intelCascadeLake,\n\t(SELECT COUNT(name) FROM instances WHERE region = I.region AND availableCpuPlatform LIKE \"%Ice Lake%\")     AS intelIceLake,\n\t(SELECT COUNT(name) FROM instances WHERE region = I.region AND availableCpuPlatform LIKE \"%Sapphire%\")     AS intelSapphireRapids,\n\t(SELECT COUNT(name) FROM instances WHERE region = I.region AND availableCpuPlatform LIKE \"%Emerald%\")      AS intelEmeraldRapids,\n\t(SELECT COUNT(name) FROM instances WHERE region = I.region AND availableCpuPlatform LIKE \"%Granite%\")      AS intelGraniteRapids,\n\t(SELECT COUNT(name) FROM instances WHERE region = I.region AND availableCpuPlatform LIKE \"%Rome%\")         AS amdRome,\n\t(SELECT COUNT(name) FROM instances WHERE region = I.region AND availableCpuPlatform LIKE \"%Milan%\")        AS amdMilan,\n\t(SELECT COUNT(name) FROM instances WHERE region = I.region AND availableCpuPlatform LIKE \"%Genoa%\")        AS amdGenoa,\n\t(SELECT COUNT(name) FROM instances WHERE region = I.region AND availableCpuPlatform LIKE \"%Turin%\")        AS amdTurin,\n\t(SELECT COUNT(name) FROM instances WHERE region = I.region AND availableCpuPlatform LIKE \"%Altra%\")        AS armAmpereAltra,\n\t(SELECT COUNT(name) FROM instances WHERE region = I.region AND availableCpuPlatform LIKE \"%Axion%\")        AS armGoogleAxion,\n\t(SELECT COUNT(name) FROM instances WHERE region = I.region AND family LIKE \"%General%\")     AS generalCount,\n\t(SELECT COUNT(name) FROM instances WHERE region = I.region AND family LIKE \"%Compute%\")     AS computeCount,\n\t(SELECT COUNT(name) FROM instances WHERE region = I.region AND family LIKE \"%Memory%\")      AS memoryCount,\n\t(SELECT COUNT(name) FROM instances WHERE region = I.region AND family LIKE \"%Accelerator%\") AS acceleratorCount,\n\t(SELECT COUNT(name) FROM instances WHERE region = I.region AND family LIKE \"%Storage%\")     AS storageCount,\n\t(SELECT COUNT(name) FROM instances WHERE region = I.region AND sap >= 1) AS sap,\n\t(SELECT COUNT(name) FROM instances WHERE region = I.region AND hana >= 1) AS hana,\n\t(SELECT ROUND(MIN(hour), 4)  FROM instances WHERE region = I.region AND name LIKE \"e2-standard-8\") AS e2Standard8Hour,\n\t(SELECT ROUND(MIN(month), 2) FROM instances WHERE region = I.region AND name LIKE \"e2-standard-8\") AS e2Standard8Month\nFROM instances I\nGROUP BY region\nORDER BY region;\n~;\n$sth = $dbh->prepare($sql_regions);\n$sth->execute();\nmy @regions = ();\n$id = '1';\nwhile (my $region = $sth->fetchrow_hashref) {\n\t$region->{'id'} = $id;\n\tpush(@regions, $region);\n\t$id++;\n}\n$sth->finish;\n# Regions\npush(@files, 'regions.html');\n$template->process('regions.tt2', { 'regions' => \\@regions }, \"${site_folder}regions.html\") || die \"Template process failed: \", $template->error(), \"\\n\";\n# Map with regions\npush(@files, 'map.html');\n$template->process('map.tt2', { 'regions' => \\@regions }, \"${site_folder}map.html\") || die \"Template process failed: \", $template->error(), \"\\n\";\n# CPU platforms in regions\npush(@files, 'platforms.html');\n$template->process('platforms.tt2', { 'regions' => \\@regions }, \"${site_folder}platforms.html\") || die \"Template process failed: \", $template->error(), \"\\n\";\n\n\n###############################################################################\n# REGION\n###############################################################################\n\n# Instances in Region\nforeach my $region (@regions) {\n\tmy $name = $region->{'name'} || 'missing';\n\t# Instances\n\tmy $sql_instances_in_region = qq ~\n\t\tSELECT\n\t\t\tUPPER(series) AS series, name, description, family,\n\t\t\tvCpus, LOWER(sharedCpu) AS sharedCpu, \n\t\t\tintel, amd, arm, availableCpuPlatformCount, cpuPlatformCount,\n\t\t\tcpuBaseClock, cpuTurboClock, cpuSingleMaxTurboClock,\n\t\t\tmemoryGB,\n\t\t\tsap, saps, hana,\n\t\t\tzoneCount,\n\t\t\tsud,\n\t\t\tROUND(hour, 4)              AS hour,\n\t\t\tROUND(hourSpot, 4)          AS hourSpot,\n\t\t\tROUND(month, 2)             AS month,\n\t\t\tROUND(month1yCud, 2)        AS month1yCud,\n\t\t\tROUND(month3yCud, 2)        AS month3yCud,\n\t\t\tROUND(monthSpot, 2)         AS monthSpot,\n\t\t\tROUND(monthSles, 2)         AS monthSles,\n\t\t\tROUND(monthSlesSap, 2)      AS monthSlesSap,\n\t\t\tROUND(monthSlesSap1yCud, 2) AS monthSlesSap1yCud,\n\t\t\tROUND(monthSlesSap3yCud, 2) AS monthSlesSap3yCud,\n\t\t\tROUND(monthRhel, 2)         AS monthRhel,\n\t\t\tROUND(monthRhel1yCud, 2)    AS monthRhel1yCud,\n\t\t\tROUND(monthRhel3yCud, 2)    AS monthRhel3yCud,\n\t\t\tROUND(monthRhelSap, 2)      AS monthRhelSap,\n\t\t\tROUND(monthRhelSap1yCud, 2) AS monthRhelSap1yCud,\n\t\t\tROUND(monthRhelSap3yCud, 2) AS monthRhelSap3yCud,\n\t\t\tROUND(monthWindows, 2)      AS monthWindows\n\t\tFROM instances\n\t\tWHERE region LIKE '$name'\n\t\tORDER BY vCpus, name;\n\t~;\n\t$sth = $dbh->prepare($sql_instances_in_region);\n\t$sth->execute();\n\tmy @instances_in_region = ();\n\t$id = '1';\n\twhile (my $instance = $sth->fetchrow_hashref) {\n\t\t$instance->{'id'} = $id;\n\t\tpush(@instances_in_region, $instance);\n\t\t$id++;\n\t}\n\t# Disks\n\tmy $sql_disks_in_region = qq ~\n\t\tSELECT\n\t\t\tname,\n\t\t\tdescription,\n\t\t\tzoneCount,\n\t\t\tmonthGb\n\t\tFROM disks\n\t\tWHERE region LIKE '$name'\n\t\tORDER BY name;\n\t~;\n\t$sth = $dbh->prepare($sql_disks_in_region);\n\t$sth->execute();\n\tmy @disks_in_region = ();\n\t$id = '1';\n\twhile (my $disk = $sth->fetchrow_hashref) {\n\t\t$disk->{'id'} = $id;\n\t\tpush(@disks_in_region, $disk);\n\t\t$id++;\n\t}\n\tmy $html_file = \"${site_folder}$name.html\";\n\tprint \"$html_file\\n\";\n\tpush(@files, \"$name\".'.html');\n\t$template->process('region.tt2', {\n\t\t'region'              => $region,\n\t\t'regions'             => \\@regions,\n\t\t'instances'           => \\@instances,\n\t\t'disks_in_region'     => \\@disks_in_region,\n\t\t'instances_in_region' => \\@instances_in_region\n\t}, \"$html_file\") || die \"Template process failed: \", $template->error(), \"\\n\";\n}\n\n\n###############################################################################\n# INSTANCE\n###############################################################################\n\n# Instance in Regions\nforeach my $instance (@instances) {\n\tmy $name = $instance->{'name'} || 'missing';\n\tmy $sql_instance_regions = qq ~\n\t\tSELECT\n\t\t\tregion                      AS name,\n\t\t\tregionLocation              AS regionLocation,\n\t\t\tregionCfe                   AS regionCfe,\n\t\t\tregionCo2Kwh                AS regionCo2Kwh,\n\t\t\tregionLowCo2                AS regionLowCo2,\n\t\t\tzoneCount                   AS zoneCount,\n\t\t\tavailableCpuPlatformCount   AS availableCpuPlatformCount,\n\t\t\tROUND(hour, 4)              AS hour,\n\t\t\tROUND(hourSpot, 4)          AS hourSpot,\n\t\t\tROUND(month, 2)             AS month,\n\t\t\tROUND(month1yCud, 2)        AS month1yCud,\n\t\t\tROUND(month3yCud, 2)        AS month3yCud,\n\t\t\tROUND(monthSpot, 2)         AS monthSpot,\n\t\t\tROUND(monthSles, 2)         AS monthSles,\n\t\t\tROUND(monthSlesSap, 2)      AS monthSlesSap,\n\t\t\tROUND(monthSlesSap1yCud, 2) AS monthSlesSap1yCud,\n\t\t\tROUND(monthSlesSap3yCud, 2) AS monthSlesSap3yCud,\n\t\t\tROUND(monthRhel, 2)         AS monthRhel,\n\t\t\tROUND(monthRhel1yCud, 2)    AS monthRhel1yCud,\n\t\t\tROUND(monthRhel3yCud, 2)    AS monthRhel3yCud,\n\t\t\tROUND(monthRhelSap, 2)      AS monthRhelSap,\n\t\t\tROUND(monthRhelSap1yCud, 2) AS monthRhelSap1yCud,\n\t\t\tROUND(monthRhelSap3yCud, 2) AS monthRhelSap3yCud,\n\t\t\tROUND(monthWindows, 2)      AS monthWindows\n\t\tFROM instances\n\t\tWHERE name LIKE '$name'\n\t\tORDER BY hour, region;\n\t~;\n\t$sth = $dbh->prepare($sql_instance_regions);\n\t$sth->execute();\n\tmy @instance_regions = ();\n\t$id = '1';\n\twhile (my $region = $sth->fetchrow_hashref) {\n\t\t$region->{'id'} = $id;\n\t\tpush(@instance_regions, $region);\n\t\t$id++;\n\t}\n\t$sth->finish;\n\tmy $html_file = \"${site_folder}$name.html\";\n\tprint \"$html_file\\n\";\n\tpush(@files, \"$name\".'.html');\n\t$template->process('instance.tt2', {\n\t\t'instance'  => $instance,\n\t\t'instances' => \\@instances,\n\t\t'regions'   => \\@instance_regions\n\t}, \"$html_file\") || die \"Template process failed: \", $template->error(), \"\\n\";\n}\n\n\n###############################################################################\n# DISK\n###############################################################################\n\n# Disk in Regions\nforeach my $disk (@disks) {\n\tmy $name = $disk->{'name'} || 'missing';\n\tmy $sql_disk_regions = qq ~\n\t\tSELECT\n\t\t\tregion         AS name,\n\t\t\tregionLocation AS regionLocation,\n\t\t\tzoneCount      AS zoneCount,\n\t\t\tmonthGb\n\t\tFROM disks\n\t\tWHERE name LIKE '$name'\n\t\tORDER BY monthGb, region;\n\t~;\n\t$sth = $dbh->prepare($sql_disk_regions);\n\t$sth->execute();\n\tmy @disk_regions = ();\n\t$id = '1';\n\twhile (my $region = $sth->fetchrow_hashref) {\n\t\t$region->{'id'} = $id;\n\t\tpush(@disk_regions, $region);\n\t\t$id++;\n\t}\n\t$sth->finish;\n\tmy $html_file = \"${site_folder}$name.html\";\n\tprint \"$html_file\\n\";\n\tpush(@files, \"$name\".'.html');\n\t$template->process('disk.tt2', {\n\t\t'disk'    => $disk,\n\t\t'regions' => \\@disk_regions\n\t}, \"$html_file\") || die \"Template process failed: \", $template->error(), \"\\n\";\n}\n\n###############################################################################\n# INSTANCE in REGION\n###############################################################################\n\n# Zones\nmy $sql_zones = \"SELECT name, availableCpuPlatforms FROM zones ORDER BY name\";\n$sth = $dbh->prepare($sql_zones);\n$sth->execute();\nmy @zones = ();\n$id = '1';\nwhile (my $zone = $sth->fetchrow_hashref) {\n\t$zone->{'id'} = $id;\n\tpush(@zones, $zone);\n\t$id++;\n}\n$sth->finish;\n\n# Instance in Region\nmy $sql_instance_in_region = qq ~\nSELECT\n\tUPPER(series) AS series, name, description, family,\n\tvCpus, LOWER(sharedCpu) AS sharedCpu,\n\tcpuPlatform, cpuPlatformCount,\n\tintel, amd, arm, availableCpuPlatform, availableCpuPlatformCount,\n\t(cpuPlatformCount - availableCpuPlatformCount) AS notAvailableCpuPlatformCount,\n\tcpuBaseClock, cpuTurboClock, cpuSingleMaxTurboClock,\n\tROUND(coremarkScore, 0) AS coremarkScore,\n\tROUND(standardDeviation, 0) AS standardDeviation,\n\tROUND(sampleCount, 0) AS sampleCount,\n\tmemoryGB,\n\tbandwidth, tier1,\n\tdisks, disksSizeGb/1024 AS diskSizeTiB, localSsd,\n\tROUND(acceleratorCount, 0) AS acceleratorCount,\n\tacceleratorType,\n\tsap, saps, hana,\n\tspot,\n\tregion, regionLocation, regionLocationLong, regionLocationCountryCode, regionCfe, regionCo2Kwh, regionLowCo2, regionLat, regionLng,\n\tzoneCount, zones,\n\tsud,\n\tROUND(hour, 4)                      AS hour,\n\tROUND(hourSpot, 4)                  AS hourSpot,\n\tROUND(month, 2)                     AS month,\n\tROUND(month1yCud, 2)                AS month1yCud,\n\tROUND(month3yCud, 2)                AS month3yCud,\n\tROUND(monthSpot, 2)                 AS monthSpot,\n\tROUND(monthSles, 2)                 AS monthSles,\n\tROUND(monthSlesSap, 2)              AS monthSlesSap,\n\tROUND(monthSlesSap1yCud, 2)         AS monthSlesSap1yCud,\n\tROUND(monthSlesSap3yCud, 2)         AS monthSlesSap3yCud,\n\tROUND(monthRhel, 2)                 AS monthRhel,\n\tROUND(monthRhel1yCud, 2)            AS monthRhel1yCud,\n\tROUND(monthRhel3yCud, 2)            AS monthRhel3yCud,\n\tROUND(monthRhelSap, 2)              AS monthRhelSap,\n\tROUND(monthRhelSap1yCud, 2)         AS monthRhelSap1yCud,\n\tROUND(monthRhelSap3yCud, 2)         AS monthRhelSap3yCud,\n\tROUND(monthWindows, 2)              AS monthWindows,\n\tROUND(coremarkScore/hour, 0)        AS coremarkHour,\n\tROUND(coremarkScore/hourSpot, 0)    AS coremarkHourSpot,\n\tROUND(saps/hour, 0)                 AS sapsHour\nFROM instances\nORDER BY name, region;\n~;\nmy $sth = $dbh->prepare($sql_instance_in_region);\n$sth->execute();\nmy @instances_in_regions = ();\nmy $id = '1';\nwhile (my $instance = $sth->fetchrow_hashref) {\n\tmy $name   = $instance->{'name'}   || 'missing';\n\tmy $region = $instance->{'region'} || 'missing';\n\tnext if ($limit_region && $limit_region ne \"$region\"); # skip region if limit is set\n\t$instance->{'id'} = $id;\n\tpush(@instances_in_regions, $instance);\n\tif ($create_region) {\n\t\tmy $html_file = \"${site_folder}$region/$name.html\";\n\t\tprint \"$id : $html_file\\n\";\n\t\t$template->process('instance_in_region.tt2', {\n\t\t\t'instance' => $instance,\n\t\t\t'regions'  => \\@regions,\n\t\t\t'zones'    => \\@zones,\n\t\t}, \"$html_file\") || die \"Template process failed: \", $template->error(), \"\\n\";\n\t}\n\t$id++;\n}\n$sth->finish;\n\n\n###############################################################################\n# COMPARISON\n###############################################################################\n\nif ($create_comparison) {\n\tmy $id = '1';\n\tforeach my $instance_a (@instances) {\n\t\tmy $name_a = $instance_a->{'name'} || 'missing';\n\t\tnext if ($limit_comparison && $name_a ne \"$limit_comparison\");\n\t\t$template->process('vs.tt2', {\n\t\t\t'instance_a' => $instance_a,\n\t\t\t'instances'  => \\@instances\n\t\t}, \"${site_folder}comparison/$name_a/vs.html\") || die \"Template process failed: \", $template->error(), \"\\n\";\n\t\tforeach my $instance_b (@instances) {\n\t\t\tmy $name_b = $instance_b->{'name'} || 'missing';\n\t\t\tnext if ($name_a eq $name_b);\n\t\t\t# Costs in regions for instance A\n\t\t\tmy $sql_regions_for_a = qq ~\n\t\t\t\tSELECT\n\t\t\t\t\tregion                    AS region,\n\t\t\t\t\tregionLocation            AS regionLocation,\n\t\t\t\t\tregionCfe                 AS regionCfe,\n\t\t\t\t\tregionCo2Kwh              AS regionCo2Kwh,\n\t\t\t\t\tregionLowCo2              AS regionLowCo2,\n\t\t\t\t\tzoneCount                 AS zoneCount,\n\t\t\t\t\tavailableCpuPlatformCount AS availableCpuPlatformCount,\n\t\t\t\t\tROUND(hour, 4)            AS hour,\n\t\t\t\t\tROUND(hourSpot, 4)        AS hourSpot,\n\t\t\t\t\tROUND(month, 2)           AS month,\n\t\t\t\t\tROUND(month1yCud, 2)      AS month1yCud,\n\t\t\t\t\tROUND(month3yCud, 2)      AS month3yCud,\n\t\t\t\t\tROUND(monthSpot, 2)       AS monthSpot\n\t\t\t\tFROM instances\n\t\t\t\tWHERE name LIKE '$name_a'\n\t\t\t\tORDER BY region;\n\t\t\t~;\n\t\t\t$sth = $dbh->prepare($sql_regions_for_a);\n\t\t\t$sth->execute();\n\t\t\tmy @regions_a = ();\n\t\t\twhile (my $region = $sth->fetchrow_hashref) {\n\t\t\t\tpush(@regions_a, $region);\n\t\t\t}\n\t\t\t$sth->finish;\n\t\t\t# Costs in regions for instance B\n\t\t\tmy $sql_regions_for_b = qq ~\n\t\t\t\tSELECT\n\t\t\t\t\tregion                    AS region,\n\t\t\t\t\tregionLocation            AS regionLocation,\n\t\t\t\t\tregionCfe                 AS regionCfe,\n\t\t\t\t\tregionCo2Kwh              AS regionCo2Kwh,\n\t\t\t\t\tregionLowCo2              AS regionLowCo2,\n\t\t\t\t\tzoneCount                 AS zoneCount,\n\t\t\t\t\tavailableCpuPlatformCount AS availableCpuPlatformCount,\n\t\t\t\t\tROUND(hour, 4)            AS hour,\n\t\t\t\t\tROUND(hourSpot, 4)        AS hourSpot,\n\t\t\t\t\tROUND(month, 2)           AS month,\n\t\t\t\t\tROUND(month1yCud, 2)      AS month1yCud,\n\t\t\t\t\tROUND(month3yCud, 2)      AS month3yCud,\n\t\t\t\t\tROUND(monthSpot, 2)       AS monthSpot\n\t\t\t\tFROM instances\n\t\t\t\tWHERE name LIKE '$name_b'\n\t\t\t\tORDER BY region;\n\t\t\t~;\n\t\t\t$sth = $dbh->prepare($sql_regions_for_b);\n\t\t\t$sth->execute();\n\t\t\tmy @regions_b = ();\n\t\t\twhile (my $region = $sth->fetchrow_hashref) {\n\t\t\t\tpush(@regions_b, $region);\n\t\t\t}\n\t\t\t$sth->finish;\n\t\t\tmy $html_file = \"${site_folder}comparison/$name_a/vs/$name_b.html\";\n\t\t\tprint \"$id : $html_file\\n\";\n\t\t\t$template->process('comparison.tt2', {\n\t\t\t\t'instances'  => \\@instances,\n\t\t\t\t'instance_a' => $instance_a,\n\t\t\t\t'instance_b' => $instance_b,\n\t\t\t\t'regions'    => \\@regions,\n\t\t\t\t'regions_a'  => \\@regions_a,\n\t\t\t\t'regions_b'  => \\@regions_b,\n\t\t\t}, \"$html_file\") || die \"Template process failed: \", $template->error(), \"\\n\";\n\t\t\t$id++;\n\t\t}\n\t}\n}\n\n\n###############################################################################\n# IMAGES\n###############################################################################\n\n# Operating system details: https://cloud.google.com/compute/docs/images/os-details\n\n$sth = $dbh->prepare(\"SELECT project AS name, COUNT(name) as imageCount FROM images GROUP BY project ORDER BY project ASC\");\n$sth->execute();\nmy @image_projects = ();\nwhile (my $image_project = $sth->fetchrow_hashref) {\n\tpush(@image_projects, $image_project);\n}\n$sth->finish;\n\nmy $sql_image_family = qq ~\nSELECT\n\tproject,\n\tfamily AS name,\n\t(SELECT name            FROM images WHERE project LIKE I.project AND family LIKE I.family ORDER BY creation DESC LIMIT 1) AS image,\n\t(SELECT architecture    FROM images WHERE project LIKE I.project AND family LIKE I.family ORDER BY creation DESC LIMIT 1) AS architecture,\n\t(SELECT description     FROM images WHERE project LIKE I.project AND family LIKE I.family ORDER BY creation DESC LIMIT 1) AS description,\n\t(SELECT MAX(diskSizeGb) FROM images WHERE project LIKE I.project AND family LIKE I.family ORDER BY creation DESC LIMIT 1) AS diskSizeGb,\n\t(SELECT creation        FROM images WHERE project LIKE I.project AND family LIKE I.family ORDER BY creation DESC LIMIT 1) AS creation\nFROM images I\nGROUP BY project, family\nORDER BY family DESC;\n~;\n$sth = $dbh->prepare($sql_image_family);\n$sth->execute();\nmy @image_families = ();\nwhile (my $image_family = $sth->fetchrow_hashref) {\n\tpush(@image_families, $image_family);\n}\n$sth->finish;\n\npush(@files, 'images.html');\n$template->process('images.tt2', {\n\t'image_projects' => \\@image_projects,\n\t'image_famlies'  => \\@image_families\n}, \"${site_folder}images.html\") || die \"Template process failed: \", $template->error(), \"\\n\";\n\n\n###############################################################################\n# MISC\n###############################################################################\n\n# Index\n$template->process('index.tt2', {\n\t'instances'            => \\@instances,\n\t'disks'                => \\@disks,\n\t'regions'              => \\@regions,\n\t'instances_in_regions' => \\@instances_in_regions\n}, \"${site_folder}index.html\") || die \"Template process failed: \", $template->error(), \"\\n\";\n\n# Grid\npush(@files, 'grid.html');\nmy $json = encode_json \\@instances_in_regions;\n$json    = decode('UTF-8', $json); # force UTF-8\n$template->process('main.js',                 {},                  \"${site_folder}main.js\")                 || die \"Template process failed: \", $template->error(), \"\\n\";\n$template->process('grid.tt2',                {},                  \"${site_folder}grid.html\")               || die \"Template process failed: \", $template->error(), \"\\n\";\n$template->process('instance_in_region.json', { 'json' => $json }, \"${site_folder}instance_in_region.json\") || die \"Template process failed: \", $template->error(), \"\\n\";\n\n# Download\npush(@files, 'download.html');\n$template->process('download.tt2', {\n\t'csvFileSize' => $filesize_csv_export,\n\t'sqlFileSize' => $filesize_sql_export,\n}, \"${site_folder}download.html\") || die \"Template process failed: \", $template->error(), \"\\n\";\n\n# gcosts\npush(@files, 'gcosts.html');\n$template->process('gcosts.tt2', {}, \"${site_folder}gcosts.html\") || die \"Template process failed: \", $template->error(), \"\\n\";\n\n# Imprint\n$template->process('imprint.tt2', {}, \"${site_folder}imprint.html\") || die \"Template process failed: \", $template->error(), \"\\n\";\n\n# 404\n$template->process('404.tt2', {}, \"${site_folder}404.html\") || die \"Template process failed: \", $template->error(), \"\\n\";\n\n# Sitemap\n$template->process('sitemap.tt2', { 'files' => \\@files }, \"${site_folder}sitemap.txt\") || die \"Template process failed: \", $template->error(), \"\\n\";\n\n# Robots.txt\n$template->process('robots.txt', {\n\t'regions' => \\@regions\n}, \"${site_folder}robots.txt\") || die \"Template process failed: \", $template->error(), \"\\n\";\n\n# SQL and CSV Export\ncopy(\"$sql_export\", \"${site_folder}machine-types-regions.sql.gz\");\ncopy(\"$csv_export\", \"${site_folder}machine-types-regions.csv\");\n\n# Images\nmkdir(\"${site_folder}img/\");\nmy @images = (\n\t'combine-filter.png',\n\t'csv.png',\n\t'filter.png',\n\t'gcosts.png',\n\t'show-more.png',\n\t'social.png',\n\t'sort.png',\n\t'usage.png',\n);\nforeach my $image (@images) {\n\tcopy(\"./src/img/$image\", \"${site_folder}img/$image\");\n}\n\n# Favicon\nmy @favicons = (\n\t'favicon.ico',\n\t'favicon-16x16.png',\n\t'favicon-32x32.png',\n\t'apple-touch-icon.png',\n\t'android-chrome-192x192.png',\n\t'android-chrome-512x512.png',\n\t'site.webmanifest',\n);\nforeach my $favicon (@favicons) {\n\tcopy(\"./src/img/favicon/$favicon\", \"${site_folder}$favicon\");\n}\n\ncopy(\"./src/ads.txt\", \"${site_folder}ads.txt\");\ncopy(\"./src/popin-min.js\", \"${site_folder}popin-min.js\");\n\n\nprint \"DONE\\n\";"
  },
  {
    "path": "build/src/404.tt2",
    "content": "[%- PROCESS header.tt2 -%]\n\n</div> <!-- // container-fluid -->\n<div class=\"container\">\n\n<h1>404 - Page Not Found</h1>\n\n<blockquote class=\"blockquote\">\n\t<p>Sorry, the <a href=\"/instances.html\">machine type</a>, <a href=\"/regions.html\">region</a> or page you are looking for could not be found.</p>\n</blockquote>\n\n<p>\n\t<a class=\"btn btn-primary btn-lg\" href=\"/\" role=\"button\">Start</a>\n</p>\n\n[% PROCESS footer.tt2 %]"
  },
  {
    "path": "build/src/ads.txt",
    "content": "google.com, pub-7267449040388963, DIRECT, f08c47fec0942fa0"
  },
  {
    "path": "build/src/amd.tt2",
    "content": "[%- PROCESS header.tt2 -%]\n[%- PROCESS instances_header.tt2 -%]\n\n<h1>Google Compute Engine Machine Types with AMD CPU Platform</h1>\n\n[%- countAmd = 0; FOREACH instance IN instances; IF instance.amd; countAmd = countAmd + 1; END; END -%]\n<blockquote class=\"blockquote\">\n<p>\nThere are <mark>[% countAmd %]</mark> Google Compute Engine machine types with AMD central processing unit (CPU) available.\nNot every Google Cloud VM with AMD CPU is available in every region.\n</p>\n</blockquote>\n\n<p><a class=\"btn btn-success\" href=\"/grid.html?platform=amd\" role=\"button\">✅ Instance Picker with filter on CPU Platform</a></p>\n\n<div class=\"table-responsive\">\n[%- PROCESS instances_tr.tt2; -%]\n<table\n\tclass=\"table table-sm table-hover table-bordered\"\n\tdata-classes=\"table table-sm table-hover table-bordered\"\n\tdata-toggle=\"table\"\n\tdata-sort-name=\"vcpu\"\n\tdata-sort-order=\"asc\"\n\tdata-sortable=\"true\"\n\tdata-sticky-header=\"true\"\n>\n<thead>\n[%- instancePlatformTh() -%]\n</thead>\n<tbody>\n[%- FOREACH instance IN instances; IF instance.amd; instancePlatformTr(instance); END; END -%]\n</tbody>\n</table>\n</div> <!-- // table-responsive -->\n[% PROCESS footer.tt2 %]"
  },
  {
    "path": "build/src/arm.tt2",
    "content": "[%- PROCESS header.tt2 -%]\n[%- PROCESS instances_header.tt2 -%]\n\n<h1>Google Compute Engine Machine Types with Arm CPU Platform</h1>\n\n[%- countArm = 0; FOREACH instance IN instances; IF instance.arm; countArm = countArm + 1; END; END -%]\n<blockquote class=\"blockquote\">\n<p>\nThere are <mark>[% countArm %]</mark> Google Compute Engine machine types with Arm-based central processing unit (CPU) available.\nNot every Google Cloud VM with Arm-based CPU is available in every region.\n</p>\n</blockquote>\n\n<p><a class=\"btn btn-success\" href=\"/grid.html?arm=1\" role=\"button\">✅ Instance Picker with filter on Arm-based CPU</a></p>\n\n<div class=\"table-responsive\">\n[%- PROCESS instances_tr.tt2; -%]\n<table\n\tclass=\"table table-sm table-hover table-bordered\"\n\tdata-classes=\"table table-sm table-hover table-bordered\"\n\tdata-toggle=\"table\"\n\tdata-sort-name=\"vcpu\"\n\tdata-sort-order=\"asc\"\n\tdata-sortable=\"true\"\n\tdata-sticky-header=\"true\"\n>\n<thead>\n[%- instancePlatformTh() -%]\n</thead>\n<tbody>\n[%- FOREACH instance IN instances; IF instance.arm; instancePlatformTr(instance); END; END -%]\n</tbody>\n</table>\n</div> <!-- // table-responsive -->\n[% PROCESS footer.tt2 %]"
  },
  {
    "path": "build/src/comparison.tt2",
    "content": "[%- PROCESS header.tt2 -%]\n\n<h1>Google Compute Engine Comparison [% instance_a.name %] vs. [% instance_b.name %]</h1>\n\n<blockquote class=\"blockquote\">\n<p>\n\tGoogle Compute Engine machine type comparison\n\t<a href=\"/[% instance_a.name %].html\" title=\"Show machine type [% instance_a.name %] in all regions\">[% instance_a.name %]</a>\n\t([% instance_a.vCpus %] vCPU, [% instance_a.memoryGB %] GB memory)\n\tversus\n\t<a href=\"/[% instance_b.name %].html\" title=\"Show machine type [% instance_b.name %] in all regions\">[% instance_b.name %]</a>\n\t([% instance_b.vCpus %] vCPU, [% instance_b.memoryGB %] GB memory).\n</p>\n</blockquote>\n\n<p class=\"d-grid gap-2 d-lg-block\">\n\t<a class=\"btn btn-primary\" href=\"/[% instance_a.name %].html\" role=\"button\" title=\"Show machine type [% instance_a.name %] in all regions\">Show [% instance_a.name %]</a>\n\t<a class=\"btn btn-primary\" href=\"/[% instance_b.name %].html\" role=\"button\" title=\"Show machine type [% instance_b.name %] in all regions\">Show [% instance_b.name %]</a>\n\t<a class=\"btn btn-warning\" href=\"/comparison/[% instance_a.name %]/vs.html\" role=\"button\">Compare [% instance_a.name %]</a>\n\t<a class=\"btn btn-warning\" href=\"/comparison/[% instance_b.name %]/vs.html\" role=\"button\">Compare [% instance_b.name %]</a>\n</p>\n\n<div class=\"row\">\n<div class=\"col-xxl-6\">\n\n<h2>Google Cloud VMs</h2>\n<p>Technical facts about the Google Compute Engine machine types [% instance_a.name %] and [% instance_b.name %].</p>\n<div class=\"table-responsive\">\n<table class=\"table table-hover table-bordered\">\n<thead>\n\t<tr>\n\t\t<th scope=\"col\"></th>\n\t\t<th scope=\"col\" class=\"table-active\">[% instance_a.name %]</th>\n\t\t<th scope=\"col\"></th>\n\t\t<th scope=\"col\">[% instance_b.name %]</th>\n\t</tr>\n</thead>\n<tbody>\n\t<tr>\n\t\t<th>Series</th>\n\t\t<td class=\"table-active\">[% instance_a.series %]</td>\n\t\t[% tableCompareText(instance_a.series || '', instance_b.series || '') %]\n\t\t<td>[% instance_b.series %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>Family</th>\n\t\t<td class=\"table-active\">[% instance_a.family %]</td>\n\t\t[% tableCompareText(instance_a.family || '', instance_b.family || '') %]\n\t\t<td>[% instance_b.family %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>Regions</th>\n\t\t<td class=\"table-active\">[% instance_a.regionCount %]</td>\n\t\t[% tableCompareNumber(instance_a.regionCount || 0, instance_b.regionCount || 0) %]\n\t\t<td>[% instance_b.regionCount %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>vCPU</th>\n\t\t<td class=\"table-active\">[% instance_a.vCpus %][% badgeSharedCpu(instance_a) %]</td>\n\t\t[% tableCompareNumber(instance_a.vCpus || 0, instance_b.vCpus || 0) %]\n\t\t<td>[% instance_b.vCpus %][% badgeSharedCpu(instance_b) %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>Memory</th>\n\t\t<td class=\"table-active\">[% instance_a.memoryGB %] GB</td>\n\t\t[% tableCompareNumber(instance_a.memoryGB || 0, instance_b.memoryGB || 0) %]\n\t\t<td>[% instance_b.memoryGB %] GB</td>\n\t</tr>\n\t<tr>\n\t\t<th>CPU Platform</th>\n\t\t<td class=\"table-active\">[% listCpuPlatform(instance_a) %]</td>\n\t\t[% tableCompareNumber(instance_a.cpuPlatformCount || 0, instance_b.cpuPlatformCount || 0) %]\n\t\t<td>[% listCpuPlatform(instance_b) %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>CPU Base Frequency</th>\n\t\t<td class=\"table-active\">[% instance_a.cpuBaseClock %] GHz</td>\n\t\t[% tableCompareNumber(instance_a.cpuBaseClock || 0, instance_b.cpuBaseClock || 0) %]\n\t\t<td>[% instance_b.cpuBaseClock %] GHz</td>\n\t</tr>\n\t<tr>\n\t\t<th>CPU Turbo Frequency</th>\n\t\t<td class=\"table-active\">[% instance_a.cpuTurboClock %] GHz</td>\n\t\t[% tableCompareNumber(instance_a.cpuTurboClock || 0, instance_b.cpuTurboClock || 0) %]\n\t\t<td>[% instance_b.cpuTurboClock %] GHz</td>\n\t</tr>\n\t<tr>\n\t\t<th>CPU Max. Turbo Frequency</th>\n\t\t<td class=\"table-active\">[% instance_a.cpuSingleMaxTurboClock %] GHz</td>\n\t\t[% tableCompareNumber(instance_a.cpuSingleMaxTurboClock || 0, instance_b.cpuSingleMaxTurboClock || 0) %]\n\t\t<td>[% instance_b.cpuSingleMaxTurboClock %] GHz</td>\n\t</tr>\n\t<tr>\n\t\t<th>Accelerator (GPUs)</th>\n\t\t<td class=\"table-active\">[% instance_a.acceleratorCount %]</td>\n\t\t[% tableCompareNumber(instance_a.acceleratorCount || 0, instance_b.acceleratorCount || 0) %]\n\t\t<td>[% instance_b.acceleratorCount %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>Accelerator Type</th>\n\t\t<td class=\"table-active\">[% instance_a.acceleratorType %]</td>\n\t\t[% tableCompareText(instance_a.acceleratorType || '', instance_b.acceleratorType || '') %]\n\t\t<td>[% instance_b.acceleratorType %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>EEMBC CoreMark Benchmark (<a href=\"https://www.eembc.org/coremark\">?</a>)</th>\n\t\t<td class=\"table-active\">[% IF instance_a.coremarkScore %][% instance_a.coremarkScore %][% ELSE %]<span class=\"text-muted\">-</span>[% END %]</td>\n\t\t[% tableCompareNumber(instance_a.coremarkScore || 0, instance_b.coremarkScore || 0) %]\n\t\t<td>[% IF instance_b.coremarkScore %][% instance_b.coremarkScore %][% ELSE %]<span class=\"text-muted\">-</span>[% END %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>EEMBC CoreMark Standard Deviation</th>\n\t\t<td class=\"table-active\">[% IF instance_a.standardDeviation %][% instance_a.standardDeviation %] %[% ELSE %]<span class=\"text-muted\">-</span>[% END %]</td>\n\t\t[% tableCompareNumber(instance_a.standardDeviation || 0, instance_b.standardDeviation || 0) %]\n\t\t<td>[% IF instance_b.standardDeviation %][% instance_b.standardDeviation %] %[% ELSE %]<span class=\"text-muted\">-</span>[% END %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>EEMBC CoreMark Sample Count</th>\n\t\t<td class=\"table-active\">[% IF instance_a.sampleCount %][% instance_a.sampleCount %][% ELSE %]<span class=\"text-muted\">-</span>[% END %]</td>\n\t\t[% tableCompareNumber(instance_a.sampleCount || 0, instance_b.sampleCount || 0) %]\n\t\t<td>[% IF instance_b.sampleCount %][% instance_b.sampleCount %][% ELSE %]<span class=\"text-muted\">-</span>[% END %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>SAP Standard Benchmark (<a href=\"https://www.sap.com/about/benchmark.html\">?</a>)</th>\n\t\t<td class=\"table-active\">[% IF instance_a.saps %][% instance_a.saps %][% ELSE %]<span class=\"text-muted\">-</span>[% END %]</td>\n\t\t[% tableCompareNumber(instance_a.saps || 0, instance_b.saps || 0) %]\n\t\t<td>[% IF instance_b.saps %][% instance_b.saps %][% ELSE %]<span class=\"text-muted\">-</span>[% END %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>Network Bandwidth</th>\n\t\t<td class=\"table-active\">[% instance_a.bandwidth %] Gbps</td>\n\t\t[% tableCompareNumber(instance_a.bandwidth || 0, instance_b.bandwidth || 0) %]\n\t\t<td>[% instance_b.bandwidth %] Gbps</td>\n\t</tr>\n\t<tr>\n\t\t<th>Network Tier 1</th>\n\t\t<td class=\"table-active\">[% IF instance_a.tier1 %][% instance_a.tier1 %] Gbps[% ELSE %]<span class=\"text-muted\">-</span>[% END %]</td>\n\t\t[% tableCompareNumber(instance_a.tier1 || 0, instance_b.tier1 || 0) %]\n\t\t<td>[% IF instance_b.tier1 %][% instance_b.tier1 %] Gbps[% ELSE %]<span class=\"text-muted\">-</span>[% END %]</td>\n\t</tr>\n\t<tr>\n\t\t<th title=\"Disk usage is charged separately from machine type pricing!\">Max. Disk Size</th>\n\t\t<td class=\"table-active\">[% instance_a.diskSizeTiB %] TB</td>\n\t\t[% tableCompareNumber(instance_a.diskSizeTiB || 0, instance_b.diskSizeTiB || 0) %]\n\t\t<td>[% instance_b.diskSizeTiB %] TB</td>\n\t</tr>\n\t<tr>\n\t\t<th title=\"Disk usage is charged separately from machine type pricing!\">Max. Number of Disks</th>\n\t\t<td class=\"table-active\">[% instance_a.disks %]</td>\n\t\t[% tableCompareNumber(instance_a.disks || 0, instance_b.disks || 0) %]\n\t\t<td>[% instance_b.disks %]</td>\n\t</tr>\n\t\t<tr>\n\t\t<th>Local SSD</th>\n\t\t<td class=\"table-active\">[% booleanLocalSsd(instance_a) %]</td>\n\t\t[% tableCompareBoolean(instance_a.localSsd || 0, instance_b.localSsd || 0) %]\n\t\t<td>[% booleanLocalSsd(instance_b) %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>SAP Application</th>\n\t\t<td class=\"table-active\">[% booleanSap(instance_a) %]</td>\n\t\t[% tableCompareBoolean(instance_a.sap || 0, instance_b.sap || 0) %]\n\t\t<td>[% booleanSap(instance_b) %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>SAP HANA</th>\n\t\t<td class=\"table-active\">[% booleanHana(instance_a) %]</td>\n\t\t[% tableCompareBoolean(instance_a.hana || 0, instance_b.hana || 0) %]\n\t\t<td>[% booleanHana(instance_b) %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>Spot Provisioning Mode (Spot VM)</th>\n\t\t<td class=\"table-active\">[% booleanSpot(instance_a) %]</td>\n\t\t[% tableCompareBoolean(instance_a.spot || 0, instance_b.spot || 0) %]\n\t\t<td>[% booleanSpot(instance_b) %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>Sustained Use Discount (SUD)</th>\n\t\t<td class=\"table-active\">[% booleanSud(instance_a) %]</td>\n\t\t[% tableCompareBoolean(instance_a.sud || 0, instance_b.sud || 0) %]\n\t\t<td>[% booleanSud(instance_b) %]</td>\n\t</tr>\n</tbody>\n\t<tr>\n\t\t<th scope=\"col\"></th>\n\t\t<th scope=\"col\" class=\"table-active\">[% instance_a.name %]</th>\n\t\t<th scope=\"col\"></th>\n\t\t<th scope=\"col\">[% instance_b.name %]</th>\n\t</tr>\n<tfoot>\n</tfoot>\n</table>\n</div> <!-- // table-responsive -->\n\n</div> <!-- // col -->\n<div class=\"col-xxl-6\">\n\n<h2>Costs (Pricing)</h2>\n<p>Average prices across all regions for Google Compute Engine machine types [% instance_a.name %] and [% instance_b.name %].</p>\n\n<h3>Price per Hour</h3>\n<div class=\"table-responsive\">\n<table class=\"table table-hover table-striped table-bordered\">\n<thead>\n\t<tr>\n\t\t<th scope=\"col\"></th>\n\t\t<th scope=\"col\" class=\"table-active\">[% instance_a.name %]</th>\n\t\t<th scope=\"col\"></th>\n\t\t<th scope=\"col\">[% instance_b.name %]</th>\n\t</tr>\n</thead>\n<tbody>\n\t<tr>\n\t\t<th>Standard price per hour</th>\n\t\t<td class=\"currency table-active\">[% instance_a.avgHour %]</td>\n\t\t[% tableCompareCosts(instance_a.avgHour || 0, instance_b.avgHour || 0) %]\n\t\t<td class=\"currency\">[% instance_b.avgHour %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>Spot provisioning model (Spot VM)</th>\n\t\t<td class=\"currency table-active\">[% instance_a.avgHourSpot %]</td>\n\t\t[% tableCompareCosts(instance_a.avgHourSpot || 0, instance_b.avgHourSpot || 0) %]\n\t\t<td class=\"currency\">[% instance_b.avgHourSpot %]</td>\n\t</tr>\n</tbody>\n</table>\n</div>\n\n<h3>Price per Month</h3>\n<div class=\"table-responsive\">\n<table class=\"table table-hover table-bordered\">\n<thead>\n\t<tr>\n\t\t<th scope=\"col\"></th>\n\t\t<th scope=\"col\" class=\"table-active\">[% instance_a.name %]</th>\n\t\t<th scope=\"col\"></th>\n\t\t<th scope=\"col\">[% instance_b.name %]</th>\n\t</tr>\n</thead>\n<tbody>\n\t<tr>\n\t\t<th>Price per month</th>\n\t\t<td class=\"table-active\">\n\t\t\t<span class=\"currency\">[% instance_a.avgMonth %]</span>\n\t\t\t[% badgeSud(instance_a) %]\n\t\t</td>\n\t\t[% tableCompareCosts(instance_a.avgMonth || 0, instance_b.avgMonth || 0) %]\n\t\t<td>\n\t\t\t<span class=\"currency\">[% instance_b.avgMonth %]</span>\n\t\t\t[% badgeSud(instance_b) %]\n\t\t</td>\n\t</tr>\n\t<tr>\n\t\t<th>Spot provisioning model (Spot VM)</th>\n\t\t<td class=\"currency table-active\">[% instance_a.avgMonthSpot %]</td>\n\t\t[% tableCompareCosts(instance_a.avgMonthSpot || 0, instance_b.avgMonthSpot || 0) %]\n\t\t<td class=\"currency\">[% instance_b.avgMonthSpot %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>1 year commitment (CUD)</th>\n\t\t<td class=\"currency table-active\">[% instance_a.avgMonth1yCud %]</td>\n\t\t[% tableCompareCosts(instance_a.avgMonth1yCud || 0, instance_b.avgMonth1yCud || 0) %]\n\t\t<td class=\"currency\">[% instance_b.avgMonth1yCud %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>3 year commitment (CUD)</th>\n\t\t<td class=\"currency table-active\">[% instance_a.avgMonth3yCud %]</td>\n\t\t[% tableCompareCosts(instance_a.avgMonth3yCud || 0, instance_b.avgMonth3yCud || 0) %]\n\t\t<td class=\"currency\">[% instance_b.avgMonth3yCud %]</td>\n\t</tr>\n</tbody>\n</table>\n</div> <!-- // table-responsive -->\n\n<h3>Operating System Licenses Costs</h3>\n<p>Monthly costs for paid <i>premium</i> operating system licenses for Google Compute Engine machine types [% instance_a.name %] and [% instance_b.name %].</p>\n<div class=\"table-responsive\">\n<table class=\"table table-hover table-bordered\">\n<thead>\n\t<tr>\n\t\t<th scope=\"col\"></th>\n\t\t<th scope=\"col\" class=\"table-active\">[% instance_a.name %]</th>\n\t\t<th scope=\"col\"></th>\n\t\t<th scope=\"col\">[% instance_b.name %]</th>\n\t</tr>\n</thead>\n<tbody>\n\t<tr>\n\t\t<th>Microsoft Windows Server</th>\n\t\t<td class=\"currency table-active\">[% instance_a.monthWindows %]</td>\n\t\t[% tableCompareCosts(instance_a.monthWindows || 0, instance_b.monthWindows || 0) %]\n\t\t<td class=\"currency\">[% instance_b.monthWindows %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>SUSE Linux Enterprise Server</th>\n\t\t<td class=\"currency table-active\">[% instance_a.monthSles %]</td>\n\t\t[% tableCompareCosts(instance_a.monthSles || 0, instance_b.monthSles || 0) %]\n\t\t<td class=\"currency\">[% instance_b.monthSles %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>Red Hat Enterprise Linux</th>\n\t\t<td class=\"currency table-active\">[% instance_a.monthRhel %]</td>\n\t\t[% tableCompareCosts(instance_a.monthRhel || 0, instance_b.monthRhel || 0) %]\n\t\t<td class=\"currency\">[% instance_b.monthRhel %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>Red Hat Enterprise Linux w. 1 year CUD</th>\n\t\t<td class=\"currency table-active\">[% instance_a.monthRhel1yCud %]</td>\n\t\t[% tableCompareCosts(instance_a.monthRhel1yCud || 0, instance_b.monthRhel1yCud || 0) %]\n\t\t<td class=\"currency\">[% instance_b.monthRhel1yCud %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>Red Hat Enterprise Linux w. 3 year CUD</th>\n\t\t<td class=\"currency table-active\">[% instance_a.monthRhel3yCud %]</td>\n\t\t[% tableCompareCosts(instance_a.monthRhel3yCud || 0, instance_b.monthRhel3yCud || 0) %]\n\t\t<td class=\"currency\">[% instance_b.monthRhel3yCud %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>SUSE Linux Enterprise Server for SAP</th>\n\t\t<td class=\"currency table-active\">[% instance_a.monthSlesSap %]</td>\n\t\t[% tableCompareCosts(instance_a.monthSlesSap || 0, instance_b.monthSlesSap || 0) %]\n\t\t<td class=\"currency\">[% instance_b.monthSlesSap %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>SUSE Linux Enterprise Server for SAP w. 1 year CUD</th>\n\t\t<td class=\"currency table-active\">[% instance_a.monthSlesSap1yCud %]</td>\n\t\t[% tableCompareCosts(instance_a.monthSlesSap1yCud || 0, instance_b.monthSlesSap1yCud || 0) %]\n\t\t<td class=\"currency\">[% instance_b.monthSlesSap1yCud %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>SUSE Linux Enterprise Server for SAP w. 3 year CUD</th>\n\t\t<td class=\"currency table-active\">[% instance_a.monthSlesSap3yCud %]</td>\n\t\t[% tableCompareCosts(instance_a.monthSlesSap3yCud || 0, instance_b.monthSlesSap3yCud || 0) %]\n\t\t<td class=\"currency\">[% instance_b.monthSlesSap3yCud %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>Red Hat Enterprise Linux for SAP</th>\n\t\t<td class=\"currency table-active\">[% instance_a.monthRhelSap %]</td>\n\t\t[% tableCompareCosts(instance_a.monthRhelSap || 0, instance_b.monthRhelSap || 0) %]\n\t\t<td class=\"currency\">[% instance_b.monthRhelSap %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>Red Hat Enterprise Linux for SAP w. 1 year CUD</th>\n\t\t<td class=\"currency table-active\">[% instance_a.monthRhelSap1yCud %]</td>\n\t\t[% tableCompareCosts(instance_a.monthRhelSap1yCud || 0, instance_b.monthRhelSap1yCud || 0) %]\n\t\t<td class=\"currency\">[% instance_b.monthRhelSap1yCud %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>Red Hat Enterprise Linux for SAP w. 3 year CUD</th>\n\t\t<td class=\"currency table-active\">[% instance_a.monthRhelSap3yCud %]</td>\n\t\t[% tableCompareCosts(instance_a.monthRhelSap3yCud || 0, instance_b.monthRhelSap3yCud || 0) %]\n\t\t<td class=\"currency\">[% instance_b.monthRhelSap3yCud %]</td>\n\t</tr>\n</tbody>\n</table>\n</div> <!-- // table-responsive -->\n\n</div> <!-- // col -->\n</div> <!-- // row -->\n\n\n<h2>Regions</h2>\n<p>Costs for Google Compute Engine machine types [% instance_a.name %] and [% instance_b.name %] in Google Cloud regions in which the VMs are available.</p>\n<div class=\"table-responsive\">\n<table\n\tclass=\"table table-sm table-hover table-bordered\"\n\tdata-classes=\"table table-sm table-hover table-bordered\"\n\tdata-toggle=\"table\"\n\tdata-sort-name=\"name\"\n\tdata-sort-order=\"asc\"\n\tdata-sticky-header=\"true\"\n>\n<thead>\n\t<tr>\n\t\t<th scope=\"col\" colspan=\"2\">Region</th>\n\t\t<th scope=\"col\" colspan=\"3\">Hour</th>\n\t\t<th scope=\"col\" colspan=\"3\">Spot</th>\n\t\t<th scope=\"col\" colspan=\"3\">Month</th>\n\t\t<th scope=\"col\" colspan=\"3\">1 year CUD</th>\n\t\t<th scope=\"col\" colspan=\"3\">3 year CUD</th>\n\t</tr>\n\t<tr>\n\t\t<th scope=\"col\" data-field=\"name\" data-sortable=\"true\">Name</th>\n\t\t<th scope=\"col\">Location</th>\n\t\t<!-- Hour -->\n\t\t<th scope=\"col\" class=\"table-active\">[% instance_a.name %]</th>\n\t\t<th scope=\"col\"></th>\n\t\t<th scope=\"col\">[% instance_b.name %]</th>\n\t\t<!-- Spot -->\n\t\t<th scope=\"col\" class=\"table-active\">[% instance_a.name %]</th>\n\t\t<th scope=\"col\"></th>\n\t\t<th scope=\"col\">[% instance_b.name %]</th>\n\t\t<!-- Month -->\n\t\t<th scope=\"col\" class=\"table-active\">[% instance_a.name %]</th>\n\t\t<th scope=\"col\"></th>\n\t\t<th scope=\"col\">[% instance_b.name %]</th>\n\t\t<!-- 1Y CUD -->\n\t\t<th scope=\"col\" class=\"table-active\">[% instance_a.name %]</th>\n\t\t<th scope=\"col\"></th>\n\t\t<th scope=\"col\">[% instance_b.name %]</th>\n\t\t<!-- 3Y CUD -->\n\t\t<th scope=\"col\" class=\"table-active\">[% instance_a.name %]</th>\n\t\t<th scope=\"col\"></th>\n\t\t<th scope=\"col\">[% instance_b.name %]</th>\n\t</tr>\n</thead>\n<tbody>\n\t[% FOREACH region IN regions %]\n\t<tr>\n\t\t<td><a href=\"/[% region.name %].html\" title=\"Show all machine types in region [% region.name %]\">[% region.name %]</a></td>\n\t\t<td>[% region.regionLocation %]</td>\n\t\t<!-- Hour -->\n\t\t[%-\n\t\t\tcosts_a = 0;\n\t\t\tcosts_b = 0;\n\t\t\tFOREACH region_a IN regions_a;\n\t\t\t\tIF region_a.region == region.name;\n\t\t\t\t\tcosts_a = region_a.hour;\n\t\t\t\tEND;\n\t\t\tEND;\n\t\t\tFOREACH region_b IN regions_b;\n\t\t\t\tIF region_b.region == region.name;\n\t\t\t\t\tcosts_b = region_b.hour;\n\t\t\t\tEND;\n\t\t\tEND;\n\t\t-%]\n\t\t[% IF costs_a %]\n\t\t<td class=\"currency table-active\" title=\"Costs per hour [% instance_a.name %] in [% region.name %]: [% costs_a %] USD\"><a href=\"/[% region.name %]/[% instance_a.name %].html\">[% costs_a %]</a></td>\n\t\t[% ELSE %]\n\t\t<td class=\"table-warning\" title=\"Machine type [% instance_a.name %] is not available in the region [% region.name %]\"><span class=\"text-muted\">N.A.</span></td>\n\t\t[% END %]\n\t\t[% IF costs_a && costs_b %]\n\t\t[% tableCompareCosts(costs_a || 0, costs_b || 0) %]\n\t\t[% ELSE %]\n\t\t<td class=\"table-warning\"><span class=\"text-muted\">-</span></td>\n\t\t[% END %]\n\t\t[% IF costs_b %]\n\t\t<td class=\"currency\" title=\"Costs per hour [% instance_b.name %] in [% region.name %]: [% costs_b %] USD\"><a href=\"/[% region.name %]/[% instance_b.name %].html\">[% costs_b %]</a></td>\n\t\t[% ELSE %]\n\t\t<td class=\"table-warning\" title=\"Machine type [% instance_a.name %] is not available in the region [% region.name %]\"><span class=\"text-muted\">N.A.</span></td>\n\t\t[% END %]\n\t\t<!-- Spot -->\n\t\t[%-\n\t\t\tcosts_a = 0;\n\t\t\tcosts_b = 0;\n\t\t\tFOREACH region_a IN regions_a;\n\t\t\t\tIF region_a.region == region.name;\n\t\t\t\t\tcosts_a = region_a.hourSpot;\n\t\t\t\tEND;\n\t\t\tEND;\n\t\t\tFOREACH region_b IN regions_b;\n\t\t\t\tIF region_b.region == region.name;\n\t\t\t\t\tcosts_b = region_b.hourSpot;\n\t\t\t\tEND;\n\t\t\tEND;\n\t\t-%]\n\t\t[% IF costs_a %]\n\t\t<td class=\"currency table-active\" title=\"Costs per hour [% instance_a.name %] in [% region.name %] with spot provisioning model (Spot VM): [% costs_a %] USD\"><a href=\"/[% region.name %]/[% instance_a.name %].html\">[% costs_a %]</a></td>\n\t\t[% ELSE %]\n\t\t<td class=\"table-warning\" title=\"Machine type [% instance_a.name %] is not available in the region [% region.name %]\"><span class=\"text-muted\">N.A.</span></td>\n\t\t[% END %]\n\t\t[% IF costs_a && costs_b %]\n\t\t[% tableCompareCosts(costs_a || 0, costs_b || 0) %]\n\t\t[% ELSE %]\n\t\t<td class=\"table-warning\"><span class=\"text-muted\">-</span></td>\n\t\t[% END %]\n\t\t[% IF costs_b %]\n\t\t<td class=\"currency\" title=\"Costs per hour [% instance_b.name %] in [% region.name %] with spot provisioning model (Spot VM): [% costs_b %] USD\"><a href=\"/[% region.name %]/[% instance_b.name %].html\">[% costs_b %]</a></td>\n\t\t[% ELSE %]\n\t\t<td class=\"table-warning\" title=\"Machine type [% instance_a.name %] is not available in the region [% region.name %]\"><span class=\"text-muted\">N.A.</span></td>\n\t\t[% END %]\n\t\t<!-- Month -->\n\t\t[%-\n\t\t\tcosts_a = 0;\n\t\t\tcosts_b = 0;\n\t\t\tFOREACH region_a IN regions_a;\n\t\t\t\tIF region_a.region == region.name;\n\t\t\t\t\tcosts_a = region_a.month;\n\t\t\t\tEND;\n\t\t\tEND;\n\t\t\tFOREACH region_b IN regions_b;\n\t\t\t\tIF region_b.region == region.name;\n\t\t\t\t\tcosts_b = region_b.month;\n\t\t\t\tEND;\n\t\t\tEND;\n\t\t-%]\n\t\t[% IF costs_a %]\n\t\t<td class=\"text-nowrap table-active\" title=\"Costs per month [% instance_a.name %] in [% region.name %]: [% costs_a %] USD\">\n\t\t\t<span class=\"currency\"><a href=\"/[% region.name %]/[% instance_a.name %].html\">[% costs_a %]</a></span>\n\t\t\t[% badgeSud(instance_a) %]\n\t\t</td>\n\t\t[% ELSE %]\n\t\t<td class=\"table-warning\" title=\"Machine type [% instance_a.name %] is not available in the region [% region.name %]\"><span class=\"text-muted\">N.A.</span></td>\n\t\t[% END %]\n\t\t[% IF costs_a && costs_b %]\n\t\t[% tableCompareCosts(costs_a || 0, costs_b || 0) %]\n\t\t[% ELSE %]\n\t\t<td class=\"table-warning\"><span class=\"text-muted\">-</span></td>\n\t\t[% END %]\n\t\t[% IF costs_b %]\n\t\t<td class=\"text-nowrap\" title=\"Costs per month [% instance_b.name %] in [% region.name %]: [% costs_b %] USD\">\n\t\t\t<span class=\"currency\"><a href=\"/[% region.name %]/[% instance_b.name %].html\">[% costs_b %]</a></span>\n\t\t\t[% badgeSud(instance_b) %]\n\t\t</td>\n\t\t[% ELSE %]\n\t\t<td class=\"table-warning\" title=\"Machine type [% instance_a.name %] is not available in the region [% region.name %]\"><span class=\"text-muted\">N.A.</span></td>\n\t\t[% END %]\n\t\t<!-- 1Y CUD -->\n\t\t[%-\n\t\t\tcosts_a = 0;\n\t\t\tcosts_b = 0;\n\t\t\tFOREACH region_a IN regions_a;\n\t\t\t\tIF region_a.region == region.name;\n\t\t\t\t\tcosts_a = region_a.month1yCud;\n\t\t\t\tEND;\n\t\t\tEND;\n\t\t\tFOREACH region_b IN regions_b;\n\t\t\t\tIF region_b.region == region.name;\n\t\t\t\t\tcosts_b = region_b.month1yCud;\n\t\t\t\tEND;\n\t\t\tEND;\n\t\t-%]\n\t\t[% IF costs_a %]\n\t\t<td class=\"table-active\" title=\"Costs per month [% instance_a.name %] in [% region.name %] with 1Y CUD: [% costs_a %] USD\">\n\t\t\t<span class=\"currency\"><a href=\"/[% region.name %]/[% instance_a.name %].html\">[% costs_a %]</a></span>\n\t\t</td>\n\t\t[% ELSE %]\n\t\t<td class=\"table-warning\" title=\"Machine type [% instance_a.name %] is not available in the region [% region.name %]\"><span class=\"text-muted\">N.A.</span></td>\n\t\t[% END %]\n\t\t[% IF costs_a && costs_b %]\n\t\t[% tableCompareCosts(costs_a || 0, costs_b || 0) %]\n\t\t[% ELSE %]\n\t\t<td class=\"table-warning\"><span class=\"text-muted\">-</span></td>\n\t\t[% END %]\n\t\t[% IF costs_b %]\n\t\t<td title=\"Costs per month [% instance_b.name %] in [% region.name %] with 1Y CUD: [% costs_b %] USD\">\n\t\t\t<span class=\"currency\"><a href=\"/[% region.name %]/[% instance_b.name %].html\">[% costs_b %]</a></span>\n\t\t</td>\n\t\t[% ELSE %]\n\t\t<td class=\"table-warning\" title=\"Machine type [% instance_a.name %] is not available in the region [% region.name %]\"><span class=\"text-muted\">N.A.</span></td>\n\t\t[% END %]\n\t\t<!-- 3Y CUD -->\n\t\t[%-\n\t\t\tcosts_a = 0;\n\t\t\tcosts_b = 0;\n\t\t\tFOREACH region_a IN regions_a;\n\t\t\t\tIF region_a.region == region.name;\n\t\t\t\t\tcosts_a = region_a.month3yCud;\n\t\t\t\tEND;\n\t\t\tEND;\n\t\t\tFOREACH region_b IN regions_b;\n\t\t\t\tIF region_b.region == region.name;\n\t\t\t\t\tcosts_b = region_b.month3yCud;\n\t\t\t\tEND;\n\t\t\tEND;\n\t\t-%]\n\t\t[% IF costs_a %]\n\t\t<td class=\"table-active\" title=\"Costs per month [% instance_a.name %] in [% region.name %] with 3Y CUD: [% costs_a %] USD\">\n\t\t\t<span class=\"currency\"><a href=\"/[% region.name %]/[% instance_a.name %].html\">[% costs_a %]</a></span>\n\t\t</td>\n\t\t[% ELSE %]\n\t\t<td class=\"table-warning\" title=\"Machine type [% instance_a.name %] is not available in the region [% region.name %]\"><span class=\"text-muted\">N.A.</span></td>\n\t\t[% END %]\n\t\t[% IF costs_a && costs_b %]\n\t\t[% tableCompareCosts(costs_a || 0, costs_b || 0) %]\n\t\t[% ELSE %]\n\t\t<td class=\"table-warning\"><span class=\"text-muted\">-</span></td>\n\t\t[% END %]\n\t\t[% IF costs_b %]\n\t\t<td title=\"Costs per month [% instance_b.name %] in [% region.name %] with 3Y CUD: [% costs_b %] USD\">\n\t\t\t<span class=\"currency\"><a href=\"/[% region.name %]/[% instance_b.name %].html\">[% costs_b %]</a></span>\n\t\t</td>\n\t\t[% ELSE %]\n\t\t<td class=\"table-warning\" title=\"Machine type [% instance_a.name %] is not available in the region [% region.name %]\"><span class=\"text-muted\">N.A.</span></td>\n\t\t[% END %]\n\t</tr>\n\t[% END %]\n</tbody>\n</table>\n</div> <!-- // table-responsive -->\n\n[% PROCESS footer.tt2 %]"
  },
  {
    "path": "build/src/config.tt2",
    "content": "[%-\nsite = {\n\turl => 'https://gcloud-compute.com',\n\tgithub = {\n\t\trepo   => 'https://github.com/Cyclenerd/google-cloud-compute-machine-types',\n\t\tissues => 'https://github.com/Cyclenerd/google-cloud-compute-machine-types/issues',\n\t},\n\tagGrid = {\n\t\tcss   => 'https://cdn.jsdelivr.net/npm/ag-grid-community@31.0.3/styles/ag-grid.min.css'\n\t\ttheme => 'https://cdn.jsdelivr.net/npm/ag-grid-community@31.0.3/styles/ag-theme-balham.min.css'\n\t\tjs    => 'https://cdn.jsdelivr.net/npm/ag-grid-community@31.0.3/dist/ag-grid-community.min.noStyle.js'\n\t},\n\tagCharts = {\n\t\tjs => 'https://cdn.jsdelivr.net/npm/ag-charts-community@9.0.2/dist/umd/ag-charts-community.min.js'\n\t}\n\tjQuery = {\n\t\tjs  => 'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.4/jquery.min.js'\n\t},\n\tbootstrap = {\n\t\tcss  => 'https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.2.3/css/bootstrap.min.css'\n\t\tjs   => 'https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.2.3/js/bootstrap.bundle.min.js'\n\t},\n\tbootstrapTable = {\n\t\tcss  => 'https://cdnjs.cloudflare.com/ajax/libs/bootstrap-table/1.22.2/bootstrap-table.min.css'\n\t\tjs   => 'https://cdnjs.cloudflare.com/ajax/libs/bootstrap-table/1.22.2/bootstrap-table.min.js'\n\t},\n\tbootstrapTableStickyHeader = {\n\t\tcss  => 'https://cdnjs.cloudflare.com/ajax/libs/bootstrap-table/1.22.2/extensions/sticky-header/bootstrap-table-sticky-header.min.css'\n\t\tjs   => 'https://cdnjs.cloudflare.com/ajax/libs/bootstrap-table/1.22.2/extensions/sticky-header/bootstrap-table-sticky-header.min.js'\n\t},\n\tleaflet = {\n\t\tcss  => 'https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.9.4/leaflet.min.css'\n\t\tjs   => 'https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.9.4/leaflet.min.js'\n\t},\n};\nPROCESS macros.tt2;\n-%]"
  },
  {
    "path": "build/src/disk.tt2",
    "content": "[%- PROCESS header.tt2 -%]\n<h1>Google Compute Engine Disk Type [% disk.name %]</h1>\n\n[%-\nminDiskSize = 10;\nIF disk.name == 'pd-extreme'; minDiskSize = 500; END;\nIF disk.name == 'local-ssd';  minDiskSize = 375; END;\n-%]\n<blockquote class=\"blockquote\">\n\t<p>[% IF disk.description %][% disk.description %], [% END %]<mark>minimum capacity per disk [% minDiskSize %] GB</mark>.</p>\n</blockquote>\n\n<p>Costs and pricing for Google Compute Engine disk type [% disk.name %] in Google Cloud regions in which the disk is available.</p>\n<div class=\"table-responsive\">\n<table\n\tclass=\"table table-hover table-bordered\"\n\tdata-toggle=\"table\"\n\tdata-sort-name=\"region\"\n\tdata-sort-order=\"asc\"\n\tdata-sortable=\"true\"\n\tdata-sticky-header=\"true\"\n>\n<thead>\n\t<tr>\n\t\t<th scope=\"col\" data-field=\"region\" data-sortable=\"true\">Region</th>\n\t\t<th scope=\"col\">Location</th>\n\t\t<th scope=\"col\" data-sortable=\"true\">#Zones</th>\n\t\t<!-- Costs -->\n\t\t<th scope=\"col\" data-sortable=\"true\">1 GB</th>\n\t\t<th scope=\"col\" data-sortable=\"true\">10 GB</th>\n\t\t<th scope=\"col\" data-sortable=\"true\">375 GB</th>\n\t\t<th scope=\"col\" data-sortable=\"true\">500 GB</th>\n\t</tr>\n</thead>\n<tbody>\n\t[% FOREACH region IN regions %]\n\t<tr>\n\t\t<td>\n\t\t\t<a\n\t\t\t   href=\"/[% region.name %].html\"\n\t\t\t   title=\"Google Compute Engine disk type [% disk.name %] in Google Cloud region [% region.name %]\">\n\t\t\t\t[% region.name %]\n\t\t\t</a>\n\t\t</td>\n\t\t<td>[% IF region.regionLocation %][% region.regionLocation %][% ELSE %]<span class=\"text-muted\">?</span>[% END %]</td>\n\t\t<td [% IF region.zoneCount < 1%]class=\"table-danger\"[% END%] title=\"Available [% region.zoneCount %] zone[% IF region.zoneCount > 1 %]s[% END %] in region [% region.name %]\">[% IF region.zoneCount %][% region.zoneCount %][% ELSE %]<span class=\"text-muted\">?</span>[% END %]</td>\n\t\t<!-- Costs -->\n\t\t[% IF region.monthGb %]\n\t\t<td title=\"Costs for 1 GB [% disk.name %] per month: [% region.monthGb %] USD\" class=\"currency\">[% region.monthGb %]</td>\n\t\t<td title=\"Costs for 10 GB [% disk.name %] per month: [% region.monthGb %] USD\" class=\"currency\">[% region.monthGb*10   FILTER format(\"%.2f\") %]</td>\n\t\t<td title=\"Costs for 375 GB [% disk.name %] per month: [% region.monthGb %] USD\" class=\"currency\">[% region.monthGb*375 FILTER format(\"%.2f\") %]</td>\n\t\t<td title=\"Costs for 500 GB [% disk.name %] per month: [% region.monthGb %] USD\" class=\"currency\">[% region.monthGb*500 FILTER format(\"%.2f\") %]</td>\n\t\t[% ELSE %]\n\t\t<td>???</td>\n\t\t<td>???</td>\n\t\t<td>???</td>\n\t\t<td>???</td>\n\t\t[% END %]\n\t</tr>\n\t[% END %]\n</tbody>\n</table>\n</div><!-- table-responsive -->\n\n[% PROCESS footer.tt2 %]"
  },
  {
    "path": "build/src/diskpricing.tt2",
    "content": "[%- PROCESS header.tt2 -%]\n[%- PROCESS regions_header.tt2 -%]\n\n<h1>Persistent Disk Pricing in Google Cloud Regions</h1>\n\n<blockquote class=\"blockquote\">\n<p>\nEach Google Compute Engine machine type (VM instance) has at least one boot disk attached to it.\nEach disk incurs a cost, described in this overview.\nBreakdown by price per GB and minimum capacity per disk.\n</p>\n</blockquote>\n\n<p>\n\t<a class=\"btn btn-success\" href=\"/map.html\" role=\"button\">🗺️ Region Map</a>\n\t<a class=\"btn btn-secondary\" href=\"https://gcping.com/\" role=\"button\" rel=\"nofollow\" title=\"Measure your latency to Google Cloud regions\">⏱️ Ping</a>\n</p>\n\n<div class=\"table-responsive\">\n<table\n\tclass=\"table table-sm table-hover table-bordered\"\n\tdata-classes=\"table table-sm table-hover table-bordered\"\n\tdata-toggle=\"table\"\n\tdata-sort-name=\"name\"\n\tdata-sort-order=\"asc\"\n\tdata-sortable=\"true\"\n\tdata-sticky-header=\"true\"\n>\n<thead>\n\t<tr>\n\t\t<th scope=\"col\" colspan=\"2\">Region</th>\n\t\t<th scope=\"col\">Zones</th>\n\t\t<th scope=\"col\" colspan=\"2\" title=\"Efficient and reliable block storage. Minimum capacity per disk: 10 GB\">Standard</th>\n\t\t<th scope=\"col\" colspan=\"2\" title=\"Cost-effective and reliable block storage. Minimum capacity per disk: 10 GB\">Balanced</th>\n\t\t<th scope=\"col\" colspan=\"2\" title=\"Fast and reliable block storage. Minimum capacity per disk: 10 GB\">SSD</th>\n\t\t<th scope=\"col\" colspan=\"2\" title=\"Highest performance persistent block storage option. Minimum capacity per disk: 500 GB\">Extreme</th>\n\t\t<th scope=\"col\" colspan=\"2\" title=\"High performance local block storage. Minimum and maximum capacity per disk: 375 GB\">Local SSD</th>\n\t</tr>\n\t<tr>\n\t\t<!-- Region -->\n\t\t<th scope=\"col\" data-field=\"name\" data-sortable=\"true\">Name</th>\n\t\t<th scope=\"col\" data-sortable=\"true\">Location</th>\n\t\t<!-- Zones -->\n\t\t<th scope=\"col\" data-sortable=\"true\">#</th>\n\t\t<!-- Standard -->\n\t\t<th scope=\"col\" data-sortable=\"true\">1 GB</th>\n\t\t<th scope=\"col\" data-sortable=\"true\">10 GB</th>\n\t\t<!-- Balanced -->\n\t\t<th scope=\"col\" data-sortable=\"true\">1 GB</th>\n\t\t<th scope=\"col\" data-sortable=\"true\">10 GB</th>\n\t\t<!-- SSD -->\n\t\t<th scope=\"col\" data-sortable=\"true\">1 GB</th>\n\t\t<th scope=\"col\" data-sortable=\"true\">10 GB</th>\n\t\t<!-- Extreme -->\n\t\t<th scope=\"col\" data-sortable=\"true\">1 GB</th>\n\t\t<th scope=\"col\" data-sortable=\"true\">500 GB</th>\n\t\t<!-- Local SSD -->\n\t\t<th scope=\"col\" data-sortable=\"true\">1 GB</th>\n\t\t<th scope=\"col\" data-sortable=\"true\">375 GB</th>\n\t</tr>\n</thead>\n<tbody>\n\t[% FOREACH region IN disks_regions %]\n\t<tr>\n\t\t<td><a href=\"/[% region.name %].html\" title=\"Google Cloud region [% region.name %]\">[% region.name %]</a></td>\n\t\t<td>[% IF region.regionLocation %][% region.regionLocation %][% ELSE %]<span class=\"text-muted\">?</span>[% END %]</td>\n\t\t<td>[% region.zoneCount %]</td>\n\t\t<!-- Standard -->\n\t\t[% IF region.standard %]\n\t\t<td title=\"Costs for 1 GB standard persistent disk per month in region [% region.name %]: [% region.standard %] USD\" class=\"currency\">[% region.standard %]</td>\n\t\t<td title=\"Costs for 10 GB standard persistent disk per month in region [% region.name %]: [% region.standard*10 FILTER format(\"%.2f\") %] USD\" class=\"currency\">[% region.standard*10 FILTER format(\"%.2f\") %]</td>\n\t\t[% ELSE %]\n\t\t<td class=\"table-warning\">-</td>\n\t\t<td class=\"table-warning\">-</td>\n\t\t[% END %]\n\t\t<!-- Balanced -->\n\t\t[% IF region.balanced %]\n\t\t<td title=\"Costs for 1 GB balanced persistent disk per month in region [% region.name %]: [% region.balanced %] USD\" class=\"currency\">[% region.balanced %]</td>\n\t\t<td title=\"Costs for 10 GB balanced persistent disk per month in region [% region.name %]: [% region.balanced*10 FILTER format(\"%.2f\") %] USD\" class=\"currency\">[% region.balanced*10 FILTER format(\"%.2f\") %]</td>\n\t\t[% ELSE %]\n\t\t<td class=\"table-warning\">-</td>\n\t\t<td class=\"table-warning\">-</td>\n\t\t[% END %]\n\t\t<!-- SSD -->\n\t\t[% IF region.ssd %]\n\t\t<td title=\"Costs for 1 GB SSD persistent disk per month in region [% region.name %]: [% region.ssd %] USD\" class=\"currency\">[% region.ssd %]</td>\n\t\t<td title=\"Costs for 10 GB SSD persistent disk per month in region [% region.name %]: [% region.ssd*10 FILTER format(\"%.2f\") %] USD\" class=\"currency\">[% region.ssd*10 FILTER format(\"%.2f\") %]</td>\n\t\t[% ELSE %]\n\t\t<td class=\"table-warning\">-</td>\n\t\t<td class=\"table-warning\">-</td>\n\t\t[% END %]\n\t\t<!-- Extreme -->\n\t\t[% IF region.extreme %]\n\t\t<td title=\"Costs for 1 GB extreme persistent disk per month in region [% region.name %]: [% region.extreme %] USD\" class=\"currency\">[% region.extreme %]</td>\n\t\t<td title=\"Costs for 500 GB extreme persistent disk per month in region [% region.name %]: [% region.extreme*500 FILTER format(\"%.2f\") %] USD\" class=\"currency\">[% region.extreme*500 FILTER format(\"%.2f\") %]</td>\n\t\t[% ELSE %]\n\t\t<td class=\"table-warning\">-</td>\n\t\t<td class=\"table-warning\">-</td>\n\t\t[% END %]\n\t\t<!-- Local SSD -->\n\t\t[% IF region.local %]\n\t\t<td title=\"Costs for 1 GB local SSD disk per month in region [% region.name %]: [% region.local %] USD\" class=\"currency\">[% region.local %]</td>\n\t\t<td title=\"Costs for 375 GB local SSD disk per month in region [% region.name %]: [% region.local*375 FILTER format(\"%.2f\") %] USD\" class=\"currency\">[% region.local*375 FILTER format(\"%.2f\") %]</td>\n\t\t[% ELSE %]\n\t\t<td class=\"table-warning\">-</td>\n\t\t<td class=\"table-warning\">-</td>\n\t\t[% END %]\n\t</tr>\n\t[% END %]\n</tbody>\n</table>\n</div><!-- table-responsive -->\n[% PROCESS footer.tt2 %]"
  },
  {
    "path": "build/src/disks.js",
    "content": "const options = {\n\tcontainer: document.getElementById('myChart'),\n\tautoSize: true,\n\ttitle: {\n\t\ttext: 'Performance by Disk Size',\n\t\tenabled: false\n\t},\n\tdata: [\n\t{\n\t\tsize: '10 GB',\n\t\t// HDD\n\t\thdd_read: 0,\n\t\thdd_write: 0,\n\t\t// SSD\n\t\tssd_read: 4.8,\n\t\tssd_write: 4.8\n\t},\n\t{\n\t\tsize: '32 GB',\n\t\t// HDD\n\t\thdd_read: 3,\n\t\thdd_write: 3,\n\t\t// SSD\n\t\tssd_read: 15,\n\t\tssd_write: 15\n\t},\n\t{\n\t\tsize: '64 GB',\n\t\t// HDD\n\t\thdd_read: 7,\n\t\thdd_write: 7,\n\t\t// SSD\n\t\tssd_read: 30,\n\t\tssd_write: 30\n\t},\n\t{\n\t\tsize: '128 GB',\n\t\t// HDD\n\t\thdd_read: 15,\n\t\thdd_write: 15,\n\t\t// SSD\n\t\tssd_read: 61,\n\t\tssd_write: 61\n\t},\n\t{\n\t\tsize: '256 GB',\n\t\t// HDD\n\t\thdd_read: 30,\n\t\thdd_write: 30,\n\t\t// SSD\n\t\tssd_read: 122,\n\t\tssd_write: 122\n\t},\n\t{\n\t\tsize: '500 GB',\n\t\t// HDD\n\t\thdd_read: 60,\n\t\thdd_write: 60,\n\t\t// SSD\n\t\tssd_read: 240,\n\t\tssd_write: 240\n\t},\n\t{\n\t\tsize: '1 TB',\n\t\t// HDD\n\t\thdd_read: 120,\n\t\thdd_write: 120,\n\t\t// SSD\n\t\tssd_read: 480,\n\t\tssd_write: 480\n\t},\n\t{\n\t\tsize: '2 TB',\n\t\t// HDD\n\t\thdd_read: 245,\n\t\thdd_write: 245,\n\t\t// SSD\n\t\tssd_read: 983,\n\t\tssd_write: 983\n\t},\n\t{\n\t\tsize: '4 TB',\n\t\t// HDD\n\t\thdd_read: 480,\n\t\thdd_write: 400,\n\t\t// SSD\n\t\tssd_read: 1200,\n\t\tssd_write: 1200\n\t},\n\t{\n\t\tsize: '5 TB',\n\t\t// HDD\n\t\thdd_read: 600,\n\t\thdd_write: 400,\n\t\t// SSD\n\t\tssd_read: 1200,\n\t\tssd_write: 1200\n\t},\n\t{\n\t\tsize: '8 TB',\n\t\t// HDD\n\t\thdd_read: 983,\n\t\thdd_write: 400,\n\t\t// SSD\n\t\tssd_read: 1200,\n\t\tssd_write: 1200\n\t},\n\t{\n\t\tsize: '10 TB',\n\t\t// HDD\n\t\thdd_read: 1200,\n\t\thdd_write: 400,\n\t\t// SSD\n\t\tssd_read: 1200,\n\t\tssd_write: 1200\n\t}\n\t],\n\tseries: [\n\t\t{\n\t\t\txKey: 'size',\n\t\t\tyKey: 'hdd_write',\n\t\t\tyName: 'Standard Write (MBps)',\n\t\t\tstroke: '#20c997',\n\t\t\tmarker: {\n\t\t\t\tshape: 'square',\n\t\t\t\tfill: '#20c997',\n\t\t\t\tstroke: '#20c997',\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\txKey: 'size',\n\t\t\tyKey: 'hdd_read',\n\t\t\tyName: 'Standard Read (MBps)',\n\t\t\tstroke: '#198754',\n\t\t\tmarker: {\n\t\t\t\tshape: 'square',\n\t\t\t\tfill: '#198754',\n\t\t\t\tstroke: '#198754',\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\txKey: 'size',\n\t\t\tyKey: 'ssd_write',\n\t\t\tyName: 'SSD Write (MBps)',\n\t\t\tstroke: '#6610f2',\n\t\t\tmarker: {\n\t\t\t\tshape: 'circle',\n\t\t\t\tfill: '#6610f2',\n\t\t\t\tstroke: '#6610f2',\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\txKey: 'size',\n\t\t\tyKey: 'ssd_read',\n\t\t\tyName: 'SSD Read (MBps)',\n\t\t\tstroke: '#6f42c1',\n\t\t\tmarker: {\n\t\t\t\tshape: 'circle',\n\t\t\t\tfill: '#6f42c1',\n\t\t\t\tstroke: '#6f42c1',\n\t\t\t},\n\t\t},\n\t],\n\taxes: [\n\t\t{\n\t\t\ttype: 'category',\n\t\t\tposition: 'bottom',\n\t\t\ttitle: {\n\t\t\t\ttext: 'Disk Size',\n\t\t\t\tenabled: false,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttype: 'number',\n\t\t\tposition: 'left',\n\t\t\ttitle: {\n\t\t\t\ttext: 'Sustained throughput (MBps)',\n\t\t\t\tenabled: false,\n\t\t\t},\n\t\t\tlabel: {\n\t\t\t\tformatter: function (params) { return params.value + ' MBps'; },\n\t\t\t},\n\t\t},\n\t],\n\tlegend: {\n\t\tenabled: true,\n\t\tposition: 'bottom'\n\t},\n};\n\nagCharts.AgChart.create(options);"
  },
  {
    "path": "build/src/disks.tt2",
    "content": "[%- PROCESS header.tt2 -%]\n\n<h1>Google Compute Engine Persistent Disk Types</h1>\n\n<blockquote class=\"blockquote\">\n<p>\nGoogle Compute Engine offers <mark>[% disks.size %]</mark> disk types for your instances.\nEach of the following disk types has unique price and performance characteristics.\n</p>\n</blockquote>\n\n<div class=\"table-responsive\">\n<table\n\tclass=\"table table-hover table-bordered\"\n\tdata-toggle=\"table\"\n\tdata-sort-name=\"1gb\"\n\tdata-sort-order=\"asc\"\n\tdata-sortable=\"true\"\n\tdata-sticky-header=\"false\"\n>\n<thead>\n\t<tr>\n\t\t<th scope=\"col\" colspan=\"3\">Disk Type</th>\n\t\t<th scope=\"col\">Region</th>\n\t\t<th scope=\"col\" colspan=\"3\">Costs (Avg. Region)</th>\n\t</tr>\n\t<tr>\n\t\t<th scope=\"col\" data-field=\"name\" data-sortable=\"true\">Name</th>\n\t\t<th scope=\"col\">Description</th>\n\t\t<th scope=\"col\" title=\"Minimum capacity per disk\">Min. Disk Size</th>\n\t\t<th scope=\"col\" data-sortable=\"true\">#</th>\n\t\t<th scope=\"col\" data-field=\"1gb\" data-sortable=\"true\">1 GB</th>\n\t\t<th scope=\"col\" data-sortable=\"true\">10 GB</th>\n\t\t<th scope=\"col\" data-sortable=\"true\">500 GB</th>\n\t</tr>\n</thead>\n<tbody>\n[%-\nFOREACH disk IN disks;\nminDiskSize = 10;\nIF disk.name == 'pd-extreme'; minDiskSize = 500; END;\nIF disk.name == 'local-ssd';  minDiskSize = 375; END;\n-%]\n<tr>\n\t<td><a href=\"/[% disk.name %].html\" title=\"Persistent disk type [% disk.name %]\">[% disk.name %]</a></td>\n\t<td>[% disk.description %]</td>\n\t[% IF minDiskSize %]<td [% IF minDiskSize > 400 %]class=\"table-danger\"[% ELSIF minDiskSize > 300 %]class=\"table-warning\"[% END %]>[% minDiskSize %] GB</td>[% ELSE %]<td>???</td>[% END %]\n\t<td>[% disk.regionCount %]</td>\n\t[% IF disk.avgMonth %]\n\t<td title=\"Avg. costs for 1 GB [% disk.name %] per month: [% disk.avgMonth %] USD\" class=\"currency\">[% disk.avgMonth %]</td>\n\t<td title=\"Avg. costs for 10 GB [% disk.name %] per month: [% disk.avgMonth %] USD\" class=\"currency\">[% disk.avgMonth*10  FILTER format(\"%.2f\") %]</td>\n\t<td title=\"Avg. costs for 500 GB [% disk.name %] per month: [% disk.avgMonth %] USD\" class=\"currency\">[% disk.avgMonth*500 FILTER format(\"%.2f\") %]</td>\n\t[% ELSE %]\n\t<td>???</td>\n\t<td>???</td>\n\t<td>???</td>\n\t[% END %]\n</tr>\n[%- END -%]\n</tbody>\n</table>\n</div> <!-- // table-responsive -->\n\n<h2 class=\"mt-2\">Performance by Disk Size</h2>\n\n<p>\nPersistent disk performance scales with the size of the disk and with the number of vCPUs on your Google Compute Engine VM instance.\nThe <a href=\"https://cloud.google.com/compute/docs/disks/performance\" rel=\"nofollow\"> Google documentation</a> explains the whole concept very detailed.\nThe following graphic is only meant to give a quick overview.\n</p>\n\n<div id=\"myChart\" style=\"height: 400px\"></div>\n<script src=\"[% site.agCharts.js %]\"></script>\n<script src=\"/disks.js\">\n</script>\n\n[% PROCESS footer.tt2 %]"
  },
  {
    "path": "build/src/download.tt2",
    "content": "[%- PROCESS header.tt2 -%]\n\n</div> <!-- // container-fluid -->\n<div class=\"container\">\n\n<h1>Download</h1>\n\n<p>\nYou can download a <a href=\"/machine-types-regions.csv?[% timestamp %]\" download=\"machine-types-regions.csv\">CSV</a> file ([% csvFileSize %] MB)\nand <a href=\"/machine-types-regions.sql.gz?[% timestamp %]\" download=\"machine-types-regions.sql.gz\">SQL</a> export ([% sqlFileSize %] MB, gzip compressed) with all machine types, disk types, operating system images, Google Cloud regions and zones.\nYou can import and edit the CSV file to your favorite spreadsheet program (MS Excel, LibreOffice or Google Sheets).\nYou can import the SQL dump into your favorite database (like SQLite).\n</p>\n\n<h2>Spreadsheet</h2>\n<p>Comma Separated Values (CSV) file with GCE machine types and Google Cloud regions.</p>\n<p><a class=\"btn btn-primary\" href=\"/machine-types-regions.csv?[% timestamp %]\" download=\"machine-types-regions.csv\">Download CSV ([% csvFileSize %] MB)</a><p>\n\n<h2>Database</h2>\n<p>Gzip compressed Structured Query Language (SQL) export with GCE machine types, disk types, operating system images, Google Cloud regions and zones.</p>\n<p><a class=\"btn btn-primary\" href=\"/machine-types-regions.sql.gz?[% timestamp %]\" download=\"machine-types-regions.sql.gz\">Download SQL ([% sqlFileSize %] MB)</a><p>\n\n<h2>Command Line</h2>\n\n<p>With the SQL export you can also do great queries using the command line (CLI).</p>\n\n<pre class=\"bg-light\"><code><span class=\"text-muted\"># Download CSV file</span>\ncurl -O [% site.url %]/machine-types-regions.csv\n<span class=\"text-muted\"># Search CSV and count</span>\ngrep <span class=\"text-primary\">'europe-west4'</span> &lt; machine-types-regions.csv | wc -l\n<span class=\"text-muted\"># Download SQL export</span>\ncurl -O [% site.url %]/machine-types-regions.sql.gz\n<span class=\"text-muted\"># Decompress SQL export</span>\ngzip -d machine-types-regions.sql.gz\n<span class=\"text-muted\"># Import SQL dump</span>\nsqlite3 gce.db &lt; machine-types-regions.sql\n<span class=\"text-muted\"># SQL query Google Cloud machine types (instances)</span>\nsqlite3 gce.db <span class=\"text-primary\">&#39;SELECT name, vCpus, hour FROM instances WHERE vCpus &gt;= 8 AND region LIKE &quot;europe-west4&quot; ORDER BY hour ASC LIMIT 5&#39;</span></code></pre>\n\n<p>Example SQL output:</p>\n<pre class=\"bg-light\"><code>e2-highcpu-8|8.0|0.21785232\nn2d-highcpu-8|8.0|0.274688\ne2-standard-8|8.0|0.29508816\nn1-highcpu-8|8.0|0.3119968\nn2-highcpu-8|8.0|0.315728</code></pre>\n\n<h2>Open Source</h2>\n\n<p>\n\tEverything you see here is published as open source software and licensed under the Apache License (version 2.0).\n\tYou can find the source code on <a href=\"[% site.github.repo %]\">GitHub</a>.\n\tAny improvements and pull requests are welcome.\n</p>\n\n[%- PROCESS footer.tt2 -%]"
  },
  {
    "path": "build/src/favicon.tt2",
    "content": "<link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"/apple-touch-icon.png\">\n<link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/favicon-32x32.png\">\n<link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/favicon-16x16.png\">\n<link rel=\"manifest\" href=\"/site.webmanifest\">"
  },
  {
    "path": "build/src/footer.tt2",
    "content": "</div> <!-- // container -->\n</main>\n<footer class=\"footer py-3 bg-light mt-2\">\n<div class=\"container-fluid\">\n<p class=\"text-muted\">\n\tCopyright [% USE date; date.format(date.now, '%Y'); %] <a href=\"https://www.nkn-it.de/\">Nils Knieling</a>\n\t·\n\tAll rights reserved\n</p>\n<p class=\"text-muted\">\n\tThe accuracy of the data is not guaranteed. Please <a href=\"[% site.github.issues %]\">report issues</a> you see.\n\tPortions of this webapp are modifications based on work created and shared by <a href=\"https://developers.google.com/readme/policies\">Google</a>\n\tand used according to terms described in the <a href=\"https://creativecommons.org/licenses/by/4.0/\">Creative Commons 4.0 Attribution License</a>.\n</p>\n<p class=\"text-muted small\">\n\tLast Update: [% gmtime %] (GMT)\n\t·\n\t<a href=\"/imprint.html\">Imprint</a>\n\t·\n\t<a href=\"https://www.nkn-it.de/dsgvo.html\">Datenschutz</a>\n</p>\n</div> <!-- // container -->\n</footer>\n\n<script src=\"[% site.bootstrap.js %]\"></script>\n<script src=\"[% site.jQuery.js %]\"></script>\n<script src=\"[% site.bootstrapTable.js %]\"></script>\n<script src=\"[% site.bootstrapTableStickyHeader.js %]\"></script>\n<script src=\"/popin-min.js\"></script>\n<script>\nif(!document.getElementById('i59UOEcRSLY1gwtC')){\n\tconst alertDiv = document.getElementById('pleaseDisableYourAdBlocker');\n\talertDiv.className = 'alert alert-danger mt-2';\n\talertDiv.role = 'alert';\n\talertDiv.innerHTML = `\n\t<strong>Hi there! It looks like you're using an ad blocker.</strong>\n\tI put a lot of heart and soul into keeping this site updated,\n\tbut the servers and coffee that power it aren't free!\n\tAds are the primary way I cover these costs and keep everything running for you.\n\tWould you mind whitelisting this site?\n\tIt is a huge help.\n\tThank you for your support!\n\t`;\n}\n</script>\n</body>\n</html>"
  },
  {
    "path": "build/src/gcosts.tt2",
    "content": "[%- PROCESS header.tt2 -%]\n\n</div> <!-- // container-fluid -->\n<div class=\"container\">\n\n<h1>Google Cloud Platform Pricing and Cost Calculator</h1>\n\n<p>\nCalculate estimated monthly costs of Google Cloud Platform products and resources on your local computer.\nOptimized for DevOps, architects and engineers to quickly see a cost breakdown and compare different options upfront:\n</p>\n\n<ul>\n\t<li>Mapping of resource usage is done in easy to learn YAML usage files</li>\n\t<li>Price information is read from a local file</li>\n\t<li>Calculation is done via <code>gcosts</code> CLI program</li>\n\t<li>Calculated costs are saved in CSV file optimized for non-technical audience</li>\n</ul>\n\n<p>\nFull control and no disclosure of any information and costs to third parties.\nEverything is calculated on your local computer.\nNo need to have a connection to the Internet.\nEverything tested and matched against the actual invoice in large Google Cloud migration projects.\n\n<p>\n<code>gcosts</code> works on various OS and terminals, including Linux, macOS and Windows.\n</p>\n\n<div class=\"row\">\n\t<div class=\"col-xl-4\">\n\t\t<p class=\"fw-bolder\">1. Create YAML file</p>\n\t\t<p><img src=\"/img/usage.png?[% timestamp %]\" alt=\"Screenshot: Create YAML file\" class=\"img-fluid\"></p>\n\t</div>\n\t<div class=\"col-xl-4\">\n\t\t<p class=\"fw-bolder\">2. Run gcosts CLI program</p>\n\t\t<p><img src=\"/img/gcosts.png?[% timestamp %]\" alt=\"Screenshot: Run gcosts CLI program\" class=\"img-fluid\"></p>\n\t</div>\n\t<div class=\"col-xl-4\">\n\t\t<p class=\"fw-bolder\">3. Open CSV file</p>\n\t\t<p><img src=\"/img/csv.png?[% timestamp %]\" alt=\"Screenshot: Open CSV file\" class=\"img-fluid\"></p>\n\t</div>\n</div>\n\n<h2>Download</h2>\n<p>\n\tThe <code>gcosts</code> pricing and cost calculator is Open Source software and free to use.\n\tYou can find a detailed documentation and all download options on\n\t<a href=\"https://github.com/Cyclenerd/google-cloud-pricing-cost-calculator#readme\">GitHub</a>.\n</p>\n\n<p>\n\t<a class=\"btn btn-lg btn-warning\" href=\"https://github.com/Cyclenerd/google-cloud-pricing-cost-calculator#-quick-start\">Linux</a>\n\t<a class=\"btn btn-lg btn-dark\" href=\"https://github.com/Cyclenerd/google-cloud-pricing-cost-calculator#-quick-start\">macOS</a>\n\t<a class=\"btn btn-lg btn-success\" href=\"https://github.com/Cyclenerd/google-cloud-pricing-cost-calculator#-quick-start\">Windows</a>\n<p>\n\n<h2>Awarded</h2>\n\n<p>\nThis project was the winner of the\n<a href=\"https://opensource.googleblog.com/2022/09/announcing-the-second-group-of-open-source-peer-bonus-winners-in-2022.html\">Google Open Source Peer Bonus</a>\nin 2022.\n<p>\n\n[%- PROCESS footer.tt2 -%]"
  },
  {
    "path": "build/src/gpu.tt2",
    "content": "[%- PROCESS header.tt2 -%]\n[%- PROCESS instances_header.tt2 -%]\n\n<h1>Google Compute Engine Machine Types with Graphics Processing Units (GPUs)</h1>\n\n[%- countGpu = 0; FOREACH instance IN instances; IF instance.acceleratorCount && instance.acceleratorCount > 0; countGpu = countGpu + 1; END; END -%]\n<blockquote class=\"blockquote\">\n<p>\nThere are <mark>[% countGpu %]</mark> Google Compute Engine machine types with graphics processing units (GPUs) available.\nNot every GCE machine type with GPU is available in every Google Cloud region.\n</p>\n</blockquote>\n\n<p><a class=\"btn btn-success\" href=\"/grid.html?gpu=1\" role=\"button\">✅ Instance Picker with filter on GPUs</a></p>\n\n<div class=\"table-responsive\">\n[%- PROCESS instances_tr.tt2; -%]\n<table\n\tclass=\"table table-sm table-hover table-bordered\"\n\tdata-classes=\"table table-sm table-hover table-bordered\"\n\tdata-toggle=\"table\"\n\tdata-sort-name=\"gpus\"\n\tdata-sort-order=\"asc\"\n\tdata-sortable=\"true\"\n\tdata-sticky-header=\"true\"\n>\n<thead>\n\t<tr>\n\t\t<th scope=\"col\" colspan=\"7\">Machine Type</th>\n\t\t<!-- Regions -->\n\t\t<th scope=\"col\">Regions</th>\n\t\t<!-- Costs -->\n\t\t<th scope=\"col\" colspan=\"5\">Costs (Avg. Region)</th>\n\t</tr>\n\t<tr>\n\t\t<th scope=\"col\" data-sortable=\"true\">Name</th>\n\t\t<th scope=\"col\" data-field=\"vcpu\" data-sortable=\"true\">vCPU</th>\n\t\t<th scope=\"col\" data-sortable=\"true\">Base Clock</th>\n\t\t<th scope=\"col\" data-sortable=\"true\">Memory</th>\n\t\t<th scope=\"col\" data-field=\"gpus\" data-sortable=\"true\">GPUs</th>\n\t\t<th scope=\"col\" data-sortable=\"true\">Type</th>\n\t\t<th scope=\"col\"></th>\n\t\t<!-- Regions -->\n\t\t<th scope=\"col\">#</th>\n\t\t<!-- Costs -->\n\t\t<th scope=\"col\" data-sortable=\"true\">Hour</th>\n\t\t<th scope=\"col\" data-sortable=\"true\">Spot</th>\n\t\t<th scope=\"col\" data-sortable=\"true\">Month</th>\n\t\t<th scope=\"col\" data-sortable=\"true\">1Y CUD</th>\n\t\t<th scope=\"col\" data-sortable=\"true\">3Y CUD</th>\n\t</tr>\n</thead>\n<tbody>\n[%- FOREACH instance IN instances; IF instance.acceleratorCount && instance.acceleratorCount > 0; -%]\n\t<tr>\n\t\t<td><a href=\"[% instance.name %].html\" title=\"Google Compute Engine machine type [% instance.name %]\">[% instance.name %]</a></td>\n\t\t<td class=\"text-nowrap\">[% instance.vCpus %][% badgeSharedCpu(instance) %]</td>\n\t\t<td class=\"frequency\" title=\"CPU base clock frequency: [% instance.cpuBaseClock %] GHz\">[% instance.cpuBaseClock %]</td>\n\t\t<td class=\"memory\" title=\"Random-access memory: [% instance.memoryGB %] GB\">[% instance.memoryGB %]</td>\n\t\t<td title=\"Accelerator (GPUs): [% instance.acceleratorCount %]\">[% instance.acceleratorCount %]</td>\n\t\t<td title=\"Accelerator Type: [% instance.acceleratorType %]\">[% instance.acceleratorType %]</td>\n\t\t<td>\n\t\t\t[% badgeCpuManufactur(instance) %]\n\t\t\t[% badgeSpot(instance) %]\n\t\t\t[% badgeSud(instance) %]\n\t\t\t[% badgeLocalSsd(instance) %]\n\t\t</td>\n\t\t<!-- Regions -->\n\t\t<td>[% instance.regionCount %]</td>\n\t\t<!-- Costs -->\n\t\t<td class=\"currency\" title=\"[% instance.name %] avg. per hour: [% instance.avgHour %] USD\">[% instance.avgHour %]</td>\n\t\t<td class=\"currency\" title=\"[% instance.name %] avg. costs per hour with spot provisioning model (Spot VM): [% instance.avgHourSpot %] USD\">[% instance.avgHourSpot %]</td>\n\t\t<td class=\"currency\" title=\"[% instance.name %] avg. costs per month: [% instance.avgMonth %] USD[% IF instance.sud %] with sustained use discounts (SUD) applied[% END %]\">[% instance.avgMonth %]</td>\n\t\t<td class=\"currency\" title=\"[% instance.name %] avg. per month w. 1Y CUD: [% instance.avgMonth1yCud %] USD\">[% instance.avgMonth1yCud %]</td>\n\t\t<td class=\"currency\" title=\"[% instance.name %] avg. per month w. 3Y CUD: [% instance.avgMonth3yCud %] USD\">[% instance.avgMonth3yCud %]</td>\n\t</tr>\n[% END; END; %]\n</tbody>\n</table>\n</div> <!-- // table-responsive -->\n[% PROCESS footer.tt2 %]"
  },
  {
    "path": "build/src/grid.tt2",
    "content": "<!doctype html>\n<html lang=\"en\">\n<head>\n<title>GCE Instance Picker</title>\n<link rel=\"canonical\" href=\"[% site.url %]/grid.html\">\n[% PROCESS favicon.tt2 %]\n<link rel=\"stylesheet\" href=\"[% site.agGrid.css %]\">\n<link rel=\"stylesheet\" href=\"[% site.agGrid.theme %]\">\n<style>\nhtml              { width: 100%; height: 100%; }\nbody              { width: 100%; height: 100%; margin: 0; padding: 0; }\n.frequency::after { content: \" GHz\"; }\n.currency::before { content: \"$\"; }\n.percent::after   { content: \"%\"; }\n.bandwidth::after { content: \" Gbps\"; }\n.diskSize::after  { content: \" TB\"; }\n.memory::after    { content: \" GB\"; }\n.warning::before  { content: \"⚠️ \"; }\n.sharedCpu::after { content: \" (shared)\"; }\n</style>\n<meta charset=\"utf-8\">\n<meta name=\"robots\" content=\"noindex, nofollow\">\n<script src=\"[% site.agGrid.js %]\"></script>\n</head>\n<body>\n<div id=\"myGrid\" class=\"ag-theme-balham\" style=\"height: 100%; width:100%\"></div>\n<script src=\"main.js?[% timestamp %]\"></script>\n</body>\n</html>"
  },
  {
    "path": "build/src/hana.tt2",
    "content": "[%- PROCESS header.tt2 -%]\n[%- PROCESS instances_header.tt2 -%]\n\n<h1>Certified for SAP HANA on Google Cloud Platform</h1>\n\n[%- countSAP = 0; FOREACH instance IN instances; IF instance.hana; countSAP = countSAP + 1; END; END -%]\n<blockquote class=\"blockquote\">\n<p>\nThere are <mark>[% countSAP %]</mark> Google Compute Engine machine types certified for SAP HANA on Google Cloud Platform.\nNot every certified Google Cloud VM is available in every region.\n</p>\n</blockquote>\n\n<p><a class=\"btn btn-success\" href=\"/grid.html?hana=1\" role=\"button\">✅ Instance Picker with filter on SAP HANA</a></p>\n\n<div class=\"table-responsive\">\n<table\n\tclass=\"table table-sm table-hover table-bordered\"\n\tdata-classes=\"table table-sm table-hover table-bordered\"\n\tdata-toggle=\"table\"\n\tdata-sort-name=\"vcpu\"\n\tdata-sort-order=\"asc\"\n\tdata-sortable=\"true\"\n\tdata-sticky-header=\"true\"\n>\n<thead>\n\t<tr>\n\t\t<th scope=\"col\" colspan=\"6\">Machine Type</th>\n\t\t<th scope=\"col\">Regions</th>\n\t\t<th scope=\"col\" colspan=\"4\">Costs (Avg. Region)</th>\n\t\t<th scope=\"col\" colspan=\"2\">OS with 3Y CUD</th>\n\t</tr>\n\t<tr>\n\t\t<th scope=\"col\" data-sortable=\"true\">Name</th>\n\t\t<th scope=\"col\" data-field=\"vcpu\" data-sortable=\"true\">vCPU</th>\n\t\t<th scope=\"col\" data-sortable=\"true\">Base Clock</th>\n\t\t<th scope=\"col\" data-sortable=\"true\">Memory</th>\n\t\t<th scope=\"col\" data-sortable=\"true\">SAPS</th>\n\t\t<th scope=\"col\"></th>\n\t\t<th scope=\"col\">#</th>\n\t\t<!-- Costs -->\n\t\t<th scope=\"col\" data-sortable=\"true\">Hour</th>\n\t\t<th scope=\"col\" data-sortable=\"true\">Month</th>\n\t\t<th scope=\"col\" data-sortable=\"true\">1Y CUD</th>\n\t\t<th scope=\"col\" data-sortable=\"true\">3Y CUD</th>\n\t\t<!-- OS -->\n\t\t<th scope=\"col\">SLES for SAP</th>\n\t\t<th scope=\"col\">RHEL for SAP</th>\n\t</tr>\n</thead>\n<tbody>\n\t[% FOREACH instance IN instances; IF instance.hana; %]\n\t<tr>\n\t\t<td><a href=\"[% instance.name %].html\" title=\"Google Compute Engine machine type [% instance.name %]\">[% instance.name %]</a></td>\n\t\t<td class=\"text-nowrap\">[% instance.vCpus %][% badgeSharedCpu(instance) %]</td>\n\t\t<td class=\"frequency\" title=\"CPU base clock frequency: [% instance.cpuBaseClock %] GHz\">[% instance.cpuBaseClock %]</td>\n\t\t<td class=\"memory\" title=\"Random-access memory: [% instance.memoryGB %] GB\">[% instance.memoryGB %]</td>\n\t\t<td title=\"SAP Standard Benchmark: [% instance.saps %]\">[% instance.saps %]</td>\n\t\t<td>\n\t\t\t[% badgeCpuManufactur(instance) %]\n\t\t\t[% badgeSpot(instance) %]\n\t\t\t[% badgeSud(instance) %]\n\t\t\t[% badgeLocalSsd(instance) %]\n\t\t</td>\n\t\t<td>[% instance.regionCount %]</td>\n\t\t<!-- Costs -->\n\t\t<td class=\"currency\" title=\"[% instance.name %] avg. per hour: [% instance.avgHour %] USD\">[% instance.avgHour %]</td>\n\t\t<td class=\"currency\" title=\"[% instance.name %] avg. costs per month: [% instance.avgMonth %] USD[% IF instance.sud %] with sustained use discounts (SUD) applied[% END %]\">[% instance.avgMonth %]</td>\n\t\t<td class=\"currency\" title=\"[% instance.name %] avg. per month w. 1Y CUD: [% instance.avgMonth1yCud %] USD\">[% instance.avgMonth1yCud %]</td>\n\t\t<td class=\"currency\" title=\"[% instance.name %] avg. per month w. 3Y CUD: [% instance.avgMonth3yCud %] USD\">[% instance.avgMonth3yCud %]</td>\n\t\t<!-- OS -->\n\t\t<td class=\"currency\" title=\"[% instance.name %] license costs for SUSE Linux Enterprise Server for SAP with 3 year CUD: [% instance.monthSlesSap3yCud %] USD\">[% instance.monthSlesSap3yCud %]</td>\n\t\t<td class=\"currency\" title=\"[% instance.name %] license costs for Red Hat Enterprise Linux for SAP with 3 year CUD: [% instance.monthRhelSap3yCud %] USD\">[% instance.monthRhelSap3yCud %]</td>\n\t</tr>\n\t[% END; END; %]\n</tbody>\n</table>\n</div> <!-- // table-responsive -->\n[% PROCESS footer.tt2 %]"
  },
  {
    "path": "build/src/header.tt2",
    "content": "<!doctype html>\n<html lang=\"en\">\n<head>\n[% PROCESS meta.tt2; %]\n[% PROCESS favicon.tt2 %]\n<link rel=\"stylesheet\" href=\"[% site.bootstrap.css %]\">\n<link rel=\"stylesheet\" href=\"[% site.bootstrapTable.css %]\">\n<link rel=\"stylesheet\" href=\"[% site.bootstrapTableStickyHeader.css %]\">\n<style>\n.frequency::after { content: \" GHz\"; }\n.currency::before { content: \"$\"; }\n.bandwidth::after { content: \" Gbps\"; }\n.diskSize::after  { content: \" TB\"; }\n.memory::after    { content: \" GB\"; }\n</style>\n<script async src=\"https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-7267449040388963\" crossorigin=\"anonymous\"></script>\n</head>\n<body>\n<header>\n\t<nav class=\"navbar navbar-expand-lg navbar-dark bg-dark\">\n\t\t<div class=\"container-fluid\">\n\t\t\t<a class=\"navbar-brand mb-0 h1\" href=\"/\">\n\t\t\t\t<span class=\"d-none d-lg-block\">Google Cloud Platform 💸 Pricing</span>\n\t\t\t\t<span class=\"d-lg-none\">GCP 💸 Pricing</span>\n\t\t\t</a>\n\t\t\t<ul class=\"navbar-nav me-auto mb-2 mb-lg-0 d-none d-lg-block\">\n\t\t\t\t<li class=\"nav-item dropdown\">\n\t\t\t\t\t<a class=\"nav-link dropdown-toggle\" href=\"#\" role=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">More Tools</a>\n\t\t\t\t\t<ul class=\"dropdown-menu\">\n\t\t\t\t\t\t<li><a class=\"dropdown-item\" href=\"https://gcloud-iam.nkn-it.de/\">Google Cloud Identity and Access Management (IAM)</a></li>\n\t\t\t\t\t\t<li><hr class=\"dropdown-divider\"></li>\n\t\t\t\t\t\t<li><a class=\"dropdown-item\" href=\"https://aws-pricing.com/\">Amazon EC2 Instance Type Comparison</a></li>\n\t\t\t\t\t\t<li><a class=\"dropdown-item\" href=\"https://ami.nkn-it.de/\">Amazon Machine Images (AMIs)</a></li>\n\t\t\t\t\t</ul>\n\t\t\t\t</li>\n\t\t\t</ul>\n\t\t\t<div class=\"text-end\">\n\t\t\t\t<div class=\"d-none d-lg-block\">\n\t\t\t\t\t<a class=\"btn btn-success\" href=\"/grid.html\" role=\"button\">✅ Instance Picker</a>\n\t\t\t\t\t<a class=\"btn btn-primary\" href=\"/download.html\" role=\"button\">💾 Download</a>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"d-lg-none\">\n\t\t\t\t\t<a class=\"btn btn-success\" href=\"/grid.html\" role=\"button\">✅</a>\n\t\t\t\t\t<a class=\"btn btn-primary\" href=\"/download.html\" role=\"button\">💾</a>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</nav>\n</header>\n<main>\n<div class=\"container-fluid\">\n<div id=\"pleaseDisableYourAdBlocker\"></div>\n<div class=\"row mt-2 mb-2\">\n<div class=\"col\">\n<ul class=\"nav nav-tabs\">\n\t<li class=\"nav-item\">\n\t\t<a [% IF template.name == 'index.tt2' %]class=\"nav-link active\" aria-current=\"page\"[% ELSE %]class=\"nav-link\"[% END %] href=\"/\">👋 Hi</a>\n\t</li>\n\t<li class=\"nav-item\">\n\t\t<a [%- IF\n\t\t\t\ttemplate.name == 'instance.tt2' ||\n\t\t\t\ttemplate.name == 'comparison.tt2' ||\n\t\t\t\ttemplate.name == 'vs.tt2' ||\n\t\t\t\ttemplate.name == 'instances.tt2' ||\n\t\t\t\ttemplate.name == 'intel.tt2' ||\n\t\t\t\ttemplate.name == 'amd.tt2' ||\n\t\t\t\ttemplate.name == 'arm.tt2' ||\n\t\t\t\ttemplate.name == 'sap.tt2' ||\n\t\t\t\ttemplate.name == 'hana.tt2'\n\t\t\t-%]class=\"nav-link active\" aria-current=\"page\"[% ELSE %]class=\"nav-link\"[% END %]\n\t\t\thref=\"/instances.html\">Machines</a>\n\t</li>\n\t<li class=\"nav-item\">\n\t\t<a [%- IF\n\t\t\t\ttemplate.name == 'disk.tt2' ||\n\t\t\t\ttemplate.name == 'disks.tt2'\n\t\t\t-%]class=\"nav-link active\" aria-current=\"page\"[% ELSE %]class=\"nav-link\"[% END %]\n\t\t\thref=\"/disks.html\">Disks</a>\n\t</li>\n\t<li class=\"nav-item\">\n\t\t<a [%- IF\n\t\t\t\ttemplate.name == 'images.tt2'\n\t\t\t-%]class=\"nav-link active\" aria-current=\"page\"[% ELSE %]class=\"nav-link\"[% END %]\n\t\t\thref=\"/images.html\">Images</a>\n\t</li>\n\t<li class=\"nav-item\">\n\t\t<a [%- IF\n\t\t\t\ttemplate.name == 'instance_in_region.tt2' ||\n\t\t\t\ttemplate.name == 'region.tt2' ||\n\t\t\t\ttemplate.name == 'regions.tt2' ||\n\t\t\t\ttemplate.name == 'diskpricing.tt2' ||\n\t\t\t\ttemplate.name == 'platforms.tt2'\n\t\t\t-%]class=\"nav-link active\" aria-current=\"page\"[% ELSE %]class=\"nav-link\"[% END %]\n\t\t\thref=\"/regions.html\">Regions</a>\n\t</li>\n\t\t<li class=\"nav-item\">\n\t\t<a [%- IF\n\t\t\t\ttemplate.name == 'gcosts.tt2'\n\t\t\t-%]class=\"nav-link active\" aria-current=\"page\"[% ELSE %]class=\"nav-link\"[% END %]\n\t\t\thref=\"/gcosts.html\">Calculator</a>\n\t</li>\n</ul>\n</div> <!-- // col -->\n</div> <!-- // row -->\n\n"
  },
  {
    "path": "build/src/images.tt2",
    "content": "[%- PROCESS header.tt2 -%]\n\n<h1>Google Compute Engine Operating System Images</h1>\n\n<blockquote class=\"blockquote\">\n<p>\nCompute Engine offers many preconfigured public images that have compatible <mark>Linux, UNIX or Windows operating systems</mark>.\nMost images are free of charge.\nPremium images (SLES, RHEL, Windows) add additional cost to your instances.\nYou can see the costs in the <a href=\"/instances.html\">machine type</a> overview.\n</p>\n</blockquote>\n\n<ul class=\"nav nav-pills\" role=\"tablist\">\n[% FOREACH project IN image_projects %]\n<li class=\"nav-item\" role=\"presentation\">\n<button\n\tclass=\"nav-link[% IF project.name == 'debian-cloud' %] active[% END %]\"\n\taria-selected=\"[% IF project.name == 'debian-cloud' %]true[% ELSE %]false[% END %]\"\n\tid=\"pills-[% project.name %]-tab\"\n\tdata-bs-toggle=\"pill\"\n\tdata-bs-target=\"#[% project.name %]\"\n\ttype=\"button\"\n\trole=\"tab\"\n\taria-controls=\"[% project.name %]\">[% imageProjectName(project.name) %]</button>\n</li>\n[% END %]\n</ul>\n\n<div class=\"tab-content\">\n[% FOREACH project IN image_projects %]\n<div\n\tclass=\"tab-pane[% IF project.name == 'debian-cloud' %] active[% END %]\"\n\tid=\"[% project.name %]\"\n\trole=\"tabpanel\"\n\taria-labelledby=\"pills-[% project.name %]-tab\">\n<h2>[% imageProjectName(project.name) %] <small class=\"text-muted\">[% project.name %]</small></h2>\n\n<p>Image project: <code>[% project.name %]</code></p>\n\n<div class=\"table-responsive\">\n<table class=\"table table-sm table-hover table-bordered\">\n<thead>\n<tr>\n\t<th>Image Family</th>\n\t<th title=\"Most recent image name\">Latest Image</th>\n\t<th>Description</th>\n\t<th title=\"Minimum persistent boot disk size\">Min. Disk Size</th>\n\t<th>Creation</th>\n</tr>\n</thead>\n<tbody>\n[% FOREACH family IN image_famlies; IF family.project == project.name; %]\n<tr>\n\t<td>[% family.name %]</td>\n\t<td>\n\t\t[% family.image %]\n\t\t[% badgeImageArch(family.architecture) %]\n\t</td>\n\t<td>[% IF family.description %][% family.description %][% ELSE %]<span class=\"text-muted\">-</span>[% END %]</td>\n\t<td>[% family.diskSizeGb %] GB</td>\n\t<td>[% family.creation | replace('T.+$','') %]</td>\n</tr>\n[% END; END; %]\n</tbody>\n</table>\n</div><!-- table-responsive -->\n\n<p>Google Cloud CLI:</p>\n<script>\nfunction copy[% project.name.remove('-') %]() {\n\tvar cli = document.getElementById(\"cli[% project.name.remove('-') %]\").innerText;\n\tnavigator.clipboard.writeText(cli);\n}\n</script>\n<div class=\"position-relative\">\n<div class=\"position-absolute top-0 end-0\"><button type=\"button\" class=\"btn btn-outline-primary btn-sm\" onclick=\"copy[% project.name.remove('-') %]();\" title=\"Copy to clipboard\">Copy</button></div>\n<pre class=\"bg-light\"><code id=\"cli[% project.name.remove('-') %]\"><span class=\"text-muted\"># Create VM instance with [% imageProjectName(project.name) %] operating system boot disk</span>\n<span class=\"text-muted\"># Name: 'vm-[% project.name %]'</span>\n<span class=\"text-muted\"># Machine type: 'e2-micro'</span>\n<span class=\"text-muted\"># Zone: 'us-central1-a'</span>\ngcloud compute instances create vm-[% project.name %] \\\n--machine-type=<span class=\"text-primary\">'e2-micro'</span> \\\n--zone=<span class=\"text-primary\">'us-central1-a'</span> \\\n--image-project=<span class=\"text-primary\">'[% project.name %]'</span> \\\n--image-family=<span class=\"text-primary\">'ADD_IMAGE_FAMILY_HERE'</span></code></pre>\n</div> <!-- // position-relative -->\n\n</div> <!-- // tab-pane -->\n[% END %]\n</div>\n\n[% PROCESS footer.tt2 %]"
  },
  {
    "path": "build/src/img/favicon/README.txt",
    "content": "This favicon was generated using the following graphics from Twitter Twemoji:\n\n- Graphics Title: 1f4b8.svg\n- Graphics Author: Copyright 2020 Twitter, Inc and other contributors (https://github.com/twitter/twemoji)\n- Graphics Source: https://github.com/twitter/twemoji/blob/master/assets/svg/1f4b8.svg\n- Graphics License: CC-BY 4.0 (https://creativecommons.org/licenses/by/4.0/)\n"
  },
  {
    "path": "build/src/img/favicon/site.webmanifest",
    "content": "{\"name\":\"\",\"short_name\":\"\",\"icons\":[{\"src\":\"/android-chrome-192x192.png\",\"sizes\":\"192x192\",\"type\":\"image/png\"},{\"src\":\"/android-chrome-512x512.png\",\"sizes\":\"512x512\",\"type\":\"image/png\"}],\"theme_color\":\"#ffffff\",\"background_color\":\"#ffffff\",\"display\":\"standalone\"}"
  },
  {
    "path": "build/src/imprint.tt2",
    "content": "[%- PROCESS header.tt2 -%]\n\n</div> <!-- // container-fluid -->\n<div class=\"container\">\n\n<h1>Imprint</h1>\n\n<p>🇩🇪 German law demands this.</p>\n\n<p>\n<address>\nNils Knieling<br>\nKlabundeweg 14<br>\n22359 Hamburg<br>\nDeutschland\n</address>\n</p>\n\n<p>Email: <code>nils [at] nkn-it (dot) de</code></p>\n\n<p>Phone: + 49 (0) 40 2282 1390 (no support)</p>\n\n<p>Umsatzsteuer-ID gemäß §27 a Umsatzsteuergesetz (VAT ID Number Germany): DE 279463785</p>\n\n[%- PROCESS footer.tt2 -%]"
  },
  {
    "path": "build/src/index.tt2",
    "content": "[%- PROCESS header.tt2 -%]\n\n</div> <!-- // container-fluid -->\n<div class=\"container\">\n\n<h1>Google Compute Engine Machine Type Comparison</h1>\n\n<p>\nThis webapp helps to find the optimal Google Compute Engine (GCE) machine type or instance in the many Google Cloud Platform (GCP) regions.\nA lot of information has been collected from various Google Cloud websites and different sources.\n</p>\n\n<div class=\"p-5 mb-4 bg-light rounded-3\">\n<figure>\n\t<blockquote class=\"blockquote\">\n\t\t<p>\n\t\t\tI was tired of switching between different Google documentations to get all the information to find the best Google Compute Engine machine.\n\t\t\tI have therefore merged all important information into one place.\n\t\t\tHope it helps you too.\n\t\t</p>\n\t</blockquote>\n\t<figcaption class=\"blockquote-footer\"><a href=\"https://github.com/Cyclenerd\">Nils</a></figcaption>\n</figure>\n</div>\n\n<h2>Machines</h2>\n\n[%\nintel = 0;\namd   = 0;\narm   = 0;\nsap   = 0;\nhana  = 0;\nFOREACH instance IN instances;\n\tIF instance.intel; intel = intel + 1; END;\n\tIF instance.amd;   amd   = amd   + 1; END;\n\tIF instance.arm;   arm   = arm   + 1; END;\n\tIF instance.sap;   sap   = sap   + 1; END;\n\tIF instance.hana;  hana  = hana  + 1; END;\nEND;\n%]\n\n<p>\n<a href=\"/instances.html\" title=\"All Google Conmpute Engine machine types\">Here</a> you can find an overview of all <mark>[% instances.size %] different Google Compute Engine machine types</mark>.\nYou can also find the average costs per GCE machine type across all Google Cloud regions in this overview.\n</p>\n\n<p>\nYou have the choice between\n<mark>[% intel %] machine types with <a href=\"/intel.html\">Intel</a> CPU</mark>,\n<mark>[% amd %] CPU machine types with <a href=\"/amd.html\">AMD</a> CPU</mark> and\n<mark>[% arm %] CPU machine types with <a href=\"/arm.html\">Arm-based</a> processors</mark>.\n[% sap %] machine types are certified for <a href=\"/sap.html\">SAP application</a> and [% hana %] machine types are certified for <a href=\"/hana.html\">SAP HANA</a> on Google Cloud.\n</p>\n\n<h2>Disks</h2>\n\n<p>\n<a href=\"/disks.html\" title=\"Persistent Disk Types\">Here</a> you can find an overview of <mark>[% disks.size %]</mark> different disk types for your instances.\n</p>\n\n<h2>Images</h2>\n\n<p>\n<a href=\"/images.html\" title=\"Operating system images\">Here</a> you can find an overview of many preconfigured public images that have compatible <mark>Linux, UNIX or Windows operating systems</mark>.\n</p>\n\n<h2>Regions</h2>\n\n[%\nregions_with_low_co2 = 0;\ntotal_public_ip_addr = 0;\nFOREACH region IN regions;\n\tIF region.regionLowCo2; regions_with_low_co2 = regions_with_low_co2 + 1; END;\n\tIF region.regionPublicIpv4Addr; total_public_ip_addr = total_public_ip_addr + region.regionPublicIpv4Addr; END;\nEND;\n%]\n\n<p>\n<a href=\"/regions.html\" title=\"All Google Cloud regions\">Here</a> you can find an overview of all <mark>[% regions.size %] Google Cloud regions</mark> and the corresponding zones.\nA total of <mark>[% total_public_ip_addr / 1000000 FILTER format(\"%d\") %] million public IPv4 addresses</mark> are assigned to all Google Cloud Platform regions.\nThere is also a <a href=\"/map.html\" title=\"Google Cloud Platform Region Map\">map view</a> with all Google Cloud Platform regions.\nYou can also find the available Google Compute Engine machine types per GCE machine series (<a href=\"/platforms.html\">CPU type and CPU plattform</a>) in this overview.\nA cost overview of the <a href=\"/disks.html\" title=\"Persistent disk pricing in Google Cloud regions\">persistent disk types</a> in the regions can also be found in this section.\n</p>\n\n<p>\nOf the [% regions.size %] regions, <mark>[% regions_with_low_co2 %] regions have a low carbon impact</mark>.\nThis means that this regions have a Google CFE% of at least 75%,\nor, if CFE% information is not available, a grid carbon intensity of maximum 200 gCO2eq/kWh.\n</p>\n\n<p>\nIn total, you have the freedom to choose between <mark>[% instances_in_regions.size %] different combinations</mark> of Google Compute Engine machine types and Google Cloud regions.\nFor each combination the cost per hour, month with sustained use discounts (SUD), month with 1 year commitment (CUD) and price per month with 3 year commitment (CUD) was calculated.\nThe cost of paid \"premium\" operating system licenses, such as SUSE Linux Enterprise Server (SLES), Red Hat Enterprise Linux (RHEL) and Microsoft Windows Server, was also calculated.\n</p>\n\n<h2>Instance Picker</h2>\n\n<p>\nWith the <a href=\"/grid.html\">Instance Picker</a> you can quickly and easily compare all possible Google Compute Engine machine types and instances in all Google Cloud Platform regions.\n</p>\n\n<p>\nYou can set filters for each column and sort them.\nFilters can be combined.\n</p>\n\n<p>\nA good first filter is to set the preferred region.\nYou can also filter by parts of the region. Example <code>europe</code> to filter all machine types in Europe.\n</p>\n\n<h3>Filter</h3>\n\n<p>\nYou can filter and sort all fields in the <a href=\"/grid.html\">Instance Picker</a>.</p>\n\n<div class=\"row\">\n\t<div class=\"col-xl-6\">\n\t\t<p>\n\t\t\tFilter on region <code>europe-west4</code> and CPU base clock frequency greater than <code>3 GHz</code>:\n\t\t\t<img src=\"/img/filter.png?[% timestamp %]\" alt=\"Screenshot: Filter\" class=\"img-fluid rounded\">\n\t\t</p>\n\t</div>\n\t<div class=\"col-xl-6\">\n\t\t<p>\n\t\t\tFilter on region <code>europe-west4</code> and Memory greater than <code>30 GB</code> but also less than <code>60 GB</code>:\n\t\t\t<img src=\"/img/combine-filter.png?[% timestamp %]\" alt=\"Screenshot: Filter combined\" class=\"img-fluid rounded\">\n\t\t</p>\n\t</div>\n</div>\n\n<h3>Sort and more</h3>\n<div class=\"row\">\n\t<div class=\"col-xl-6\">\n\t\t<p>\n\t\t\tClick header title to sort column:\n\t\t\t<img src=\"/img/sort.png?[% timestamp %]\" alt=\"Screenshot: Sort colums\" class=\"img-fluid rounded\">\n\t\t</p>\n\t</div>\n\t<div class=\"col-xl-6\">\n\t\t<p>\n\t\t\tClick group header title icon to show more colums:\n\t\t\t<img src=\"/img/show-more.png?[% timestamp %]\" alt=\"Screenshot: Show more colums\" class=\"img-fluid rounded\">\n\t\t</p>\n\t</div>\n</div>\n\n<h3>Keyboard shortcuts</h3>\n\n<p>You can navigate the <a href=\"/grid.html\">Instance Picker</a> with your keyboard.</p>\n\n<p>\nPress <kbd>Ctrl</kbd> + <kbd>/</kbd> to focus the vCPU filter.</p>\n\n<p>\nUse the arrow keys (<kbd>←</kbd> <kbd>↑</kbd> <kbd>→</kbd> <kbd>↓</kbd>) to move focus up, down, left and right.\n<kbd>Tab</kbd> will move the focus horizontally until the last cell and then move on to the next row.\n<kbd>Shift</kbd> + <kbd>Tab</kbd> will move the focus horizontal backward until the first cell and then move back to the previous row.\n</p>\n\n<p>Pressing the <kbd>Space</kbd> key on a cell will select the cells row, or deselect the row if already selected.</p>\n\n<p>With the following keyboard shortcuts you can copy selected row from the table in CSV format to your clipboard:</p>\n<ul>\n\t<li><kbd>Ctrl</kbd> + <kbd>c</kbd> : Copy selected rows with shown column</li>\n\t<li><kbd>Ctrl</kbd> + <kbd>x</kbd> : Copy selected rows with all   column</li>\n</ul>\n\n<p>The grid header also supports full keyboard navigation:</p>\n<ul>\n\t<li>Press <kbd>Enter</kbd> to toggle the sorting state of that column.</li>\n\t<li>Press <kbd>Ctrl</kbd> + <kbd>Enter</kbd> to open the menu for the focused header.</li>\n\t<li>When a menu is open, simply press <kbd>Esc</kbd> to close it and the focus will return to the header.</li>\n</ul>\n\n<h2>Resources of the Information</h2>\n\n<p>The information was obtained from the following different Google websites:</p>\n\n<div class=\"row\">\n<div class=\"col-xl-6\">\n<ul>\n\t<li>\n\t\t<a href=\"https://cloud.google.com/compute/docs/machine-types#machine_type_comparison\" rel=\"nofollow\">Machine series comparison</a>\n\t\t<ul>\n\t\t\t<li>\n\t\t\t\t<a href=\"https://cloud.google.com/compute/docs/accelerator-optimized-machines#a2-vms\" rel=\"nofollow\">A2</a>,\n\t\t\t\t<a href=\"https://cloud.google.com/compute/docs/accelerator-optimized-machines#a3-vms\" rel=\"nofollow\">A3</a> and\n\t\t\t\t<a href=\"https://cloud.google.com/compute/docs/accelerator-optimized-machines#g2-vms\" rel=\"nofollow\">G2</a> accelerator optimized machines\n\t\t\t</li>\n\t\t\t<li>\n\t\t\t\t<a href=\"https://cloud.google.com/compute/docs/storage-optimized-machines#z3_series\" rel=\"nofollow\">Z3</a> storage optimized machines\n\t\t\t</li>\n\t\t\t<li>\n\t\t\t\t<a href=\"https://cloud.google.com/compute/docs/compute-optimized-machines#c2_machine_types\" rel=\"nofollow\">C2</a>,\n\t\t\t\t<a href=\"https://cloud.google.com/compute/docs/compute-optimized-machines#c2d_machine_types\" rel=\"nofollow\">C2D</a> and\n\t\t\t\t<a href=\"https://cloud.google.com/compute/docs/compute-optimized-machines#h3_series\" rel=\"nofollow\">H3</a> compute optimized machine series\n\t\t\t</li>\n\t\t\t<li>\n\t\t\t\t<a href=\"https://cloud.google.com/compute/docs/memory-optimized-machines#m1_machine_types\" rel=\"nofollow\">M1</a>,\n\t\t\t\t<a href=\"https://cloud.google.com/compute/docs/memory-optimized-machines#m2_machine_types\" rel=\"nofollow\">M2</a>,\n\t\t\t\t<a href=\"https://cloud.google.com/compute/docs/memory-optimized-machines#m3_machine_types\" rel=\"nofollow\">M3</a> and\n\t\t\t\t<a href=\"https://cloud.google.com/compute/docs/memory-optimized-machines#m4_machine_types\" rel=\"nofollow\">M4</a> memory optimized machine series\n\t\t\t</li>\n\t\t\t<li>\n\t\t\t\t<a href=\"https://cloud.google.com/compute/docs/general-purpose-machines#c3_series\" rel=\"nofollow\">C3</a>,\n\t\t\t\t<a href=\"https://cloud.google.com/compute/docs/general-purpose-machines#c3d_series\" rel=\"nofollow\">C3D</a>,\n\t\t\t\t<a href=\"https://cloud.google.com/compute/docs/general-purpose-machines#c4_series\" rel=\"nofollow\">C4</a>,\n\t\t\t\t<a href=\"https://cloud.google.com/compute/docs/general-purpose-machines#c4a_series\" rel=\"nofollow\">C4A</a>,\n\t\t\t\t<a href=\"https://cloud.google.com/compute/docs/general-purpose-machines#c4d_series\" rel=\"nofollow\">C4D</a>,\n\t\t\t\t<a href=\"https://cloud.google.com/compute/docs/general-purpose-machines#e2_machine_types\" rel=\"nofollow\">E2</a>,\n\t\t\t\t<a href=\"https://cloud.google.com/compute/docs/general-purpose-machines#n1_machines\" rel=\"nofollow\">N1</a>,\n\t\t\t\t<a href=\"https://cloud.google.com/compute/docs/general-purpose-machines#n2_series\" rel=\"nofollow\">N2</a>,\n\t\t\t\t<a href=\"https://cloud.google.com/compute/docs/general-purpose-machines#n2d_machines\" rel=\"nofollow\">N2D</a>,\n\t\t\t\t<a href=\"https://cloud.google.com/compute/docs/general-purpose-machines#n4_series\" rel=\"nofollow\">N4</a>,\n\t\t\t\t<a href=\"https://cloud.google.com/compute/docs/general-purpose-machines#n4a_series\" rel=\"nofollow\">N4A</a>,\n\t\t\t\t<a href=\"https://cloud.google.com/compute/docs/general-purpose-machines#n4d_series\" rel=\"nofollow\">N4D</a>,\n\t\t\t\t<a href=\"https://cloud.google.com/compute/docs/general-purpose-machines#t2d_machines\" rel=\"nofollow\">T2D</a> and\n\t\t\t\t<a href=\"https://cloud.google.com/compute/docs/general-purpose-machines#t2a_machines\" rel=\"nofollow\">T2A</a> general purpose machine series\n\t\t\t</li>\n\t\t</ul>\n\t</li>\n</ul>\n</div>\n<div class=\"col-xl-6\">\n<ul>\n\t<li><a href=\"https://cloud.google.com/compute/docs/regions-zones#available\" rel=\"nofollow\">Available regions and zones</a></li>\n\t<li><a href=\"https://cloud.google.com/compute/docs/cpu-platforms\" rel=\"nofollow\">CPU Platform</a></li>\n\t<li><a href=\"https://cloud.google.com/compute/docs/benchmarks-linux\" rel=\"nofollow\">Benchmarks for Linux VM instances</a></li>\n\t<li><a href=\"https://cloud.google.com/solutions/sap/docs/certifications-sap-apps#sap-certified-vms\" rel=\"nofollow\">Certified SAP applications on Google Cloud</a></li>\n\t<li><a href=\"https://cloud.google.com/solutions/sap/docs/certifications-sap-hana#hana-cert-table-vms\" rel=\"nofollow\">Certified machine types for SAP HANA</a></li>\n</ul>\n</div> <!-- // col -->\n</div> <!-- // row -->\n\n[% PROCESS footer.tt2 %]"
  },
  {
    "path": "build/src/instance.tt2",
    "content": "[%- PROCESS header.tt2 -%]\n<h1>Google Compute Engine Machine Type [% instance.name %]</h1>\n\n<blockquote class=\"blockquote\">\n\t<p>\n\t\t[% IF instance.family %][% instance.family %][% END %]\n\t\tGoogle Compute Engine machine type [% instance.name %] with [% instance.vCpus%] vCPU and [% instance.memoryGB %] GB memory.\n\t\t[% IF instance.localSsd > 1 %]Bundled with [% instance.localSsd FILTER format(\"%.0f\") %] GB local SSD.[% END %]\n\t\t[% IF instance.name.search('-lssd') %]Local SSD storage is required and automatically attached. Additional costs for Local SSD storage are charged.[% END %]\n\t\t[%- IF instance.sap || instance.hana -%]\n\t\t\tGCE machine type [% instance.name %] is certified for\n\t\t\t[% IF instance.sap %]SAP applications[% END %]\n\t\t\t[% IF instance.sap && instance.hana%]and[% END %]\n\t\t\t[% IF instance.hana %]SAP HANA[% END %]\n\t\t\ton Google Cloud Platform.\n\t\t[%- END -%]\n\t\tAvailable in [% regions.size %] Google Cloud region[% IF regions.size > 1 %]s[% END %].\n\t\t[% notAllCpuPlatformsAvailable = 0; FOREACH region IN regions; IF region.availableCpuPlatformCount < instance.cpuPlatformCount; notAllCpuPlatformsAvailable = 1; END; END; %]\n\t\t[% IF notAllCpuPlatformsAvailable %]<mark>Not all CPU platforms are available in all regions.</mark>[% END %]\n\t</p>\n</blockquote>\n\n<p class=\"d-grid gap-2 d-lg-block\">\n\t<a class=\"btn btn-success\" href=\"/grid.html?name=[% instance.name %]\" role=\"button\">✅ Instance Picker with filter on machine type [% instance.name %]</a>\n\t<a class=\"btn btn-warning\" href=\"/comparison/[% instance.name %]/vs.html\" role=\"button\">Compare machine type [% instance.name %]</a>\n</p>\n\n<div class=\"row\">\n<div class=\"col-xxl-6\">\n\n<h2>Google Cloud VM [% instance.name %]</h2>\n<p>Technical facts about the Google Compute Engine machine type [% instance.name %].</p>\n<div class=\"table-responsive\">\n<table class=\"table table-hover table-striped table-bordered\">\n\t<tr>\n\t\t<th>Series</th>\n\t\t<td>[% instance.series %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>Family</th>\n\t\t<td>[% instance.family %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>vCPU</th>\n\t\t<td>[% instance.vCpus %][% badgeSharedCpu(instance) %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>Memory</th>\n\t\t<td>[% instance.memoryGB %] GB</td>\n\t</tr>\n\t<tr>\n\t\t<th>CPU Manufactur</th>\n\t\t<td>[% badgeCpuManufactur(instance) %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>CPU Platform</th>\n\t\t<td>[% listCpuPlatform(instance) %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>CPU Base Frequency</th>\n\t\t<td>[% IF instance.cpuBaseClock > 0 %][% instance.cpuBaseClock %] GHz[% ELSE %]<span class=\"text-muted\">?</span>[% END %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>CPU Turbo Frequency</th>\n\t\t<td>[% IF instance.cpuTurboClock > 0 %][% instance.cpuTurboClock %] GHz[% ELSE %]<span class=\"text-muted\">?</span>[% END %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>CPU Max. Turbo Frequency</th>\n\t\t<td>[% IF instance.cpuSingleMaxTurboClock > 0 %][% instance.cpuSingleMaxTurboClock %] GHz[% ELSE %]<span class=\"text-muted\">?</span>[% END %]</td>\n\t</tr>\n\t[% IF instance.acceleratorCount %]\n\t<tr>\n\t\t<th>Accelerator (GPUs)</th>\n\t\t<td>[% instance.acceleratorCount %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>Accelerator Type</th>\n\t\t<td>[% instance.acceleratorType %]</td>\n\t</tr>\n\t[% END %]\n\t<tr>\n\t\t<th>EEMBC CoreMark Benchmark (<a href=\"https://www.eembc.org/coremark\">?</a>)</th>\n\t\t<td>[% IF instance.coremarkScore %][% instance.coremarkScore %][% ELSE %]<span class=\"text-muted\">-</span>[% END %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>EEMBC CoreMark Standard Deviation</th>\n\t\t<td>[% IF instance.standardDeviation %][% instance.standardDeviation %] %[% ELSE %]<span class=\"text-muted\">-</span>[% END %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>EEMBC CoreMark Sample Count</th>\n\t\t<td>[% IF instance.sampleCount %][% instance.sampleCount %][% ELSE %]<span class=\"text-muted\">-</span>[% END %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>SAP Standard Benchmark (<a href=\"https://www.sap.com/about/benchmark.html\">?</a>)</th>\n\t\t<td>[% IF instance.saps %][% instance.saps %][% ELSE %]<span class=\"text-muted\">-</span>[% END %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>Network Bandwidth</th>\n\t\t<td>[% instance.bandwidth %] Gbps</td>\n\t</tr>\n\t<tr>\n\t\t<th>Network Tier 1</th>\n\t\t<td>[% IF instance.tier1 %][% instance.tier1 %] Gbps[% ELSE %]<span class=\"text-muted\">-</span>[% END %]</td>\n\t</tr>\n\t<tr>\n\t\t<th title=\"Disk usage is charged separately from machine type pricing!\">Max. Disk Size</th>\n\t\t<td>[% instance.diskSizeTiB %] TB</td>\n\t</tr>\n\t<tr>\n\t\t<th title=\"Disk usage is charged separately from machine type pricing!\">Max. Number of Disks</th>\n\t\t<td>[% instance.disks %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>Local SSD</th>\n\t\t<td>\n\t\t\t[% booleanLocalSsd(instance) %]\n\t\t\t[% bundledLocalSsd(instance) %]\n\t\t</td>\n\t</tr>\n\t<tr>\n\t\t<th>SAP Application</th>\n\t\t<td>[% booleanSap(instance) %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>SAP HANA</th>\n\t\t<td>[% booleanHana(instance) %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>Spot Provisioning Mode (Spot VM)</th>\n\t\t<td>[% booleanSpot(instance) %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>Sustained Use Discount (SUD)</th>\n\t\t<td>[% booleanSud(instance) %]</td>\n\t</tr>\n\t<tr>\n\t\t<th title=\"Google Compute Engine API Description\">GCE API Description</th>\n\t\t<td>[% instance.description %]</td>\n\t</tr>\n</table>\n</div><!-- table-responsive -->\n\n</div> <!-- // col -->\n<div class=\"col-xxl-6\">\n\n<h2>Costs (Pricing) for [% instance.name %]</h2>\n<p>Cost and pricing across all regions for Google Cloud VM [% instance.name %].</p>\n\n<h3>Price per Hour</h3>\n<div class=\"table-responsive\">\n<table class=\"table table-hover table-striped table-bordered\">\n<thead>\n\t<tr>\n\t\t<th scope=\"col\"></th>\n\t\t<th scope=\"col\" title=\"Lowest price across all regions\">Min.</th>\n\t\t<th scope=\"col\" title=\"Average price across all regions\">Avg.</th>\n\t\t<th scope=\"col\" title=\"Highest price across all regions\">Max.</th>\n\t</tr>\n</thead>\n<tbody>\n\t<tr>\n\t\t<th>Standard price per hour</th>\n\t\t<td class=\"currency\">[% instance.minHour %]</td>\n\t\t<td class=\"currency\">[% instance.avgHour %]</td>\n\t\t<td class=\"currency\">[% instance.maxHour %]</td>\n\t</tr>\n\t[% IF instance.spot && instance.avgHourSpot > 0 %]\n\t<tr>\n\t\t<th>Spot provisioning model (Spot VM)</th>\n\t\t<td class=\"currency\">[% instance.minHourSpot %]</td>\n\t\t<td class=\"currency\">[% instance.avgHourSpot %]</td>\n\t\t<td class=\"currency\">[% instance.maxHourSpot %]</td>\n\t</tr>\n\t[% END %]\n</tbody>\n</table>\n</div>\n\n<h3>Price per Month</h3>\n<div class=\"table-responsive\">\n<table class=\"table table-hover table-striped table-bordered\">\n<thead>\n\t<tr>\n\t\t<th scope=\"col\"></th>\n\t\t<th scope=\"col\" title=\"Lowest price across all regions\">Min.</th>\n\t\t<th scope=\"col\" title=\"Average price across all regions\">Avg.</th>\n\t\t<th scope=\"col\" title=\"Highest price across all regions\">Max.</th>\n\t</tr>\n</thead>\n<tbody>\n\t<tr>\n\t\t<th>Price per month[% IF instance.sud %] with sustained use discount (SUD)[% END %]</th>\n\t\t<td class=\"currency\">[% instance.minMonth %]</td>\n\t\t<td class=\"currency\">[% instance.avgMonth %]</td>\n\t\t<td class=\"currency\">[% instance.maxMonth %]</td>\n\t</tr>\n\t[% IF instance.spot && instance.avgMonthSpot > 0 %]\n\t<tr>\n\t\t<th>Spot provisioning model (Spot VM)</th>\n\t\t<td class=\"currency\">[% instance.minMonthSpot %]</td>\n\t\t<td class=\"currency\">[% instance.avgMonthSpot %]</td>\n\t\t<td class=\"currency\">[% instance.maxMonthSpot %]</td>\n\t</tr>\n\t[% END %]\n\t<tr>\n\t\t<th>1 year commitment (CUD)</th>\n\t\t<td class=\"currency\">[% instance.minMonth1yCud %]</td>\n\t\t<td class=\"currency\">[% instance.avgMonth1yCud %]</td>\n\t\t<td class=\"currency\">[% instance.maxMonth1yCud %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>3 year commitment (CUD)</th>\n\t\t<td class=\"currency\">[% instance.minMonth3yCud %]</td>\n\t\t<td class=\"currency\">[% instance.avgMonth3yCud %]</td>\n\t\t<td class=\"currency\">[% instance.maxMonth3yCud %]</td>\n\t</tr>\n</tbody>\n</table>\n</div><!-- table-responsive -->\n\n<h3>Operating System Licenses Costs</h3>\n<p>Monthly costs for paid <i>premium</i> operating system licenses for Google Compute Engine machine type [% instance.name %].</p>\n<div class=\"table-responsive\">\n<table class=\"table table-sm table-hover table-striped table-bordered\">\n<thead>\n\t<tr>\n\t\t<th scope=\"col\">Operating System</th>\n\t\t<th scope=\"col\">Month</th>\n\t\t<th scope=\"col\">1Y CUD</th>\n\t\t<th scope=\"col\">3Y CUD</th>\n\t</tr>\n</thead>\n<tbody>\n\t<tr>\n\t\t<th>Microsoft Windows Server</th>\n\t\t<td class=\"currency\">[% instance.monthWindows %]</td>\n\t\t<td></td>\n\t\t<td></td>\n\t</tr>\n\t<tr>\n\t\t<th>SUSE Linux Enterprise Server</th>\n\t\t<td class=\"currency\">[% instance.monthSles %]</td>\n\t\t<td></td>\n\t\t<td></td>\n\t</tr>\n\t<tr>\n\t\t<th>Red Hat Enterprise Linux</th>\n\t\t<td class=\"currency\">[% instance.monthRhel %]</td>\n\t\t<td class=\"currency\">[% instance.monthRhel1yCud %]</td>\n\t\t<td class=\"currency\">[% instance.monthRhel3yCud %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>SUSE Linux Enterprise Server for SAP</th>\n\t\t<td class=\"currency\">[% instance.monthSlesSap %]</td>\n\t\t<td class=\"currency\">[% instance.monthSlesSap1yCud %]</td>\n\t\t<td class=\"currency\">[% instance.monthSlesSap3yCud %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>Red Hat Enterprise Linux for SAP</th>\n\t\t<td class=\"currency\">[% instance.monthRhelSap %]</td>\n\t\t<td class=\"currency\">[% instance.monthRhelSap1yCud %]</td>\n\t\t<td class=\"currency\">[% instance.monthRhelSap3yCud %]</td>\n\t</tr>\n</table>\n</div><!-- table-responsive -->\n\n</div> <!-- // col -->\n</div> <!-- // row -->\n\n<h2>Price per Region</h2>\n[% \n\tcost_hour_difference = instance.maxHour - instance.minHour;\n\tcost_hour_difference_percent = cost_hour_difference*100 / instance.maxHour\n%]\n<p>\nCosts and pricing for Google Compute Engine machine type [% instance.name %] in Google Cloud regions in which the VM is available.\nBetween the most expensive and the cheapest region is a price <mark>difference of [% cost_hour_difference_percent FILTER format(\"%.0f\") %]%</mark>.\n</p>\n<div class=\"table-responsive\">\n<table\n\tclass=\"table table-sm table-hover table-striped table-bordered\"\n\tdata-classes=\"table table-sm table-hover table-striped table-bordered\"\n\tdata-toggle=\"table\"\n\tdata-sort-name=\"hour\"\n\tdata-sort-order=\"asc\"\n\tdata-sortable=\"true\"\n\tdata-sticky-header=\"true\"\n>\n<thead>\n\t<tr>\n\t\t<th scope=\"col\" data-sortable=\"true\">Region</th>\n\t\t<th scope=\"col\" data-sortable=\"true\">Location</th>\n\t\t<th scope=\"col\" data-sortable=\"true\">#Zones</th>\n\t\t<th scope=\"col\" data-sortable=\"true\" title=\"CPU Platforms\" >#Platf.</th>\n\t\t<!-- Costs -->\n\t\t<th scope=\"col\" data-field=\"hour\" data-sortable=\"true\">Hour</th>\n\t\t[% IF instance.spot && instance.avgHourSpot > 0 %]<th scope=\"col\" data-sortable=\"true\">Spot</th>[% END %]\n\t\t<th scope=\"col\" data-sortable=\"true\">Month</th>\n\t\t<th scope=\"col\" data-sortable=\"true\">1Y CUD</th>\n\t\t<th scope=\"col\" data-sortable=\"true\">3Y CUD</th>\n\t</tr>\n</thead>\n<tbody>\n\t[% FOREACH region IN regions %]\n\t<tr>\n\t\t<td>\n\t\t\t<a\n\t\t\t   href=\"/[% region.name %]/[% instance.name %].html\"\n\t\t\t   title=\"Google Compute Engine machine type [% instance.name %] in Google Cloud region [% region.name %]\">\n\t\t\t\t[% region.name %]\n\t\t\t</a>\n\t\t</td>\n\t\t<td>\n\t\t\t[% IF region.regionLocation %][% region.regionLocation %][% ELSE %]<span class=\"text-muted\">?</span>[% END %]\n\t\t\t[% iconLowCo2Region(region) %]\n\t\t</td>\n\t\t<td [% IF region.zoneCount < 1%]class=\"table-danger\"[% END%] title=\"Available [% region.zoneCount %] zone[% IF region.zoneCount > 1 %]s[% END %] in region [% region.name %]\">[% IF region.zoneCount %][% region.zoneCount %][% ELSE %]<span class=\"text-muted\">?</span>[% END %]</td>\n\t\t<td [% IF region.availableCpuPlatformCount < instance.cpuPlatformCount %]class=\"table-warning\"[% END%] title=\"Available CPU platforms in region [% region.name %]\">[% IF region.availableCpuPlatformCount %][% region.availableCpuPlatformCount %][% ELSE %]<span class=\"text-muted\">?</span>[% END %]</td>\n\t\t<!-- Costs -->\n\t\t<td\n\t\t    class=\"currency [% IF region.hour >= instance.maxHour %]table-danger[% ELSIF region.hour > instance.avgHour %]table-warning[% ELSE %]table-success[% END %]\"\n\t\t\ttitle=\"Costs per hour for machine type [% instance.name %] in region [% region.name %]: [% region.hour %] USD\">[% region.hour %]</td>\n\t\t[% IF instance.spot && instance.avgHourSpot > 0 %]\n\t\t<td\n\t\t    class=\"currency [% IF region.hourSpot >= instance.maxHourSpot %]table-danger[% ELSIF region.hourSpot > instance.avgHourSpot %]table-warning[% ELSE %]table-success[% END %]\"\n\t\t\ttitle=\"Costs per hour for machine type [% instance.name %] in region [% region.name %] with spot provisioning model (Spot VM): [% region.hourSpot %] USD\">[% region.hourSpot %]</td>\n\t\t[% END %]\n\t\t<td\n\t\t    class=\"currency [% IF region.month >= instance.maxMonth %]table-danger[% ELSIF region.month > instance.avgMonth %]table-warning[% ELSE %]table-success[% END %]\"\n\t\t    title=\"Costs per month for machine type [% instance.name %] in region [% region.name %]: [% region.month %] USD[% IF instance.sud %] with sustained use discounts (SUD) applied[% END %]\">[% region.month %]</td>\n\t\t<td\n\t\t    class=\"currency [% IF region.month1yCud >= instance.maxMonth1yCud %]table-danger[% ELSIF region.month1yCud > instance.avgMonth1yCud %]table-warning[% ELSE %]table-success[% END %]\"\n\t\t    title=\"Costs per month for machine type [% instance.name %] in region [% region.name %] with 1 year commitment (CUD): [% region.month1yCud %] USD\">[% region.month1yCud %]</td>\n\t\t<td\n\t\t    class=\"currency [% IF region.month3yCud >= instance.maxMonth3yCud %]table-danger[% ELSIF region.month3yCud > instance.avgMonth3yCud %]table-warning[% ELSE %]table-success[% END %]\"\n\t\t    title=\"Costs per month for machine type [% instance.name %] in region [% region.name %] with 3 year commitment (CUD): [% region.month3yCud %] USD\">[% region.month3yCud %]</td>\n\t</tr>\n\t[% END %]\n</tbody>\n</table>\n</div><!-- table-responsive -->\n\n[% PROCESS footer.tt2 %]"
  },
  {
    "path": "build/src/instance_in_region.json",
    "content": "[% json %]"
  },
  {
    "path": "build/src/instance_in_region.tt2",
    "content": "[%- PROCESS header.tt2 -%]\n<h1>\n\tGoogle Compute Engine Machine Type [% instance.name %]\n\tin Region [% instance.region %]\n\t[% IF instance.regionLocation %] <small class=\"text-muted\">[% instance.regionLocation %]</small>[% END %]\n\t<small>[% badgeLowCo2Region(instance) %]</small>\n</h1>\n\n<blockquote class=\"blockquote\">\n\t<p>\n\t\t[% IF instance.family %][% instance.family %][% END %]\n\t\tGoogle Compute Engine machine type <a href=\"/[% instance.name %].html\" title=\"Show machine type [% instance.name %] in all regions\">[% instance.name %]</a>\n\t\twith [% instance.vCpus%] vCPU and [% instance.memoryGB %] GB memory\n\t\tin Google Cloud region <a href=\"/[% instance.region %].html\" title=\"Show all machine types in region [% instance.region %]\">[% instance.region %]</a>\n\t\t[% IF instance.regionLocationLong %]([% instance.regionLocationLong %])[% ELSIF instance.regionLocation %]([% instance.regionLocation %])[% END %].\n\t\t[% IF instance.localSsd > 1 %]Bundled with [% instance.localSsd FILTER format(\"%.0f\") %] GB local SSD.[% END %]\n\t\t[% IF instance.name.search('-lssd') %]Local SSD storage is required and automatically attached. Additional costs for Local SSD storage are charged.[% END %]\n\t\t[%- IF instance.sap || instance.hana -%]\n\t\t\tGCE machine type [% instance.name %] is certified for\n\t\t\t[% IF instance.sap %]SAP applications[% END %]\n\t\t\t[% IF instance.sap && instance.hana%]and[% END %]\n\t\t\t[% IF instance.hana %]SAP HANA[% END %]\n\t\t\ton Google Cloud Platform.\n\t\t[%- END -%]\n\t\tAvailable in [% instance.zoneCount %] zone[% IF instance.zoneCount > 1 %]s[% END %].\n\t\t[% IF instance.availableCpuPlatformCount < instance.cpuPlatformCount %]<mark>Not all CPU platforms are available in region [% instance.region %][% IF instance.regionLocation %] ([% instance.regionLocation %])[% END %].</mark>[% END %]\n\t\t[% notAllCpuPlatformsAvailableInZones = 0; FOREACH cpuPlatform IN instance.availableCpuPlatform.split(',').sort; cpu = cpuPlatform.remove('\\s'); %]\n\t\t\t<!-- cpu: '[% cpu %]' -->\n\t\t\t[% FOREACH zone IN instance.zones.split(', ').sort; %]\n\t\t\t\t<!-- zone: '[% zone %]' -->\n\t\t\t\t[% FOREACH z IN zones; IF z.name == zone; %]\n\t\t\t\t\t[% available = z.availableCpuPlatforms.remove('\\s') %]\n\t\t\t\t\t[% IF available.search(cpu); notAllCpuPlatformsAvailableInZones = notAllCpuPlatformsAvailableInZones; ELSE; notAllCpuPlatformsAvailableInZones = notAllCpuPlatformsAvailableInZones + 1; END; %]\n\t\t\t\t\t<!-- z.name: '[% z.name %]' -->\n\t\t\t\t\t<!-- available: '[% available %]' -->\n\t\t\t\t\t<!-- notAllCpuPlatformsAvailableInZones: [% notAllCpuPlatformsAvailableInZones %] -->\n\t\t\t\t[% END; END; %]\n\t\t\t[% END %]\n\t\t[%END %]\n\t\t[% IF notAllCpuPlatformsAvailableInZones %]<mark>Not all CPU platforms are available in all zones in region [% instance.region %][% IF instance.regionLocation %] ([% instance.regionLocation %])[% END %].</mark>[% END %]\n\t</p>\n</blockquote>\n\n<p class=\"d-grid gap-2 d-lg-block\">\n\t<a class=\"btn btn-success\" href=\"/grid.html?region=[% instance.region %]&amp;name=[% instance.name %]\" role=\"button\">✅ Instance Picker [% instance.name %] in [% instance.region %]</a>\n\t<a class=\"btn btn-primary\" href=\"/[% instance.name %].html\" role=\"button\" title=\"Show machine type [% instance.name %] in all regions\">Show [% instance.name %]</a>\n\t<a class=\"btn btn-primary\" href=\"/[% instance.region %].html\" role=\"button\" title=\"Show all machine types in region [% instance.region %]\">Show [% instance.region %]</a>\n\t<a class=\"btn btn-warning\" href=\"/comparison/[% instance.name %]/vs.html\" role=\"button\">Compare [% instance.name %]</a>\n</p>\n\n<div class=\"row\">\n<div class=\"col-xxl-6\">\n\n<h2>Google Cloud VM [% instance.name %]</h2>\n<p>Technical facts about the Google Compute Engine machine type [% instance.name %] in Google Cloud Region [% instance.region %][% IF instance.regionLocation %] ([% instance.regionLocation %])[% END %].</p>\n<div class=\"table-responsive\">\n<table class=\"table table-hover table-striped table-bordered\">\n\t<tr>\n\t\t<th>Series</th>\n\t\t<td>[% instance.series %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>Family</th>\n\t\t<td>[% instance.family %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>vCPU</th>\n\t\t<td>[% instance.vCpus %][% badgeSharedCpu(instance) %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>Memory</th>\n\t\t<td>[% instance.memoryGB %] GB</td>\n\t</tr>\n\t<tr>\n\t\t<th>CPU Manufactur</th>\n\t\t<td>[% badgeCpuManufactur(instance) %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>CPU Platform</th>\n\t\t<td>\n\t\t\t<ul class=\"list-unstyled\">\n\t\t\t<!--\n\t\t\t\tcpuPlatformCount:          [% instance.cpuPlatformCount %]\n\t\t\t\tcpuPlatform:               [% instance.cpuPlatform %]\n\t\t\t\tavailableCpuPlatformCount: [% instance.availableCpuPlatformCount %]\n\t\t\t\tavailableCpuPlatform:      [% instance.availableCpuPlatform %]\n\t\t\t-->\n\t\t\t[% FOREACH cpuPlatform IN instance.cpuPlatform.split(',').sort; cpu = cpuPlatform.remove('\\s'); available = instance.availableCpuPlatform.remove('\\s'); %]\n\t\t\t\t<!-- cpu:       '[% cpu %]' -->\n\t\t\t\t<!-- available: '[% available %]' -->\n\t\t\t\t[% IF available.search(cpu) %]\n\t\t\t\t<li title=\"[% cpuPlatform %] is available in region [% instance.region %]\">✔️ [% cpuPlatform %]</li>\n\t\t\t\t[% ELSE %]\n\t\t\t\t<li class=\"text-muted\" title=\"[% cpuPlatform %] is not available in region [% instance.region %]\">❌ [% cpuPlatform %]</li>\n\t\t\t\t[% END %]\n\t\t\t[% END %]\n\t\t\t</ul>\n\t\t</td>\n\t</tr>\n\t<tr>\n\t\t<th>CPU Base Frequency</th>\n\t\t<td>[% IF instance.cpuBaseClock > 0 %][% instance.cpuBaseClock %] GHz[% ELSE %]<span class=\"text-muted\">?</span>[% END %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>CPU Turbo Frequency</th>\n\t\t<td>[% IF instance.cpuTurboClock > 0 %][% instance.cpuTurboClock %] GHz[% ELSE %]<span class=\"text-muted\">?</span>[% END %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>CPU Max. Turbo Frequency</th>\n\t\t<td>[% IF instance.cpuSingleMaxTurboClock > 0 %][% instance.cpuSingleMaxTurboClock %] GHz[% ELSE %]<span class=\"text-muted\">?</span>[% END %]</td>\n\t</tr>\n\t[% IF instance.acceleratorCount %]\n\t<tr>\n\t\t<th>Accelerator (GPUs)</th>\n\t\t<td>[% instance.acceleratorCount %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>Accelerator Type</th>\n\t\t<td>[% instance.acceleratorType %]</td>\n\t</tr>\n\t[% END %]\n\t<tr>\n\t\t<th>EEMBC CoreMark Benchmark (<a href=\"https://www.eembc.org/coremark\">?</a>)</th>\n\t\t<td>[% IF instance.coremarkScore %][% instance.coremarkScore %][% ELSE %]<span class=\"text-muted\">-</span>[% END %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>EEMBC CoreMark Standard Deviation</th>\n\t\t<td>[% IF instance.standardDeviation %][% instance.standardDeviation %] %[% ELSE %]<span class=\"text-muted\">-</span>[% END %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>EEMBC CoreMark Sample Count</th>\n\t\t<td>[% IF instance.sampleCount %][% instance.sampleCount %][% ELSE %]<span class=\"text-muted\">-</span>[% END %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>SAP Standard Benchmark (<a href=\"https://www.sap.com/about/benchmark.html\">?</a>)</th>\n\t\t<td>[% IF instance.saps %][% instance.saps %][% ELSE %]<span class=\"text-muted\">-</span>[% END %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>Network Bandwidth</th>\n\t\t<td>[% instance.bandwidth %] Gbps</td>\n\t</tr>\n\t<tr>\n\t\t<th>Network Tier 1</th>\n\t\t<td>[% IF instance.tier1 %][% instance.tier1 %] Gbps[% ELSE %]<span class=\"text-muted\">-</span>[% END %]</td>\n\t</tr>\n\t<tr>\n\t\t<th title=\"Disk usage is charged separately from machine type pricing!\">Max. Disk Size</th>\n\t\t<td>[% instance.diskSizeTiB %] TB</td>\n\t</tr>\n\t<tr>\n\t\t<th title=\"Disk usage is charged separately from machine type pricing!\">Max. Number of Disks</th>\n\t\t<td>[% instance.disks %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>Local SSD</th>\n\t\t<td>\n\t\t\t[% booleanLocalSsd(instance) %]\n\t\t\t[% bundledLocalSsd(instance) %]\n\t\t</td>\n\t</tr>\n\t<tr>\n\t\t<th>SAP Application</th>\n\t\t<td>[% booleanSap(instance) %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>SAP HANA</th>\n\t\t<td>[% booleanHana(instance) %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>Spot Provisioning Mode (Spot VM)</th>\n\t\t<td>[% booleanSpot(instance) %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>Sustained Use Discount (SUD)</th>\n\t\t<td>[% booleanSud(instance) %]</td>\n\t</tr>\n\t<tr>\n\t\t<th title=\"Google Compute Engine API Description\">GCE API Description</th>\n\t\t<td>[% instance.description %]</td>\n\t</tr>\n</table>\n</div><!-- table-responsive -->\n\n[% IF instance.zones %]\n<h2>Zones in Region [% instance.region %]</h2>\n<p>Google Compute Engine machine type [% instance.name %] is available in the following zones within the Google Cloud region [% instance.region %][% IF instance.regionLocation %] ([% instance.regionLocation %])[% END %].</p>\n<div class=\"table-responsive\">\n<table class=\"table table-sm table-hover table-striped table-bordered\">\n<thead>\n\t<tr>\n\t\t<th scope=\"col\">Name</th>\n\t\t<th scope=\"col\" title=\"CPU Platforms\">CPU Platform</th>\n\t</tr>\n</thead>\n<tbody>\n\t[% FOREACH zone IN instance.zones.split(', ').sort; %]\n\t<tr>\n\t\t<td>[% zone %]</td>\n\t\t<td>\n\t\t<ul class=\"list-inline\">\n\t\t\t[% FOREACH cpuPlatform IN instance.availableCpuPlatform.split(',').sort; cpu = cpuPlatform.remove('\\s'); %]\n\t\t\t\t<!-- zone: '[% zone %]' -->\n\t\t\t\t<!-- cpu:  '[% cpu %]' -->\n\t\t\t\t[% FOREACH z IN zones; IF z.name == zone; available = z.availableCpuPlatforms.remove('\\s'); END; END; %]\n\t\t\t\t<!-- z.name:    '[% z.name %]' -->\n\t\t\t\t<!-- available: '[% available %]' -->\n\t\t\t\t[% IF available.search(cpu) %]\n\t\t\t\t<li class=\"list-inline-item\" title=\"[% cpuPlatform %] is available in zone [% zone %]\">✔️ [% cpuPlatform %]</li>\n\t\t\t\t[% ELSE %]\n\t\t\t\t<li class=\"list-inline-item text-muted\" title=\"[% cpuPlatform %] is not available in zone [% zone %]\">❌ [% cpuPlatform %]</li>\n\t\t\t\t[% END %]\n\t\t\t[% END %]\n\t\t</ul>\n\t\t</td>\n\t</tr>\n\t[% END %]\n</tbody>\n</table>\n</div><!-- table-responsive -->\n[% END %]\n\n</div> <!-- // col -->\n<div class=\"col-xxl-6\">\n\n<h2>Costs (Pricing) in Region [% instance.region %]</h2>\n<p>Costs and pricing for Google Compute Engine machine type [% instance.name %] in Google Cloud region [% instance.region %][% IF instance.regionLocation %] ([% instance.regionLocation %])[% END %].</p>\n\n<h3>Price per Hour</h3>\n<div class=\"table-responsive\">\n<table class=\"table table-hover table-striped table-bordered\">\n\t<tr>\n\t\t<th>Standard price per hour</th>\n\t\t<td class=\"currency\">[% instance.hour %]</td>\n\t</tr>\n\t[% IF instance.spot && instance.hourSpot > 0 %]\n\t<tr>\n\t\t<th>Spot provisioning model (Spot VM)</th>\n\t\t<td class=\"currency\">[% instance.hourSpot %]</td>\n\t</tr>\n\t[% END %]\n</table>\n</div>\n\n<h3>Price per Month</h3>\n<div class=\"table-responsive\">\n<table class=\"table table-hover table-striped table-bordered\">\n\t<tr>\n\t\t<th>Price per month[% IF instance.sud %] with sustained use discount (SUD)[% END %]</th>\n\t\t<td class=\"currency\">[% instance.month %]</td>\n\t</tr>\n\t[% IF instance.spot && instance.monthSpot > 0 %]\n\t<tr>\n\t\t<th>Spot provisioning model (Spot VM)</th>\n\t\t<td class=\"currency\">[% instance.monthSpot %]</td>\n\t</tr>\n\t[% END %]\n\t<tr>\n\t\t<th>1 year commitment (CUD)</th>\n\t\t<td class=\"currency\">[% instance.month1yCud %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>3 year commitment (CUD)</th>\n\t\t<td class=\"currency\">[% instance.month3yCud %]</td>\n\t</tr>\n</table>\n</div><!-- table-responsive -->\n\n<h3>Operating System Licenses Costs</h3>\n<p>Monthly costs for paid <i>premium</i> operating system licenses for Google Compute Engine machine type [% instance.name %].</p>\n<div class=\"table-responsive\">\n<table class=\"table table-sm table-hover table-striped table-bordered\">\n<thead>\n\t<tr>\n\t\t<th scope=\"col\">Operating System</th>\n\t\t<th scope=\"col\">Month</th>\n\t\t<th scope=\"col\">1Y CUD</th>\n\t\t<th scope=\"col\">3Y CUD</th>\n\t</tr>\n</thead>\n<tbody>\n\t<tr>\n\t\t<th>Microsoft Windows Server</th>\n\t\t<td class=\"currency\">[% instance.monthWindows %]</td>\n\t\t<td></td>\n\t\t<td></td>\n\t</tr>\n\t<tr>\n\t\t<th>SUSE Linux Enterprise Server</th>\n\t\t<td class=\"currency\">[% instance.monthSles %]</td>\n\t\t<td></td>\n\t\t<td></td>\n\t</tr>\n\t<tr>\n\t\t<th>Red Hat Enterprise Linux</th>\n\t\t<td class=\"currency\">[% instance.monthRhel %]</td>\n\t\t<td class=\"currency\">[% instance.monthRhel1yCud %]</td>\n\t\t<td class=\"currency\">[% instance.monthRhel3yCud %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>SUSE Linux Enterprise Server for SAP</th>\n\t\t<td class=\"currency\">[% instance.monthSlesSap %]</td>\n\t\t<td class=\"currency\">[% instance.monthSlesSap1yCud %]</td>\n\t\t<td class=\"currency\">[% instance.monthSlesSap3yCud %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>Red Hat Enterprise Linux for SAP</th>\n\t\t<td class=\"currency\">[% instance.monthRhelSap %]</td>\n\t\t<td class=\"currency\">[% instance.monthRhelSap1yCud %]</td>\n\t\t<td class=\"currency\">[% instance.monthRhelSap3yCud %]</td>\n\t</tr>\n</table>\n</div><!-- table-responsive -->\n\n<h2 id=\"region-carbon\">Carbon Data for Region [% instance.region %]</h2>\n<p>Higher CFE% will emit lower carbon emissions.</p>\n<div class=\"table-responsive\">\n<table class=\"table table-hover table-striped table-bordered\">\n\t<tr>\n\t\t<th>Google CFE%</th>\n\t\t<td>[% IF instance.regionCfe %][% instance.regionCfe %] %[% ELSE %]?[% END %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>Grid carbon intensity (gCO2eq/kWh)</th>\n\t\t<td>[% IF instance.regionCo2Kwh %][% instance.regionCo2Kwh %][% ELSE %]?[% END %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>Google Cloud net operational GHG emissions</th>\n\t\t<td>0</td>\n\t</tr>\n</table>\n</div><!-- // table-responsive -->\n\n[% IF instance.zones %]\n<h2>Google Cloud Command Line Interface <small class=\"text-muted\">CLI</small></h2>\n<p>Google Cloud Command Line Interface (CLI) snippets for Google Compute Engine machine type [% instance.name %] in Google Cloud Region [% instance.region %][% IF instance.regionLocation %] ([% instance.regionLocation %])[% END %].</p>\n<ul class=\"nav nav-tabs\" id=\"zonesTab\" role=\"tablist\">\n[% firstZone = 0; FOREACH zone IN instance.zones.split(', ').sort; firstZone = firstZone + 1; %]\n<li class=\"nav-item\" role=\"presentation\">\n\t<button [% IF firstZone == 1%]class=\"nav-link active\" aria-selected=\"true\"[% ELSE %]class=\"nav-link\"[% END %]\n\t\tid=\"[% zone %]-tab\"\n\t\tdata-bs-toggle=\"tab\"\n\t\tdata-bs-target=\"#[% zone %]\"\n\t\ttype=\"button\"\n\t\trole=\"tab\"\n\t\taria-controls=\"[% zone %]\"\n\t\ttitle=\"Google Compute Engine machine type [% instance.name %] in Google Cloud zone [% zone %]\">[% zone %]</button>\n</li>\n[% END %]\n</ul>\n<div class=\"tab-content\" id=\"zonesTabContent\">\n[% firstZone = 0; FOREACH zone IN instance.zones.split(', ').sort; firstZone = firstZone + 1; %]\n<div class=\"tab-pane mt-2 fade [% IF firstZone == 1%]show active[% END%]\" id=\"[% zone %]\" role=\"tabpanel\" aria-labelledby=\"[% zone %]-tab\">\n<p>Create instance:</p>\n<script>\nfunction copy[% zone.remove('-') %]() {\n\tvar cli = document.getElementById(\"cli[% zone.remove('-') %]\").innerText;\n\tnavigator.clipboard.writeText(cli);\n}\n</script>\n<!-- CLI snippet -->\n<div class=\"position-relative\">\n<div class=\"position-absolute top-0 end-0\">\n\t<button type=\"button\" class=\"btn btn-outline-primary btn-sm\" onclick=\"copy[% zone.remove('-') %]();\" title=\"Copy to clipboard\">Copy</button>\n</div>\n<pre class=\"bg-light\"><code id=\"cli[% zone.remove('-') %]\"><span class=\"text-muted\"># Create Google Compute Engine virtual machine instance</span>\n<span class=\"text-muted\"># called '[% instance.name%]-[% zone %]'</span>\n<span class=\"text-muted\"># in the '[% zone %]' zone</span>\n<span class=\"text-muted\"># with the latest 'Ubuntu 22.04 LTS' image available.</span>\n[% # do not remove this line %]\n[%- IF instance.sharedCpu < 1 && !instance.arm -%]\n<span class=\"text-muted\"># To specify minimum CPU platform replace min-cpu-platform:</span>\n[% # do not remove this line %]\n[%- FOREACH cpuPlatform IN instance.availableCpuPlatform.split(',').sort; cpu = cpuPlatform.remove('\\s'); -%]\n[%- FOREACH z IN zones; IF z.name == zone; available = z.availableCpuPlatforms.remove('\\s'); END; END; -%]\n[%- IF available.search(cpu) -%]\n<span class=\"text-muted\">#    --min-cpu-platform=&#39;[% cpuPlatform.remove('^\\s').remove('\\s$') %]&#39; \\</span>\n[% # do not remove this line %]\n[%- END; END; END -%]\ngcloud compute instances create [% instance.name %]-[% zone %] \\\n--zone=<span class=\"text-primary\">'[% zone %]'</span> \\\n--machine-type=<span class=\"text-primary\">'[% instance.name %]'</span> \\\n--min-cpu-platform=<span class=\"text-primary\">'AUTOMATIC'</span> \\\n--boot-disk-type=<span class=\"text-primary\">'pd-ssd'</span> \\\n--image-project=<span class=\"text-primary\">'ubuntu-os-cloud'</span> \\\n--image-family=<span class=\"text-primary\">[% IF instance.arm %]'ubuntu-2204-lts-arm64'[% ELSE %]'ubuntu-2204-lts'[% END %]</span></code></pre>\n</div> <!-- // position-relative -->\n<!-- // CLI snippet -->\n\n</div> <!-- // tab-pane -->\n[% END; END; %]\n</div> <!-- // tab-content -->\n\n<p>\n<a class=\"btn btn-primary btn-sm\" href=\"/[% instance.region %].html#disk-types\" role=\"button\" title=\"Persistent disk types in [% instance.region %]\">Boot disk types</a>\n<a class=\"btn btn-primary btn-sm\" href=\"/images.html\" role=\"button\">Operating system images</a>\n</p>\n\n<h2>Google Cloud Pricing and Cost Calculator <small class=\"text-muted\">gcosts</small></h2>\n<p>\nCalculate estimated monthly costs of Google Cloud Platform products and resources via YAML files\nand <a href=\"https://github.com/Cyclenerd/google-cloud-pricing-cost-calculator\">gcosts</a> Linux CLI program.\nCopy and paste the YAML to a new usage file <code>[% instance.name %]-[% instance.region %].yml</code>.\nMore help can be found in the <a href=\"https://github.com/Cyclenerd/google-cloud-pricing-cost-calculator#readme\">documentation</a> of the gcosts CLI program.\n</p>\n<script>\nfunction gcosts[% instance.name.remove('-') %]() {\n\tvar gcosts = document.getElementById(\"gcosts[% instance.name.remove('-') %]\").innerText;\n\tnavigator.clipboard.writeText(gcosts);\n}\n</script>\n<div class=\"position-relative\">\n<div class=\"position-absolute top-0 end-0\"><button type=\"button\" class=\"btn btn-outline-primary btn-sm\" onclick=\"gcosts[% instance.name.remove('-') %]();\" title=\"Copy to clipboard\">Copy</button></div>\n<pre class=\"bg-light\"><code id=\"gcosts[% instance.name.remove('-') %]\"><span class=\"text-muted\"># gcosts YAML usage file</span>\n<span class=\"text-muted\"># Help: https://bit.ly/gcosts-usage</span>\n<span class=\"text-muted\"># Machine type: [% site.url %]/[% instance.region %]/[% instance.name %].html</span>\n<span class=\"text-primary\">region</span>: [% instance.region %]\n<span class=\"text-primary\">instances</span>:\n  - <span class=\"text-primary\">name</span>: [% instance.name %]-[% instance.region %]\n    <span class=\"text-primary\">type</span>: [% instance.name %]\n    <span class=\"text-primary\">commitment</span>: 0\n    <span class=\"text-primary\">disks</span>:\n      - <span class=\"text-primary\">name</span>: boot-[% instance.name %]-[% instance.region %]\n        <span class=\"text-primary\">type</span>: ssd\n        <span class=\"text-primary\">data</span>: 75\n      - <span class=\"text-primary\">name</span>: snapshot-[% instance.name %]-[% instance.region %]\n        <span class=\"text-primary\">type</span>: snapshot\n        <span class=\"text-primary\">data</span>: 10</code></pre>\n</div> <!-- // position-relative -->\n\n</div> <!-- // col -->\n</div> <!-- // row -->\n\n[% PROCESS footer.tt2 %]"
  },
  {
    "path": "build/src/instances.tt2",
    "content": "[%- PROCESS header.tt2 -%]\n[%- PROCESS instances_header.tt2 -%]\n\n<h1>Google Compute Engine Machine Types</h1>\n\n<blockquote class=\"blockquote\">\n<p>\nThere are <mark>[% instances.size %]</mark> Google Compute Engine machine types in total.\nNot every Google Cloud VM is available in every region.\n</p>\n</blockquote>\n\n<div class=\"table-responsive\">\n[%- PROCESS instances_tr.tt2; -%]\n<table\n\tclass=\"table table-sm table-hover table-bordered\"\n\tdata-classes=\"table table-sm table-hover table-bordered\"\n\tdata-toggle=\"table\"\n\tdata-sort-name=\"vcpu\"\n\tdata-sort-order=\"asc\"\n\tdata-sortable=\"true\"\n\tdata-sticky-header=\"true\"\n>\n<thead>\n[%- instanceTh() -%]\n</thead>\n<tbody>\n[%- FOREACH instance IN instances; instanceTr(instance); END -%]\n</tbody>\n</table>\n</div> <!-- // table-responsive -->\n[% PROCESS footer.tt2 %]"
  },
  {
    "path": "build/src/instances_header.tt2",
    "content": "<div class=\"row mt-2\">\n<div class=\"col\">\n<ul class=\"nav nav-tabs\">\n\t<li class=\"nav-item\">\n\t\t<a [% IF template.name == 'instances.tt2' %]class=\"nav-link active\" aria-current=\"page\"[% ELSE %]class=\"nav-link\"[% END %] href=\"/instances.html\">Machines (All)</a>\n\t</li>\n\t<li class=\"nav-item\">\n\t\t<a [% IF template.name == 'intel.tt2' %]class=\"nav-link active\" aria-current=\"page\"[% ELSE %]class=\"nav-link\"[% END %] href=\"/intel.html\">Intel</a>\n\t</li>\n\t<li class=\"nav-item\">\n\t\t<a [% IF template.name == 'amd.tt2' %]class=\"nav-link active\" aria-current=\"page\"[% ELSE %]class=\"nav-link\"[% END %] href=\"/amd.html\">AMD</a>\n\t</li>\n\t<li class=\"nav-item\">\n\t\t<a [% IF template.name == 'arm.tt2' %]class=\"nav-link active\" aria-current=\"page\"[% ELSE %]class=\"nav-link\"[% END %] href=\"/arm.html\">Arm</a>\n\t</li>\n\t<li class=\"nav-item\">\n\t\t<a [% IF template.name == 'gpu.tt2' %]class=\"nav-link active\" aria-current=\"page\"[% ELSE %]class=\"nav-link\"[% END %] href=\"/gpu.html\">GPU</a>\n\t</li>\n\t<li class=\"nav-item\">\n\t\t<a [% IF template.name == 'sap.tt2' %]class=\"nav-link active\" aria-current=\"page\"[% ELSE %]class=\"nav-link\"[% END %] href=\"/sap.html\">SAP</a>\n\t</li>\n\t<li class=\"nav-item\">\n\t\t<a [% IF template.name == 'hana.tt2' %]class=\"nav-link active\" aria-current=\"page\"[% ELSE %]class=\"nav-link\"[% END %] href=\"/hana.html\">HANA</a>\n\t</li>\n</ul>\n</div> <!-- // col -->\n</div> <!-- // row -->"
  },
  {
    "path": "build/src/instances_tr.tt2",
    "content": "[%- MACRO instanceTh BLOCK -%]\n<tr>\n<th scope=\"col\" colspan=\"5\">Machine Type</th>\n<th scope=\"col\">Regions</th>\n<th scope=\"col\" colspan=\"5\">Costs (Avg. Region)</th>\n<th scope=\"col\" colspan=\"3\">OS</th>\n</tr>\n<tr>\n<th scope=\"col\" data-sortable=\"true\">Name</th>\n<th scope=\"col\" data-field=\"vcpu\" data-sortable=\"true\">vCPU</th>\n<th scope=\"col\" data-sortable=\"true\">Base Clock</th>\n<th scope=\"col\" data-sortable=\"true\">Memory</th>\n<th scope=\"col\"></th>\n<th scope=\"col\">#</th>\n<!-- Costs -->\n<th scope=\"col\" title=\"Costs per hour\" data-sortable=\"true\">Hour</th>\n<th scope=\"col\" title=\"Costs per Spot VM hour\" data-sortable=\"true\">Spot</th>\n<th scope=\"col\" title=\"Costs per month\" data-sortable=\"true\">Month</th>\n<th scope=\"col\" title=\"Costs per month with 1 year commitment (CUD)\" data-sortable=\"true\">1Y CUD</th>\n<th scope=\"col\" title=\"Costs per month with 3 year commitment (CUD)\" data-sortable=\"true\">3Y CUD</th>\n<!-- OS -->\n<th scope=\"col\" title=\"SUSE Linux Enterprise Server\">SLES</th>\n<th scope=\"col\" title=\"Red Hat Enterprise Linux\">RHEL</th>\n<th scope=\"col\" title=\"Microsoft Windows Server\">Windows</th>\n</tr>\n[%- END -%]\n\n[%- MACRO instanceTr(instance) BLOCK -%]\n<tr>\n<td><a href=\"/[% instance.name %].html\" title=\"Google Compute Engine machine type [% instance.name %]\">[% instance.name %]</a></td>\n<td class=\"text-nowrap\">[% instance.vCpus %][% badgeSharedCpu(instance) %]</td>\n<td class=\"frequency\" title=\"CPU base clock frequency: [% instance.cpuBaseClock %] GHz\">[% instance.cpuBaseClock %]</td>\n<td class=\"memory\" title=\"Random-access memory: [% instance.memoryGB %] GB\">[% instance.memoryGB %]</td>\n<td>\n\t[% badgeCpuManufactur(instance) %]\n\t[% badgeGpu(instance) %]\n\t[% badgeSap(instance) %]\n\t[% badgeHana(instance) %]\n\t[% badgeSpot(instance) %]\n\t[% badgeSud(instance) %]\n\t[% badgeLocalSsd(instance) %]\n</td>\n<td>[% instance.regionCount %]</td>\n<!-- Costs -->\n<td class=\"currency\" title=\"[% instance.name %] avg. costs per hour: [% instance.avgHour %] USD\">[% instance.avgHour %]</td>\n<td class=\"currency\" title=\"[% instance.name %] avg. costs per hour with spot provisioning model (Spot VM): [% instance.avgHourSpot %] USD\">[% instance.avgHourSpot %]</td>\n<td class=\"currency\" title=\"[% instance.name %] avg. costs per month: [% instance.avgMonth %] USD[% IF instance.sud %] with sustained use discounts (SUD) applied[% END %]\">[% instance.avgMonth %]</td>\n<td class=\"currency\" title=\"[% instance.name %] avg. costs per month w. 1Y CUD: [% instance.avgMonth1yCud %] USD\">[% instance.avgMonth1yCud %]</td>\n<td class=\"currency\" title=\"[% instance.name %] avg. costs per month w. 3Y CUD: [% instance.avgMonth3yCud %] USD\">[% instance.avgMonth3yCud %]</td>\n<!-- OS -->\n<td class=\"currency\" title=\"[% instance.name %] license costs for SUSE Linux Enterprise Server: [% instance.monthSles %] USD\">[% instance.monthSles %]</td>\n<td class=\"currency\" title=\"[% instance.name %] license costs for Red Hat Enterprise Linux: [% instance.monthRhel %] USD\">[% instance.monthRhel %]</td>\n<td class=\"currency\" title=\"[% instance.name %] license costs for Microsoft Windows Server: [% instance.monthWindows %] USD\">[% instance.monthWindows %]</td>\n</tr>\n[%- END -%]\n\n[%- MACRO instancePlatformTh BLOCK -%]\n<tr>\n<th scope=\"col\" colspan=\"6\">Machine Type</th>\n<th scope=\"col\">Regions</th>\n<th scope=\"col\" colspan=\"5\">Costs (Avg. Region)</th>\n<th scope=\"col\" colspan=\"3\">OS</th>\n</tr>\n<tr>\n<th scope=\"col\" data-sortable=\"true\">Name</th>\n<th scope=\"col\" data-field=\"vcpu\" data-sortable=\"true\">vCPU</th>\n<th scope=\"col\" data-sortable=\"true\">Base Clock</th>\n<th scope=\"col\">Platform</th>\n<th scope=\"col\" data-sortable=\"true\">Memory</th>\n<th scope=\"col\"></th>\n<th scope=\"col\">#</th>\n<!-- Costs -->\n<th scope=\"col\" data-sortable=\"true\">Hour</th>\n<th scope=\"col\" data-sortable=\"true\">Spot</th>\n<th scope=\"col\" data-sortable=\"true\">Month</th>\n<th scope=\"col\" data-sortable=\"true\">1Y CUD</th>\n<th scope=\"col\" data-sortable=\"true\">3Y CUD</th>\n<!-- OS -->\n<th scope=\"col\">SLES</th>\n<th scope=\"col\">RHEL</th>\n<th scope=\"col\">Windows</th>\n</tr>\n[%- END -%]\n\n[%- MACRO instancePlatformTr(instance) BLOCK -%]\n<tr>\n<td><a href=\"/[% instance.name %].html\" title=\"Google Compute Engine machine type [% instance.name %]\">[% instance.name %]</a></td>\n<td class=\"text-nowrap\">[% instance.vCpus %][% badgeSharedCpu(instance) %]</td>\n<td class=\"frequency\" title=\"CPU base clock frequency: [% instance.cpuBaseClock %] GHz\">[% instance.cpuBaseClock %]</td>\n<td title=\"CPU Platform: [% instance.cpuPlatform %]\">[% instance.cpuPlatform | replace('\\[','') | replace('\\]','') | replace('Intel','') | replace('AMD','') %]</td>\n<td class=\"memory\" title=\"Random-access memory: [% instance.memoryGB %] GB\">[% instance.memoryGB %]</td>\n<td>\n\t[% badgeGpu(instance) %]\n\t[% badgeSap(instance) %]\n\t[% badgeHana(instance) %]\n\t[% badgeSpot(instance) %]\n\t[% badgeSud(instance) %]\n\t[% badgeLocalSsd(instance) %]\n</td>\n<td>[% instance.regionCount %]</td>\n<!-- Costs -->\n<td class=\"currency\" title=\"[% instance.name %] avg. costs per hour: [% instance.avgHour %] USD\">[% instance.avgHour %]</td>\n<td class=\"currency\" title=\"[% instance.name %] avg. costs per hour with spot provisioning model (Spot VM): [% instance.avgHourSpot %] USD\">[% instance.avgHourSpot %]</td>\n<td class=\"currency\" title=\"[% instance.name %] avg. costs per month: [% instance.avgMonth %] USD[% IF instance.sud %] with sustained use discounts (SUD) applied[% END %]\">[% instance.avgMonth %]</td>\n<td class=\"currency\" title=\"[% instance.name %] avg. costs per month w. 1Y CUD: [% instance.avgMonth1yCud %] USD\">[% instance.avgMonth1yCud %]</td>\n<td class=\"currency\" title=\"[% instance.name %] avg. costs per month w. 3Y CUD: [% instance.avgMonth3yCud %] USD\">[% instance.avgMonth3yCud %]</td>\n<!-- OS -->\n<td class=\"currency\" title=\"[% instance.name %] license costs for SUSE Linux Enterprise Server: [% instance.monthSles %] USD\">[% instance.monthSles %]</td>\n<td class=\"currency\" title=\"[% instance.name %] license costs for Red Hat Enterprise Linux: [% instance.monthRhel %] USD\">[% instance.monthRhel %]</td>\n<td class=\"currency\" title=\"[% instance.name %] license costs for Microsoft Windows Server: [% instance.monthWindows %] USD\">[% instance.monthWindows %]</td>\n</tr>\n[%- END -%]"
  },
  {
    "path": "build/src/intel.tt2",
    "content": "[%- PROCESS header.tt2 -%]\n[%- PROCESS instances_header.tt2 -%]\n\n<h1>Google Compute Engine Machine Types with Intel CPU Platform</h1>\n\n[%- countIntel = 0; FOREACH instance IN instances; IF instance.intel; countIntel = countIntel + 1; END; END -%]\n<blockquote class=\"blockquote\">\n<p>\nThere are <mark>[% countIntel %]</mark> Google Compute Engine machine types with Intel central processing unit (CPU) available.\nNot every GCE machine type with Intel CPU is available in every Google Cloud region.\n</p>\n</blockquote>\n\n<p><a class=\"btn btn-success\" href=\"/grid.html?platform=intel\" role=\"button\">✅ Instance Picker with filter on CPU Platform</a></p>\n\n<div class=\"table-responsive\">\n[%- PROCESS instances_tr.tt2; -%]\n<table\n\tclass=\"table table-sm table-hover table-bordered\"\n\tdata-classes=\"table table-sm table-hover table-bordered\"\n\tdata-toggle=\"table\"\n\tdata-sort-name=\"vcpu\"\n\tdata-sort-order=\"asc\"\n\tdata-sortable=\"true\"\n\tdata-sticky-header=\"true\"\n>\n<thead>\n[%- instancePlatformTh() -%]\n</thead>\n<tbody>\n[%- FOREACH instance IN instances; IF instance.intel; instancePlatformTr(instance); END; END -%]\n</tbody>\n</table>\n</div> <!-- // table-responsive -->\n[% PROCESS footer.tt2 %]"
  },
  {
    "path": "build/src/macros.tt2",
    "content": "[%- MACRO badgeSharedCpu(instance) BLOCK -%]\n[% IF instance.sharedCpu %] <span class=\"badge bg-warning text-dark\">Shared</span>[% END %]\n[%- END -%]\n\n[%- MACRO badgeCpuManufactur(instance) BLOCK -%]\n[% IF instance.intel %]<span class=\"badge bg-primary\">Intel</span>[% END %]\n[% IF instance.amd   %]<span class=\"badge bg-danger\">AMD</span>[% END %]\n[% IF instance.arm   %]<span class=\"badge bg-success\">Arm</span>[% END %]\n[%- END -%]\n\n[%- MACRO badgeSud(instance) BLOCK -%]\n[% IF instance.sud %]<span class=\"badge bg-info\" title=\"Sustained Use Discount (SUD)\">SUD</span>[% END %]\n[%- END -%]\n\n[%- MACRO badgeGpu(instance) BLOCK -%]\n[% IF instance.acceleratorCount && instance.acceleratorCount > 0; %]<span class=\"badge text-bg-dark text-light\" title=\"Accelerator (GPU)\">GPU</span>[% END %]\n[%- END -%]\n\n[%- MACRO badgeLocalSsd(instance) BLOCK -%]\n[% IF instance.localSsd %]<span class=\"badge bg-light text-dark\">Local SSD</span>[% END %]\n[%- END -%]\n\n[%- MACRO badgeSap(instance) BLOCK -%]\n[% IF instance.sap %]<span class=\"badge bg-warning text-dark\" title=\"Certified for SAP\">SAP</span>[% END %]\n[%- END -%]\n\n[%- MACRO badgeHana(instance) BLOCK -%]\n[% IF instance.hana %]<span class=\"badge bg-warning text-dark\" title=\"Certified for SAP HANA\">HANA</span>[% END %]\n[%- END -%]\n\n[%- MACRO badgeSpot(instance) BLOCK -%]\n[% IF instance.spot %]<span class=\"badge bg-secondary text-light\" title=\"Spot Provisioning Mode (Spot VM)\">Spot</span>[% END %]\n[%- END -%]\n\n[%- MACRO badgeImageArch(architecture) BLOCK -%]\n[% IF architecture %]<span class=\"badge [% IF architecture == \"ARM64\" %]bg-success[% ELSE %]bg-primary[% END %]\" title=\"CPU Architecture\">[% architecture %]</span>[% END %]\n[%- END -%]\n\n[%- MACRO badgeLowCo2Region(region) BLOCK -%]\n[% IF region.regionLowCo2 %]<span\nclass=\"badge rounded-pill bg-success\"\ntitle=\"Region: [% region.name %], \n[%- IF region.regionCfe -%]Google CFE%: [% region.regionCfe %] %, [% END %]\n[%- IF region.regionCo2Kwh -%]Grid carbon intensity (gCO2eq/kWh): [% region.regionCo2Kwh %][% END %]\">🍃 Low CO2</span>\n[%- END -%]\n[%- END -%]\n\n[%- MACRO iconLowCo2Region(region) BLOCK -%]\n[% IF region.regionLowCo2 %]<span class=\"badge rounded-pill bg-success\" title=\"Low CO2 Region\">🍃</span>\n[%- END -%]\n[%- END -%]\n\n[%- MACRO booleanLocalSsd(instance) BLOCK -%]\n[% IF instance.localSsd %]✔️[% ELSE %]❌[% END %]\n[%- END -%]\n\n[%- MACRO bundledLocalSsd(instance) BLOCK -%]\n[% IF instance.localSsd > 1 %]\n<span class=\"badge text-bg-warning\">Bundled with [% instance.localSsd FILTER format(\"%.0f\") %] GB</span>\n[% ELSIF instance.name.search('-lssd') %]\n<span class=\"badge text-bg-danger\">Mandatory, additional costs!</span>\n[% ELSE %]\n<span class=\"badge text-bg-success\">Optional</span>\n[% END %]\n[%- END -%]\n\n[%- MACRO booleanSpot(instance) BLOCK -%]\n[% IF instance.spot %]✔️[% ELSE %]❌[% END %]\n[%- END -%]\n\n[%- MACRO booleanSud(instance) BLOCK -%]\n[% IF instance.sud  %]✔️[% ELSE %]❌[% END %]\n[%- END -%]\n\n[%- MACRO booleanSap(instance) BLOCK -%]\n[% IF instance.sap %]✔️ Certified for SAP[% ELSE %]❌[% END %]\n[%- END -%]\n\n[%- MACRO booleanHana(instance) BLOCK -%]\n[% IF instance.hana %]✔️ Certified for SAP HANA[% ELSE %]❌[% END %]\n[%- END -%]\n\n[%- MACRO listCpuPlatform(instance) BLOCK -%]\n<ul class=\"list-unstyled\">\n\t[% FOREACH cpuPlatform IN instance.cpuPlatform.split(',').sort %]\n\t<li>[% cpuPlatform %]</li>\n\t[% END %]\n</ul>\n[%- END -%]\n\n[%- MACRO tableCompareText(a, b) BLOCK -%]\n[% IF a == b %]<td class=\"table-primary\">=</td>[% ELSE %]<td class=\"table-warning\">≠</td>[% END %]\n[%- END -%]\n\n[%- MACRO tableCompareNumber(a, b) BLOCK -%]\n[%- diff = b - a; IF b == a -%]\n\t<td class=\"table-primary\">=</td>\n[%- ELSIF b > a -%]\n\t<td class=\"table-success\">+[% diff FILTER format(\"%.2f\") %]</td>\n[%- ELSE -%]\n\t<td class=\"table-danger\">[% diff FILTER format(\"%.2f\") %]</td>\n[%- END; END; -%]\n\n[%- MACRO tableCompareBoolean(a, b) BLOCK -%]\n[% IF a == b %]\n\t<td class=\"table-primary\">=</td>\n[%- ELSIF b > a -%]\n\t<td class=\"table-success\">+</td>\n[%- ELSE -%]\n\t<td class=\"table-danger\">-</td>\n[%- END; END; -%]\n\n[%- MACRO tableCompareCosts(a, b) BLOCK -%]\n[%- \n\tdifference = b - a;\n-%]\n[%- IF b == a -%]\n\t<td class=\"table-primary\">=</td>\n[%- ELSIF b < a -%]\n\t<td class=\"table-success\">[% difference FILTER format(\"%.4f\") %]</td>\n[%- ELSE -%]\n\t<td class=\"table-danger\">+[% difference FILTER format(\"%.4f\") %]</td>\n[%- END; END; -%]\n\n[%- MACRO imageProjectName(project) BLOCK -%]\n[%- IF    project == 'almalinux-cloud'               -%]AlmaLinux\n[%- ELSIF project == 'centos-cloud'                  -%]CentOS\n[%- ELSIF project == 'cloud-hpc-image-public'        -%]HPC\n[%- ELSIF project == 'cos-cloud'                     -%]Container-Optimized OS\n[%- ELSIF project == 'debian-cloud'                  -%]Debian GNU/Linux\n[%- ELSIF project == 'deeplearning-platform-release' -%]Deep Learning\n[%- ELSIF project == 'fedora-cloud'                  -%]Fedora\n[%- ELSIF project == 'fedora-coreos-cloud'           -%]Fedora CoreOS\n[%- ELSIF project == 'freebsd-org-cloud-dev'         -%]FreeBSD\n[%- ELSIF project == 'ml-images'                     -%]Machine Learning\n[%- ELSIF project == 'opensuse-cloud'                -%]openSUSE\n[%- ELSIF project == 'oracle-linux-cloud'            -%]Oracle Linux\n[%- ELSIF project == 'rhel-cloud'                    -%]Red Hat Enterprise Linux\n[%- ELSIF project == 'rhel-sap-cloud'                -%]Red Hat Enterprise Linux for SAP\n[%- ELSIF project == 'rocky-linux-accelerator-cloud' -%]Rocky Linux (NVIDIA)\n[%- ELSIF project == 'rocky-linux-cloud'             -%]Rocky Linux\n[%- ELSIF project == 'suse-cloud'                    -%]SUSE Linux Enterprise Server\n[%- ELSIF project == 'suse-sap-cloud'                -%]SUSE Linux Enterprise Server for SAP\n[%- ELSIF project == 'ubuntu-os-accelerator-images'  -%]Ubuntu (NVIDIA)\n[%- ELSIF project == 'ubuntu-os-cloud'               -%]Ubuntu\n[%- ELSIF project == 'ubuntu-os-pro-cloud'           -%]Ubuntu Pro\n[%- ELSIF project == 'windows-cloud'                 -%]Microsoft Windows Server\n[%- ELSIF project == 'windows-sql-cloud'             -%]Microsoft SQL Server\n[%- ELSE -%][% project %]\n[%- END; END; -%]\n\n[%- MACRO countryFlag(code) BLOCK -%]\n[%- IF    code == '??' -%]🏳️\n[%- ELSIF code == 'AU' -%]🇦🇺\n[%- ELSIF code == 'BE' -%]🇧🇪\n[%- ELSIF code == 'BR' -%]🇧🇷\n[%- ELSIF code == 'CA' -%]🇨🇦\n[%- ELSIF code == 'CH' -%]🇨🇭\n[%- ELSIF code == 'CL' -%]🇨🇱\n[%- ELSIF code == 'DE' -%]🇩🇪\n[%- ELSIF code == 'ES' -%]🇪🇸\n[%- ELSIF code == 'FI' -%]🇫🇮\n[%- ELSIF code == 'FR' -%]🇫🇷\n[%- ELSIF code == 'GB' -%]🇬🇧\n[%- ELSIF code == 'HK' -%]🇭🇰\n[%- ELSIF code == 'ID' -%]🇮🇩\n[%- ELSIF code == 'IL' -%]🇮🇱\n[%- ELSIF code == 'IN' -%]🇮🇳\n[%- ELSIF code == 'IT' -%]🇮🇹\n[%- ELSIF code == 'JP' -%]🇯🇵\n[%- ELSIF code == 'KR' -%]🇰🇷\n[%- ELSIF code == 'MX' -%]🇲🇽\n[%- ELSIF code == 'NL' -%]🇳🇱\n[%- ELSIF code == 'PL' -%]🇵🇱\n[%- ELSIF code == 'QA' -%]🇶🇦\n[%- ELSIF code == 'SA' -%]🇸🇦\n[%- ELSIF code == 'SE' -%]🇸🇪\n[%- ELSIF code == 'SG' -%]🇸🇬\n[%- ELSIF code == 'TH' -%]🇹🇭\n[%- ELSIF code == 'TW' -%]🇹🇼\n[%- ELSIF code == 'US' -%]🇺🇸\n[%- ELSIF code == 'ZA' -%]🇿🇦\n[%- ELSE -%]🏴 ???\n[%- END; END; -%]\n\n[%- MACRO countryName(code) BLOCK -%]\n[%- IF    code == '??' -%]???\n[%- ELSIF code == 'AU' -%]Australia\n[%- ELSIF code == 'BE' -%]Belgium\n[%- ELSIF code == 'BR' -%]Brazil\n[%- ELSIF code == 'CA' -%]Canada\n[%- ELSIF code == 'CH' -%]Switzerland\n[%- ELSIF code == 'CL' -%]Chile\n[%- ELSIF code == 'DE' -%]Germany\n[%- ELSIF code == 'ES' -%]Spain\n[%- ELSIF code == 'FI' -%]Finland\n[%- ELSIF code == 'FR' -%]France\n[%- ELSIF code == 'GB' -%]United Kingdom\n[%- ELSIF code == 'HK' -%]Hong Kong SAR China\n[%- ELSIF code == 'ID' -%]Indonesia\n[%- ELSIF code == 'IL' -%]Israel\n[%- ELSIF code == 'IN' -%]India\n[%- ELSIF code == 'IT' -%]Italy\n[%- ELSIF code == 'JP' -%]Japan\n[%- ELSIF code == 'KR' -%]South Korea\n[%- ELSIF code == 'MX' -%]Mexico\n[%- ELSIF code == 'NL' -%]Netherlands\n[%- ELSIF code == 'PL' -%]Poland\n[%- ELSIF code == 'QA' -%]Qatar\n[%- ELSIF code == 'SA' -%]Saudi Arabia\n[%- ELSIF code == 'SE' -%]Sweden\n[%- ELSIF code == 'SG' -%]Singapore\n[%- ELSIF code == 'TH' -%]Thailand\n[%- ELSIF code == 'TW' -%]Taiwan\n[%- ELSIF code == 'US' -%]United States\n[%- ELSIF code == 'ZA' -%]South Africa\n[%- ELSE -%]???\n[%- END; END; -%]"
  },
  {
    "path": "build/src/main.js",
    "content": "/*\n * Copyright 2022-2024 Nils Knieling. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/*\n * FILTERS\n */\n\nconst filterParamsNumber = {\n\tfilterOptions: ['equals', 'greaterThan', 'greaterThanOrEqual', 'lessThan', 'lessThanOrEqual'],\n\tdefaultOption: 'greaterThanOrEqual',\n\tdebounceMs: 100,\n};\nconst filterLowerParamsNumber = {\n\tfilterOptions: ['equals', 'greaterThan', 'greaterThanOrEqual', 'lessThan', 'lessThanOrEqual'],\n\tdefaultOption: 'lessThanOrEqual',\n\tdebounceMs: 100,\n};\nconst filterParamsText = {\n\tfilterOptions: ['equals', 'notEqual', 'contains', 'notContains', 'startsWith', 'endsWith'],\n\tdefaultOption: 'contains',\n\tdebounceMs: 100,\n};\nconst filterParamsBoolean = {\n\tfilterOptions: ['equals'],\n\tdefaultOption: 'equals',\n\tmaxNumConditions: 1,\n\tdebounceMs: 0,\n};\n\n/*\n * FORMATTERS\n */\n\nfunction booleanFormatter(params) {\n\treturn (params.value >= 1) ? '✅ (1)' : '❌ (0)';\n}\n\nfunction lowCo2Formatter(params) {\n\treturn (params.value >= 1) ? '🍃 (1)' : '❌ (0)';\n}\n\nfunction nullFormatter(params) {\n\treturn (params.value >= 0.01) ? params.value : '?';\n}\n\n/*\n * GRID\n */\n\nconst gridOptions = {\n\tcolumnDefs: [\n\t\t// groupId: 0\n\t\t{\n\t\t\theaderName: 'Machine Type',\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\theaderName: 'Name',\n\t\t\t\t\tfield: \"name\",\n\t\t\t\t\tcellRenderer: params => {\n\t\t\t\t\t\treturn '<a href=\"./'+ params.data.region +'/'+ params.value +'.html\">'+ params.value + '</a>';\n\t\t\t\t\t},\n\t\t\t\t\ttooltipValueGetter: params => {\n\t\t\t\t\t\treturn 'Machine type '+  params.value +' ('+ params.data.vCpus + ' vCPUs, '+ params.data.memoryGB + ' GB, '+ params.data.bandwidth + ' Gbps) in region '+ params.data.region;\n\t\t\t\t\t},\n\t\t\t\t\tpinned: 'left',\n\t\t\t\t\t//rowDrag: true,\n\t\t\t\t\tcheckboxSelection: true,\n\t\t\t\t\twidth: 180,\n\t\t\t\t},\n\t\t\t]\n\t\t},\n\t\t// groupId: 1\n\t\t{\n\t\t\theaderName: 'Region',\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\theaderName: 'Name',\n\t\t\t\t\tfield: \"region\",\n\t\t\t\t\ttooltipField: 'region',\n\t\t\t\t\twidth: 120,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theaderName: 'Location',\n\t\t\t\t\tfield: \"regionLocation\",\n\t\t\t\t\tcolumnGroupShow: 'open',\n\t\t\t\t\ttooltipField: 'regionLocationLong',\n\t\t\t\t\twidth: 120\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theaderName: 'Country',\n\t\t\t\t\tfield: \"regionLocationCountryCode\",\n\t\t\t\t\theaderTooltip: 'ISO 3166-1 alpha-2 country code',\n\t\t\t\t\tcolumnGroupShow: 'open',\n\t\t\t\t\twidth: 90\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theaderName: 'Low CO2',\n\t\t\t\t\tfield: \"regionLowCo2\",\n\t\t\t\t\tcolumnGroupShow: 'open',\n\t\t\t\t\tfilterParams: filterParamsBoolean,\n\t\t\t\t\tvalueFormatter: lowCo2Formatter,\n\t\t\t\t\twidth: 90\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theaderName: 'CFE%',\n\t\t\t\t\theaderTooltip: 'Google CFE%: Average percentage of carbon free energy consumed in a particular location on an hourly basis',\n\t\t\t\t\tfield: \"regionCfe\",\n\t\t\t\t\tcolumnGroupShow: 'open',\n\t\t\t\t\tfilter: 'agNumberColumnFilter',\n\t\t\t\t\tfilterParams: filterParamsNumber,\n\t\t\t\t\tvalueFormatter: nullFormatter,\n\t\t\t\t\twidth: 90\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theaderName: 'gCO2eq/kWh',\n\t\t\t\t\theaderTooltip: 'Grid carbon intensity (gCO2eq/kWh): Average lifecycle gross emissions per unit of energy from the grid',\n\t\t\t\t\tfield: \"regionCo2Kwh\",\n\t\t\t\t\tcolumnGroupShow: 'open',\n\t\t\t\t\tfilter: 'agNumberColumnFilter',\n\t\t\t\t\tfilterParams: filterLowerParamsNumber,\n\t\t\t\t\tvalueFormatter: nullFormatter,\n\t\t\t\t\twidth: 120\n\t\t\t\t},\n\t\t\t]\n\t\t},\n\t\t// groupId: 2\n\t\t{\n\t\t\theaderName: 'Zones',\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\theaderName: '#Zones',\n\t\t\t\t\tfield: \"zoneCount\",\n\t\t\t\t\tfilter: 'agNumberColumnFilter',\n\t\t\t\t\tfilterParams: filterParamsNumber,\n\t\t\t\t\tcellClass: params => {\n\t\t\t\t\t\tif (params.value <= 1) { return 'warning' }\n\t\t\t\t\t},\n\t\t\t\t\twidth: 90,\n\t\t\t\t\theaderTooltip: 'Available in zones',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theaderName: 'Names',\n\t\t\t\t\tfield: \"zones\",\n\t\t\t\t\tcolumnGroupShow: 'open',\n\t\t\t\t\ttooltipField: 'zones',\n\t\t\t\t\twidth: 180,\n\t\t\t\t\theaderTooltip: 'Available in zone names',\n\t\t\t\t},\n\t\t\t]\n\t\t},\n\t\t// groupId: 3\n\t\t// groupId is used in setColumnGroupState for inital filter\n\t\t{\n\t\t\theaderName: 'Prozessor',\n\t\t\tchildren: [\n\t\t\t\t{ \n\t\t\t\t\theaderName: 'vCPUs',\n\t\t\t\t\tfield: \"vCpus\",\n\t\t\t\t\tfilter: 'agNumberColumnFilter',\n\t\t\t\t\tfilterParams: filterParamsNumber,\n\t\t\t\t\tcellClass: params => {\n\t\t\t\t\t\tif (params.data.sharedCpu >= 1) { return 'sharedCpu' }\n\t\t\t\t\t},\n\t\t\t\t\theaderTooltip: 'A vCPU represents a single logical CPU thread',\n\t\t\t\t\twidth: 90,\n\t\t\t\t},\n\t\t\t\t{ \n\t\t\t\t\theaderName: 'Frequency',\n\t\t\t\t\tfield: \"cpuBaseClock\",\n\t\t\t\t\tfilter: 'agNumberColumnFilter',\n\t\t\t\t\tfilterParams: filterParamsNumber,\n\t\t\t\t\theaderTooltip: 'CPU base clock frequency',\n\t\t\t\t\twidth: 120,\n\t\t\t\t\tcellClass: 'frequency',\n\t\t\t\t},\n\t\t\t\t{ \n\t\t\t\t\theaderName: 'Turbo Frequency',\n\t\t\t\t\tfield: \"cpuTurboClock\",\n\t\t\t\t\tcolumnGroupShow: 'open',\n\t\t\t\t\tfilter: 'agNumberColumnFilter',\n\t\t\t\t\tfilterParams: filterParamsNumber,\n\t\t\t\t\theaderTooltip: 'CPU all-core turbo frequency / effective frequency',\n\t\t\t\t\twidth: 120,\n\t\t\t\t\tcellClass: 'frequency',\n\t\t\t\t},\n\t\t\t\t{ \n\t\t\t\t\theaderName: 'Max. Turbo Frequency',\n\t\t\t\t\tfield: \"cpuSingleMaxTurboClock\",\n\t\t\t\t\tcolumnGroupShow: 'open',\n\t\t\t\t\tfilter: 'agNumberColumnFilter',\n\t\t\t\t\tfilterParams: filterParamsNumber,\n\t\t\t\t\theaderTooltip: 'CPU single-core max turbo frequency / max boost frequency',\n\t\t\t\t\twidth: 120,\n\t\t\t\t\tcellClass: 'frequency',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theaderName: 'Shared',\n\t\t\t\t\tfield: 'sharedCpu',\n\t\t\t\t\tcolumnGroupShow: 'open',\n\t\t\t\t\tfilterParams: filterParamsBoolean,\n\t\t\t\t\tvalueFormatter: booleanFormatter,\n\t\t\t\t\theaderTooltip: 'Fractional vCPU (1, 0) [Each vCPU can burst up to 100% of CPU time, for short periods, before returning to the time limitations]',\n\t\t\t\t\twidth: 90\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theaderName: 'Intel',\n\t\t\t\t\tfield: 'intel',\n\t\t\t\t\tcolumnGroupShow: 'open',\n\t\t\t\t\tfilterParams: filterParamsBoolean,\n\t\t\t\t\tvalueFormatter: booleanFormatter,\n\t\t\t\t\theaderTooltip: 'Intel CPU processors (1, 0)',\n\t\t\t\t\twidth: 90\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theaderName: 'AMD',\n\t\t\t\t\tfield: 'amd',\n\t\t\t\t\tcolumnGroupShow: 'open',\n\t\t\t\t\tfilterParams: filterParamsBoolean,\n\t\t\t\t\tvalueFormatter: booleanFormatter,\n\t\t\t\t\theaderTooltip: 'AMD CPU processors (1, 0)',\n\t\t\t\t\twidth: 90\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theaderName: 'Arm',\n\t\t\t\t\tfield: 'arm',\n\t\t\t\t\tcolumnGroupShow: 'open',\n\t\t\t\t\tfilterParams: filterParamsBoolean,\n\t\t\t\t\tvalueFormatter: booleanFormatter,\n\t\t\t\t\theaderTooltip: 'Arm-based CPU processors (1, 0)',\n\t\t\t\t\twidth: 90\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theaderName: '#Available',\n\t\t\t\t\tfield: 'availableCpuPlatformCount',\n\t\t\t\t\tcolumnGroupShow: 'open',\n\t\t\t\t\tfilter: 'agNumberColumnFilter',\n\t\t\t\t\tfilterParams: filterParamsNumber,\n\t\t\t\t\theaderTooltip: 'Available CPU platforms for machine type in regions',\n\t\t\t\t\twidth: 90\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theaderName: 'Available CPU Platform',\n\t\t\t\t\tfield: 'availableCpuPlatform',\n\t\t\t\t\tcolumnGroupShow: 'open',\n\t\t\t\t\theaderTooltip: 'Available CPU flatform for machine type in region',\n\t\t\t\t\ttooltipField: 'availableCpuPlatform'\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theaderName: '#Div',\n\t\t\t\t\tfield: 'notAvailableCpuPlatformCount',\n\t\t\t\t\tcolumnGroupShow: 'open',\n\t\t\t\t\tfilter: 'agNumberColumnFilter',\n\t\t\t\t\tfilterParams: filterParamsNumber,\n\t\t\t\t\tcellClass: params => {\n\t\t\t\t\t\tif (params.value >= 1) { return 'warning' }\n\t\t\t\t\t},\n\t\t\t\t\theaderTooltip: 'Not available CPU platforms for machine type in regions',\n\t\t\t\t\twidth: 90\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theaderName: '#Platform',\n\t\t\t\t\tfield: 'cpuPlatformCount',\n\t\t\t\t\tcolumnGroupShow: 'open',\n\t\t\t\t\tfilter: 'agNumberColumnFilter',\n\t\t\t\t\tfilterParams: filterParamsNumber,\n\t\t\t\t\theaderTooltip: 'Available CPU platforms for machine type in regions',\n\t\t\t\t\twidth: 90\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theaderName: 'CPU Platform',\n\t\t\t\t\tfield: 'cpuPlatform',\n\t\t\t\t\tcolumnGroupShow: 'open',\n\t\t\t\t\theaderTooltip: 'Available CPU platform for machine type',\n\t\t\t\t\ttooltipField: 'cpuPlatform'\n\t\t\t\t},\n\t\t\t]\n\t\t},\n\t\t// groupId: 4\n\t\t{\n\t\t\theaderName: 'Benchmark',\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\theaderName: 'CoreMark',\n\t\t\t\t\tfield: \"coremarkScore\",\n\t\t\t\t\tfilter: 'agNumberColumnFilter',\n\t\t\t\t\tfilterParams: filterParamsNumber,\n\t\t\t\t\theaderTooltip: 'EEMBC CoreMark Benchmark (please see www.eembc.org/coremark)',\n\t\t\t\t\twidth: 120\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theaderName: 'StdDev%',\n\t\t\t\t\tfield: \"standardDeviation\",\n\t\t\t\t\tcolumnGroupShow: 'open',\n\t\t\t\t\tfilter: 'agNumberColumnFilter',\n\t\t\t\t\tfilterParams: filterParamsNumber,\n\t\t\t\t\theaderTooltip: 'EEMBC CoreMark Standard Deviation (%)',\n\t\t\t\t\twidth: 120\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theaderName: '#Samples',\n\t\t\t\t\tfield: \"sampleCount\",\n\t\t\t\t\tcolumnGroupShow: 'open',\n\t\t\t\t\tfilter: 'agNumberColumnFilter',\n\t\t\t\t\tfilterParams: filterParamsNumber,\n\t\t\t\t\theaderTooltip: 'EEMBC CoreMark Sample Count',\n\t\t\t\t\twidth: 120\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theaderName: 'SAPS',\n\t\t\t\t\tfield: 'saps',\n\t\t\t\t\tfilter: 'agNumberColumnFilter',\n\t\t\t\t\tfilterParams: filterParamsNumber,\n\t\t\t\t\tcolumnGroupShow: 'open',\n\t\t\t\t\theaderTooltip: 'SAP Standard Benchmark (please see SAP Note 1612283 and 2456432)',\n\t\t\t\t\twidth: 90\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t// groupId: 5\n\t\t{\n\t\t\theaderName: 'Memory',\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\theaderName: 'RAM',\n\t\t\t\t\tfield: \"memoryGB\",\n\t\t\t\t\tcellClass: 'memory',\n\t\t\t\t\tfilter: 'agNumberColumnFilter',\n\t\t\t\t\tfilterParams: filterParamsNumber,\n\t\t\t\t\theaderTooltip: 'Random-access memory (GB)',\n\t\t\t\t\twidth: 120,\n\t\t\t\t},\n\t\t\t]\n\t\t},\n\t\t// groupId: 6\n\t\t{\n\t\t\theaderName: 'Network',\n\t\t\tchildren: [\n\t\t\t\t{ headerName: 'Bandwidth', field: \"bandwidth\", cellClass: 'bandwidth',                          filter: 'agNumberColumnFilter', filterParams: filterParamsNumber, headerTooltip: 'Maximum egress bandwidth (Gbps) cannot exceed the number given', width: 120, },\n\t\t\t\t{ headerName: 'Tier 1',    field: \"tier1\",     cellClass: 'bandwidth', columnGroupShow: 'open', filter: 'agNumberColumnFilter', filterParams: filterParamsNumber, headerTooltip: 'High-bandwidth (Gbps) networking for larger machine types', width: 120 },\n\t\t\t]\n\t\t},\n\t\t// groupId: 7\n\t\t{\n\t\t\theaderName: 'Storage',\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\theaderName: 'Disk Size',\n\t\t\t\t\tfield: \"diskSizeTiB\",\n\t\t\t\t\tcellClass: 'diskSize',\n\t\t\t\t\twidth: 100,\n\t\t\t\t\tfilter: 'agNumberColumnFilter',\n\t\t\t\t\tfilterParams: filterParamsNumber,\n\t\t\t\t\theaderTooltip: 'Max. total persistent disk size (TB) [Disk usage is charged separately from machine type pricing!]'\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theaderName: '#Disks',\n\t\t\t\t\tfield: \"disks\",\n\t\t\t\t\tcolumnGroupShow: 'open',\n\t\t\t\t\twidth: 90,\n\t\t\t\t\tfilter: 'agNumberColumnFilter',\n\t\t\t\t\tfilterParams: filterParamsNumber,\n\t\t\t\t\theaderTooltip: 'Max. number of persistent disks (PDs) [Disk usage is charged separately from machine type pricing!]'\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theaderName: 'Local SSD',\n\t\t\t\t\tfield: \"localSsd\",\n\t\t\t\t\tcolumnGroupShow: 'open',\n\t\t\t\t\tfilterParams: filterParamsBoolean,\n\t\t\t\t\tvalueFormatter: booleanFormatter,\n\t\t\t\t\twidth: 90,\n\t\t\t\t\theaderTooltip: 'VM supports local solid-state drive (SSD) block storage'\n\t\t\t\t},\n\t\t\t]\n\t\t},\n\t\t// groupId: 8\n\t\t{\n\t\t\theaderName: '$ Hour',\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\theaderName: 'Hour',\n\t\t\t\t\tfield: \"hour\",\n\t\t\t\t\twidth: 90,\n\t\t\t\t\tcellClass: 'currency',\n\t\t\t\t\tfilter: 'agNumberColumnFilter',\n\t\t\t\t\tfilterParams: filterParamsNumber,\n\t\t\t\t\t// Default sorting on the hour column\n\t\t\t\t\tsort: 'asc',\n\t\t\t\t\theaderTooltip: 'Costs per hour'\n\t\t\t\t},\n\t\t\t\t{ \n\t\t\t\t\theaderName: 'Spot',\n\t\t\t\t\tfield: 'hourSpot',\n\t\t\t\t\twidth: 90,\n\t\t\t\t\tcellClass: 'currency',\n\t\t\t\t\tfilter: 'agNumberColumnFilter',\n\t\t\t\t\tfilterParams: filterParamsNumber,\n\t\t\t\t\theaderTooltip: 'Costs per hour spot provisioning model (Spot VM)'\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theaderName: 'CoreMark/$h',\n\t\t\t\t\tfield: \"coremarkHour\",\n\t\t\t\t\twidth: 120,\n\t\t\t\t\tfilter: 'agNumberColumnFilter',\n\t\t\t\t\tfilterParams: filterParamsNumber,\n\t\t\t\t\tvalueFormatter: nullFormatter,\n\t\t\t\t\tcolumnGroupShow: 'open',\n\t\t\t\t\theaderTooltip: 'EEMBC CoreMark Benchmark / costs per hour'\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theaderName: 'SAPS/$h',\n\t\t\t\t\tfield: \"sapsHour\",\n\t\t\t\t\twidth: 110,\n\t\t\t\t\tfilter: 'agNumberColumnFilter',\n\t\t\t\t\tfilterParams: filterParamsNumber,\n\t\t\t\t\tvalueFormatter: nullFormatter,\n\t\t\t\t\tcolumnGroupShow: 'open',\n\t\t\t\t\theaderTooltip: 'SAP Standard Benchmark / costs per hour'\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t// groupId: 9\n\t\t{\n\t\t\theaderName: '$ Month',\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\theaderName: 'Month',\n\t\t\t\t\tfield: \"month\",\n\t\t\t\t\twidth: 120,\n\t\t\t\t\tcellClass: 'currency',\n\t\t\t\t\tfilter: 'agNumberColumnFilter',\n\t\t\t\t\tfilterParams: filterParamsNumber,\n\t\t\t\t\theaderTooltip: 'Costs per month'\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theaderName: 'SUD',\n\t\t\t\t\tfield: \"sud\",\n\t\t\t\t\tfilterParams: filterParamsBoolean,\n\t\t\t\t\tvalueFormatter: booleanFormatter,\n\t\t\t\t\twidth: 90,\n\t\t\t\t\tcolumnGroupShow: 'open',\n\t\t\t\t\theaderTooltip: 'Instance with SUD (sustained use discounts are automatic discounts for running specific Compute Engine resources)'\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theaderName: '1Y CUD',\n\t\t\t\t\tfield: \"month1yCud\",\n\t\t\t\t\twidth: 120,\n\t\t\t\t\tcellClass: 'currency',\n\t\t\t\t\tfilter: 'agNumberColumnFilter',\n\t\t\t\t\tfilterParams: filterParamsNumber,\n\t\t\t\t\tcolumnGroupShow: 'open',\n\t\t\t\t\theaderTooltip: 'Costs per month with 1 year commitment (CUD)'\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theaderName: '3Y CUD',\n\t\t\t\t\tfield: \"month3yCud\",\n\t\t\t\t\twidth: 120,\n\t\t\t\t\tcellClass: 'currency',\n\t\t\t\t\tfilter: 'agNumberColumnFilter',\n\t\t\t\t\tfilterParams: filterParamsNumber,\n\t\t\t\t\tcolumnGroupShow: 'open',\n\t\t\t\t\theaderTooltip: 'Costs per month with 3 year commitment (CUD)'\n\t\t\t\t},\n\t\t\t\t{ \n\t\t\t\t\theaderName: 'Spot',\n\t\t\t\t\tfield: 'monthSpot',\n\t\t\t\t\twidth: 120,\n\t\t\t\t\tcellClass: 'currency',\n\t\t\t\t\tfilter: 'agNumberColumnFilter',\n\t\t\t\t\tfilterParams: filterParamsNumber,\n\t\t\t\t\tcolumnGroupShow: 'open',\n\t\t\t\t\theaderTooltip: 'Costs per month spot provisioning model (Spot VM)'\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t// groupId: 10\n\t\t{\n\t\t\theaderName: 'Licenses',\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\theaderName: 'SLES',\n\t\t\t\t\tfield: 'monthSles',\n\t\t\t\t\twidth: 100,\n\t\t\t\t\tcellClass: 'currency',\n\t\t\t\t\tfilter: 'agNumberColumnFilter',\n\t\t\t\t\tfilterParams: filterParamsNumber,\n\t\t\t\t\theaderTooltip: 'SUSE Linux Enterprise Server (cost per month)'\n\t\t\t\t},\n\t\t\t\t{ headerName: 'RHEL',                   field: 'monthRhel',         width: 100, cellClass: 'currency', filter: 'agNumberColumnFilter', filterParams: filterParamsNumber, columnGroupShow: 'open',  headerTooltip: 'Red Hat Enterprise Linux (cost per month)' },\n\t\t\t\t{ headerName: 'RHEL w. 1Y CUD',         field: 'monthRhel1yCud',    width: 120, cellClass: 'currency', filter: 'agNumberColumnFilter', filterParams: filterParamsNumber, columnGroupShow: 'open',  headerTooltip: 'Red Hat Enterprise Linux with 1 year CUD (cost per month)' },\n\t\t\t\t{ headerName: 'RHEL w. 3Y CUD',         field: 'monthRhel3yCud',    width: 120, cellClass: 'currency', filter: 'agNumberColumnFilter', filterParams: filterParamsNumber, columnGroupShow: 'open',  headerTooltip: 'Red Hat Enterprise Linux with 3 year CUD (cost per month)' },\n\t\t\t\t{ headerName: 'Windows',                field: 'monthWindows',      width: 120, cellClass: 'currency', filter: 'agNumberColumnFilter', filterParams: filterParamsNumber, columnGroupShow: 'open',  headerTooltip: 'Microsoft Windows Server (cost per month)' },\n\t\t\t\t{ headerName: 'SLES for SAP',           field: 'monthSlesSap',      width: 120, cellClass: 'currency', filter: 'agNumberColumnFilter', filterParams: filterParamsNumber, columnGroupShow: 'open',  headerTooltip: 'SUSE Linux Enterprise Server for SAP (cost per month)' },\n\t\t\t\t{ headerName: 'SLES for SAP w. 1Y CUD', field: 'monthSlesSap1yCud', width: 120, cellClass: 'currency', filter: 'agNumberColumnFilter', filterParams: filterParamsNumber, columnGroupShow: 'open',  headerTooltip: 'SUSE Linux Enterprise Server for SAP with 1 year CUD (cost per month)' },\n\t\t\t\t{ headerName: 'SLES for SAP w. 3Y CUD', field: 'monthSlesSap3yCud', width: 120, cellClass: 'currency', filter: 'agNumberColumnFilter', filterParams: filterParamsNumber, columnGroupShow: 'open',  headerTooltip: 'SUSE Linux Enterprise Server for SAP with 3 year CUD (cost per month)' },\n\t\t\t\t{ headerName: 'RHEL for SAP',           field: 'monthRhelSap',      width: 120, cellClass: 'currency', filter: 'agNumberColumnFilter', filterParams: filterParamsNumber, columnGroupShow: 'open',  headerTooltip: 'Red Hat Enterprise Linux for SAP (cost per month)' },\n\t\t\t\t{ headerName: 'RHEL for SAP w. 1Y CUD', field: 'monthRhelSap1yCud', width: 120, cellClass: 'currency', filter: 'agNumberColumnFilter', filterParams: filterParamsNumber, columnGroupShow: 'open',  headerTooltip: 'Red Hat Enterprise Linux for SAP with 1 year CUD (cost per month)' },\n\t\t\t\t{ headerName: 'RHEL for SAP w. 3Y CUD', field: 'monthRhelSap3yCud', width: 120, cellClass: 'currency', filter: 'agNumberColumnFilter', filterParams: filterParamsNumber, columnGroupShow: 'open',  headerTooltip: 'Red Hat Enterprise Linux for SAP with 3 year CUD (cost per month)' },\n\t\t\t]\n\t\t},\n\t\t// groupId: 11\n\t\t// groupId is used in setColumnGroupState for inital filter\n\t\t{\n\t\t\theaderName: 'More... (SAP, GPU)',\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\theaderName: 'Family',\n\t\t\t\t\tfield: \"family\",\n\t\t\t\t\twidth: 180,\n\t\t\t\t\ttooltipField: 'family',\n\t\t\t\t\theaderTooltip: 'A curated set of processor and hardware configurations optimized for specific workloads'\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theaderName: 'Spot',\n\t\t\t\t\tfield: \"spot\",\n\t\t\t\t\tfilterParams: filterParamsBoolean,\n\t\t\t\t\tvalueFormatter: booleanFormatter,\n\t\t\t\t\twidth: 90,\n\t\t\t\t\tcolumnGroupShow: 'open',\n\t\t\t\t\theaderTooltip: 'Instance supports spot provisioning mode (Spot VM)'\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theaderName: 'SAP',\n\t\t\t\t\tfield: \"sap\",\n\t\t\t\t\tfilterParams: filterParamsBoolean,\n\t\t\t\t\tvalueFormatter: booleanFormatter,\n\t\t\t\t\twidth: 80,\n\t\t\t\t\tcolumnGroupShow: 'open',\n\t\t\t\t\theaderTooltip: 'Certified for SAP applications on Google Cloud'\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theaderName: 'HANA',\n\t\t\t\t\tfield: \"hana\",\n\t\t\t\t\tfilterParams: filterParamsBoolean,\n\t\t\t\t\tvalueFormatter: booleanFormatter,\n\t\t\t\t\twidth: 90,\n\t\t\t\t\tcolumnGroupShow: 'open',\n\t\t\t\t\theaderTooltip: 'Certified for SAP HANA on Google Cloud'\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theaderName: 'Series',\n\t\t\t\t\tfield: \"series\",\n\t\t\t\t\twidth: 110,\n\t\t\t\t\tcolumnGroupShow: 'open',\n\t\t\t\t\theaderTooltip: 'Machine families are further classified by series and generation'\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theaderName: 'GPUs',\n\t\t\t\t\tfield: \"acceleratorCount\",\n\t\t\t\t\tcolumnGroupShow: 'open',\n\t\t\t\t\tfilter: 'agNumberColumnFilter',\n\t\t\t\t\tfilterParams: filterParamsNumber,\n\t\t\t\t\twidth: 100\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theaderName: 'GPU Type',\n\t\t\t\t\tfield: \"acceleratorType\",\n\t\t\t\t\tcolumnGroupShow: 'open'\n\t\t\t\t}\n\t\t\t]\n\t\t}\n\t],\n\t// Defaults\n\tdefaultColDef: {\n\t\tresizable: true,\n\t\tsortable: true,\n\t\tminWidth: 90,\n\t\tmaxWidth: 400,\n\t\t//width: 110,\n\t\tfilter: 'agTextColumnFilter',\n\t\tfilterParams: filterParamsText,\n\t\tfloatingFilter: true,\n\t\t//editable: true,\n\t},\n\tgroupHideOpenParents: true,\n\ttooltipShowDelay: 0,\n\tdebounceVerticalScrollbar: true,\n\tensureDomOrder: true,\n\tsuppressColumnVirtualisation: true,\n\trowBuffer: 60,\n\trowSelection: 'multiple',\n\trowMultiSelectWithClick: true,\n\t//rowDragManaged: true,\n\t//rowDragMultiRow: true,\n\tpagination: true,\n\tpaginationPageSize: 50,\n\t//domLayout: 'autoHeight',\n};\n\n// lookup the container we want the Grid to use\nconst eGridDiv = document.querySelector('#myGrid');\n\n// create the grid passing in the div to use together with the columns & data we want to use\nconst gridApi = agGrid.createGrid(eGridDiv, gridOptions);\n\n// fetch the row data to use and one ready provide it to the Grid via the Grid API\nfetch('instance_in_region.json?[% timestamp %]')\n\t.then(response => response.json())\n\t.then(data => {\n\t\tgridApi.setGridOption('rowData', data)\n\t}\n);\n\n/*\n * URL FILTER\n */\n\n// URL params for initial filter\nconst queryString = window.location.search;\nconst urlParams   = new URLSearchParams(queryString);\nconst urlRegion   = urlParams.get('region')   || '';\nconst urlName     = urlParams.get('name')     || '';\nconst urlGPU      = urlParams.get('gpu')      || '';\nconst urlSAP      = urlParams.get('sap')      || '';\nconst urlHANA     = urlParams.get('hana')     || '';\nconst urlPlatform = urlParams.get('platform') || '';\nconst urlARM      = urlParams.get('arm')      || '';\n\n// fist time data is rendered into the grid\ngridApi.setGridOption('onFirstDataRendered', function () {\n\tconsole.log('firstDataRendered');\n\t// Initial filter with URL params\n\tlet filterName     = urlName.replace(/[^\\w\\d\\-]/g,\"\");\n\tlet filterRegion   = urlRegion.replace(/[^\\w\\d\\-]/g,\"\");\n\tlet filterPlatform = urlPlatform.replace(/[^\\w\\d]/g,\"\");\n\tlet filterGPU      = (urlGPU >= 1)  ? '1' : '';\n\tlet filterSAP      = (urlSAP >= 1)  ? '1' : '';\n\tlet filterHANA     = (urlHANA >= 1) ? '1' : '';\n\tlet filterARM      = (urlARM >= 1)  ? '1' : '';\n\t// Set filter\n\tvar hardcodedFilter = {\n\t\tname: {\n\t\t\ttype: 'equals',\n\t\t\tfilter: filterName,\n\t\t},\n\t\tregion: {\n\t\t\ttype: 'equals',\n\t\t\tfilter: filterRegion,\n\t\t},\n\t\tavailableCpuPlatform: {\n\t\t\ttype: 'contains',\n\t\t\tfilter: filterPlatform,\n\t\t},\n\t\tacceleratorCount: {\n\t\t\ttype: 'greaterThanOrEqual',\n\t\t\tfilter: filterGPU,\n\t\t},\n\t\tsap: {\n\t\t\ttype: 'equals',\n\t\t\tfilter: filterSAP,\n\t\t},\n\t\thana: {\n\t\t\ttype: 'equals',\n\t\t\tfilter: filterHANA,\n\t\t},\n\t\tarm: {\n\t\t\ttype: 'equals',\n\t\t\tfilter: filterARM,\n\t\t},\n\t};\n\t// Open groups\n\tvar hardcodedGroupState = [];\n\tif (filterPlatform || filterARM ) {\n\t\thardcodedGroupState.push({ groupId: '3', open: true });\n\t}\n\tif (filterGPU || filterSAP || filterHANA) {\n\t\thardcodedGroupState.push({ groupId: '11', open: true });\n\t}\n\t// wait 500ms, because maybe the DOM isn't completely ready yet\n\tsetTimeout(function(){\n\t\tgridApi.setColumnGroupState(hardcodedGroupState);\n\t\tgridApi.setFilterModel(hardcodedFilter);\n\t}, 500);\n});\n\n/*\n * KEYBOARD\n */\n\ndocument.addEventListener('keydown', function(event) {\n\t// Copy selected rows with shown column\n\tif ((event.ctrlKey || event.metaKey) && event.key === 'c') {\n\t\tnavigator.clipboard.writeText(gridApi.getDataAsCsv({\n\t\t\tskipColumnGroupHeaders: true,\n\t\t\tskipColumnHeaders: true,\n\t\t\tallColumns: false,\n\t\t\tonlySelected: true,\n\t\t}));\n\t}\n\t// Copy selected rows with all column\n\tif ((event.ctrlKey || event.metaKey) && event.key === 'x') {\n\t\tnavigator.clipboard.writeText(gridApi.getDataAsCsv({\n\t\t\tskipColumnGroupHeaders: true,\n\t\t\tskipColumnHeaders: true,\n\t\t\tallColumns: true,\n\t\t\tonlySelected: true,\n\t\t}));\n\t}\n\tif ((event.ctrlKey || event.metaKey) && event.key === '/') {\n\t\tdocument.querySelector('[aria-label=\"vCPUs Filter Input\"]').focus();\n\t}\n});"
  },
  {
    "path": "build/src/map.tt2",
    "content": "<!doctype html>\n<html lang=\"en\">\n<head>\n<title>Google Cloud Platform Region Map</title>\n<link rel=\"canonical\" href=\"[% site.url %]/map.html\">\n[% PROCESS favicon.tt2 %]\n<link rel=\"stylesheet\" href=\"[% site.leaflet.css %]\">\n<style>\nhtml { width: 100%; height: 100%; }\nbody { width: 100%; height: 100%; margin: 0; padding: 0; }\n</style>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<meta name=\"robots\" content=\"noindex, nofollow\">\n<script src=\"[% site.leaflet.js %]\"></script>\n<body>\n<div id=\"map\" style=\"width: 100%; height: 100%\"></div>\n<script>\nvar map = L.map('map').setView([32, -10], 3);\nvar tiles = L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {\n\tattribution: '<a href=\"/regions.html\">☁️ gcloud-compute.com</a> | &copy; <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a>'\n\t}).addTo(map);\n\n[% FOREACH region IN regions; IF region.regionLat && region.regionLng %]\nL.marker(\n\t[\n\t\t[% region.regionLat %],\n\t\t[% region.regionLng %]\n\t],\n\t{\n\t\talt: '[% region.name %]'\n\t}\n).addTo(map).bindPopup(\n\t'<p><strong><a href=\"/[% region.name %].html\">[% region.name %]</a></strong></p>' +\n\t'<p>' + \n\t'[% countryFlag(region.regionLocationCountryCode) %] ' +\n\t\"[% IF region.regionLocationLong %][% region.regionLocationLong FILTER html %][% ELSIF region.regionLocation %][% region.regionLocation FILTER html %][% END %]\" +\n\t'</p>'\n);\n[% END; END %]\n</script>\n</body>\n</html>"
  },
  {
    "path": "build/src/meta.tt2",
    "content": "<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n\n[%-\n\t# title = Recommended title length is between 50 and 60 characters.\n\t# description = Recommendation today is to keep your page description between 110 and 160 characters.\n\t# og:title = 40 characters for mobile and 60 for desktop is roughly the sweet spot.\n\t# og:description = Facebook recommends 2–4 sentences, but that often truncates.\n-%]\n\n[%- IF template.name == 'index.tt2' -%]\n<title>Google Cloud Compute Engine Machine Type Comparison</title>\n<meta name=\"description\"         content=\"Choose the right Google Compute Engine machine type available in Google Cloud Platform. Compare different families like N1 with N2.\">\n<link rel=\"canonical\"            href=\"[% site.url %]/\">\n<meta name=\"twitter:title\"       content=\"Google Cloud Machine Type Comparison\">\n<meta name=\"twitter:description\" content=\"Choose the right Google Compute Engine machine type available in Google Cloud Platform. Compare different families like N1 with N2.\">\n<meta property=\"og:title\"        content=\"Google Cloud Machine Type Comparison\">\n<meta property=\"og:description\"  content=\"Choose the right Google Compute Engine machine type available in Google Cloud Platform. Compare different families like N1 with N2.\">\n<meta property=\"og:url\"          content=\"[% site.url %]/\">\n\n[%- ELSIF template.name == 'instances.tt2' -%]\n<title>GCE Machine Types in Google Cloud Platform</title>\n<meta name=\"description\"         content=\"Overview of all Google Compute Engine machine types that can be used in Google Cloud Platform. Sorted by CPU count.\">\n<link rel=\"canonical\"            href=\"[% site.url %]/instances.html\">\n<meta name=\"twitter:title\"       content=\"Google Compute Engine Machine Types\">\n<meta name=\"twitter:description\" content=\"Overview of all Google Compute Engine machine types that can be used in Google Cloud Platform. Sorted by CPU count.\">\n<meta property=\"og:title\"        content=\"Google Compute Engine Machine Types\">\n<meta property=\"og:description\"  content=\"Overview of all Google Compute Engine machine types that can be used in Google Cloud Platform. Sorted by CPU count.\">\n<meta property=\"og:url\"          content=\"[% site.url %]/instances.html\">\n\n[%- ELSIF template.name == 'intel.tt2' -%]\n<title>Machine Types with Intel CPU in Google Cloud Platform</title>\n<meta name=\"description\"         content=\"List of all Google Compute Engine machine types with Intel processor (CPU) in Google Cloud Platform. Sorted by CPU count.\">\n<link rel=\"canonical\"            href=\"[% site.url %]/intel.html\">\n<meta name=\"twitter:title\"       content=\"GCE Machine Types with Intel CPU\">\n<meta name=\"twitter:description\" content=\"List of all Google Compute Engine machine types with Intel processor (CPU) in Google Cloud Platform. Sorted by CPU count.\">\n<meta property=\"og:title\"        content=\"GCE Machine Types with Intel CPU\">\n<meta property=\"og:description\"  content=\"List of all Google Compute Engine machine types with Intel processor (CPU) in Google Cloud Platform. Sorted by CPU count.\">\n<meta property=\"og:url\"          content=\"[% site.url %]/intel.html\">\n\n[%- ELSIF template.name == 'amd.tt2' -%]\n<title>Machine Types with AMD CPU in Google Cloud Platform</title>\n<meta name=\"description\"         content=\"List of all Google Compute Engine machine types with AMD processor (CPU) in Google Cloud Platform. Sorted by CPU count.\">\n<link rel=\"canonical\"            href=\"[% site.url %]/amd.html\">\n<meta name=\"twitter:title\"       content=\"GCE Machine Types with AMD CPU\">\n<meta name=\"twitter:description\" content=\"List of all Google Compute Engine machine types with AMD processor (CPU) in Google Cloud Platform. Sorted by CPU count.\">\n<meta property=\"og:title\"        content=\"GCE Machine Types with AMD CPU\">\n<meta property=\"og:description\"  content=\"List of all Google Compute Engine machine types with AMD processor (CPU) in Google Cloud Platform. Sorted by CPU count.\">\n<meta property=\"og:url\"          content=\"[% site.url %]/amd.html\">\n\n[%- ELSIF template.name == 'arm.tt2' -%]\n<title>Machine Types with Arm-based CPU in Google Cloud Platform</title>\n<meta name=\"description\"         content=\"List of all Google Compute Engine machine types with Arm-based processor (CPU) in Google Cloud Platform. Sorted by CPU count.\">\n<link rel=\"canonical\"            href=\"[% site.url %]/arm.html\">\n<meta name=\"twitter:title\"       content=\"GCE Machine Types with Arm-based CPU\">\n<meta name=\"twitter:description\" content=\"List of all Google Compute Engine machine types with Arm-based processor (CPU) in Google Cloud Platform. Sorted by CPU count.\">\n<meta property=\"og:title\"        content=\"GCE Machine Types with Arm-based CPU\">\n<meta property=\"og:description\"  content=\"List of all Google Compute Engine machine types with Arm-based processor (CPU) in Google Cloud Platform. Sorted by CPU count.\">\n<meta property=\"og:url\"          content=\"[% site.url %]/arm.html\">\n\n[%- ELSIF template.name == 'gpu.tt2' -%]\n<title>Machine Types with GPU in Google Cloud Platform</title>\n<meta name=\"description\"         content=\"List of all Google Compute Engine machine types with graphics processing units in Google Cloud Platform. Sorted by GPU count.\">\n<link rel=\"canonical\"            href=\"[% site.url %]/gpu.html\">\n<meta name=\"twitter:title\"       content=\"GCE Machine Types with GPU\">\n<meta name=\"twitter:description\" content=\"List of all Google Compute Engine machine types with graphics processing units in Google Cloud Platform. Sorted by GPU count.\">\n<meta property=\"og:title\"        content=\"GCE Machine Types with GPU\">\n<meta property=\"og:description\"  content=\"List of all Google Compute Engine machine types with graphics processing units in Google Cloud Platform. Sorted by GPU count.\">\n<meta property=\"og:url\"          content=\"[% site.url %]/gpu.html\">\n\n[%- ELSIF template.name == 'sap.tt2' -%]\n<title>Certified machine types for SAP on Google Cloud Platform</title>\n<meta name=\"description\"         content=\"List of all Google Compute Engine machine types certified for SAP application on Google Cloud Platform. Sorted by CPU count.\">\n<link rel=\"canonical\"            href=\"[% site.url %]/sap.html\">\n<meta name=\"twitter:title\"       content=\"GCE Machine Types Certified for SAP\">\n<meta name=\"twitter:description\" content=\"List of all Google Compute Engine machine types certified for SAP application on Google Cloud Platform. Sorted by CPU count.\">\n<meta property=\"og:title\"        content=\"GCE Machine Types Certified for SAP\">\n<meta property=\"og:description\"  content=\"List of all Google Compute Engine machine types certified for SAP application in Google Cloud Platform. Sorted by CPU count.\">\n<meta property=\"og:url\"          content=\"[% site.url %]/sap.html\">\n\n[%- ELSIF template.name == 'hana.tt2' -%]\n<title>Certified machine types for HANA on Google Cloud Platform</title>\n<meta name=\"description\"         content=\"List of all Google Compute Engine machine types certified for SAP HANA on Google Cloud Platform. Sorted by CPU count.\">\n<link rel=\"canonical\"            href=\"[% site.url %]/hana.html\">\n<meta name=\"twitter:title\"       content=\"GCE Machine Types Certified for HANA\">\n<meta name=\"twitter:description\" content=\"List of all Google Compute Engine machine types certified for SAP HANA on Google Cloud Platform. Sorted by CPU count.\">\n<meta property=\"og:title\"        content=\"GCE Machine Types Certified for HANA\">\n<meta property=\"og:description\"  content=\"List of all Google Compute Engine machine types certified for SAP HANA on Google Cloud Platform. Sorted by CPU count.\">\n<meta property=\"og:url\"          content=\"[% site.url %]/hana.html\">\n\n[%- ELSIF template.name == 'disks.tt2' -%]\n<title>GCE Disk Types in Google Cloud Platform</title>\n<meta name=\"description\"         content=\"Overview of all Google Compute Engine disk types that can be used in Google Cloud Platform. Sorted by price.\">\n<link rel=\"canonical\"            href=\"[% site.url %]/disks.html\">\n<meta name=\"twitter:title\"       content=\"Google Compute Engine Disk Types\">\n<meta name=\"twitter:description\" content=\"Overview of all Google Compute Engine disk types that can be used in Google Cloud Platform. Sorted by price.\">\n<meta property=\"og:title\"        content=\"Google Compute Engine Disk Types\">\n<meta property=\"og:description\"  content=\"Overview of all Google Compute Engine disk types that can be used in Google Cloud Platform. Sorted by price.\">\n<meta property=\"og:url\"          content=\"[% site.url %]/disks.html\">\n\n[%- ELSIF template.name == 'disk.tt2' -%]\n<title>[% disk.name %] - Google Cloud Compute Disk Type</title>\n<meta name=\"description\"         content=\"Google Compute Engine persistent disk type [% disk.name %]. Available in [% regions.size %] Google Cloud Platform region[% IF regions.size > 1 %]s[% END %].\">\n<meta name=\"twitter:title\"       content=\"Google Disk Type [% disk.name %]\">\n<meta name=\"twitter:description\" content=\"Google Compute Engine persistent disk type [% disk.name %]. Available in [% regions.size %] Google Cloud Platform region[% IF regions.size > 1 %]s[% END %].\">\n<meta property=\"og:title\"        content=\"Google Disk Type [% disk.name %]\">\n<meta property=\"og:description\"  content=\"Google Compute Engine persistent disk type [% disk.name %]. Available in [% regions.size %] Google Cloud Platform region[% IF regions.size > 1 %]s[% END %].\">\n<meta property=\"og:url\"          content=\"[% site.url %]/[% disk.name %].html\">\n\n[%- ELSIF template.name == 'regions.tt2' -%]\n<title>Google Cloud Platform Regions with GCE Machines</title>\n<meta name=\"description\"         content=\"List of all Google Cloud regions available in all Google Cloud Platform locations. Overview of available Google Compute Engine machine types.\">\n<link rel=\"canonical\"            href=\"[% site.url %]/regions.html\">\n<meta name=\"twitter:title\"       content=\"Google Cloud Platform Regions\">\n<meta name=\"twitter:description\" content=\"List of all Google Cloud regions available in all Google Cloud Platform locations. Overview of available Google Compute Engine machine types.\">\n<meta property=\"og:title\"        content=\"Google Cloud Platform Regions\">\n<meta property=\"og:description\"  content=\"List of all Google Cloud regions available in all Google Cloud Platform locations. Overview of available Google Compute Engine machine types.\">\n<meta property=\"og:url\"          content=\"[% site.url %]/regions.html\">\n\n[%- ELSIF template.name == 'platforms.tt2' -%]\n<title>Compute Engine CPU Platforms in Google Cloud Regions</title>\n<meta name=\"description\"         content=\"Available CPU platforms in Google Cloud regions. Overview of the CPU generations from Intel and AMD.\">\n<link rel=\"canonical\"            href=\"[% site.url %]/platforms.html\">\n<meta name=\"twitter:title\"       content=\"CPU Platforms in Google Cloud Regions\">\n<meta name=\"twitter:description\" content=\"Available CPU platforms in Google Cloud regions. Overview of the CPU generations from Intel and AMD.\">\n<meta property=\"og:title\"        content=\"CPU Platforms in Google Cloud Regions\">\n<meta property=\"og:description\"  content=\"Available CPU platforms in Google Cloud regions. Overview of the CPU generations from Intel and AMD.\">\n<meta property=\"og:url\"          content=\"[% site.url %]/platforms.html\">\n\n[%- ELSIF template.name == 'diskpricing.tt2' -%]\n<title>Persistent Disk Pricing in Google Cloud Regions</title>\n<meta name=\"description\"         content=\"Overview of available persistent disks in Google Cloud regions. Breakdown by price per GB and minimum capacity per disk.\">\n<link rel=\"canonical\"            href=\"[% site.url %]/diskpricing.html\">\n<meta name=\"twitter:title\"       content=\"Google Cloud Persistent Disk Pricing\">\n<meta name=\"twitter:description\" content=\"Overview of available persistent disks in Google Cloud regions. Breakdown by price per GB and minimum capacity per disk.\">\n<meta property=\"og:title\"        content=\"Google Cloud Persistent Disk Pricing\">\n<meta property=\"og:description\"  content=\"Overview of available persistent disks in Google Cloud regions. Breakdown by price per GB and minimum capacity per disk.\">\n<meta property=\"og:url\"          content=\"[% site.url %]/diskpricing.html\">\n\n[%- ELSIF template.name == 'instance.tt2' -%]\n<title>[% instance.name %] - Google Cloud Compute Machine</title>\n<meta name=\"description\"         content=\"Google Compute Engine machine type [% instance.name %] with [% instance.vCpus %] vCPU and [% instance.memoryGB %] GB memory. Available in [% regions.size %] Google Cloud Platform region[% IF regions.size > 1 %]s[% END %].\">\n<link rel=\"canonical\"            href=\"[% site.url %]/[% instance.name %].html\">\n<meta name=\"twitter:title\"       content=\"Google Machine Type [% instance.name %]\">\n<meta name=\"twitter:description\" content=\"Google Compute Engine machine type [% instance.name %] with [% instance.vCpus %] vCPU and [% instance.memoryGB %] GB memory. Available in [% regions.size %] Google Cloud Platform region[% IF regions.size > 1 %]s[% END %].\">\n<meta property=\"og:title\"        content=\"Google Machine Type [% instance.name %]\">\n<meta property=\"og:description\"  content=\"Google Compute Engine machine type [% instance.name %] with [% instance.vCpus %] vCPU and [% instance.memoryGB %] GB memory. Available in [% regions.size %] Google Cloud Platform region[% IF regions.size > 1 %]s[% END %].\">\n<meta property=\"og:url\"          content=\"[% site.url %]/[% instance.name %].html\">\n\n[%- ELSIF template.name == 'comparison.tt2' -%]\n<title>[% instance_a.name %] / [% instance_b.name %] - Google Cloud</title>\n<meta name=\"description\"         content=\"Google Compute Engine machine type comparison [% instance_a.name %] ([% instance_a.vCpus %] vCPU, [% instance_a.memoryGB %] GB memory) versus [% instance_b.name %] ([% instance_b.vCpus %] vCPU, [% instance_b.memoryGB %] GB memory).\">\n<link rel=\"canonical\"            href=\"[% site.url %]/comparison/[% instance_a.name %]/vs/[% instance_b.name %].html\">\n<meta name=\"twitter:title\"       content=\"Comparison [% instance_a.name %] vs. [% instance_b.name %]\">\n<meta name=\"twitter:description\" content=\"Google Compute Engine machine type comparison [% instance_a.name %] ([% instance_a.vCpus %] vCPU, [% instance_a.memoryGB %] GB memory) versus [% instance_b.name %] ([% instance_b.vCpus %] vCPU, [% instance_b.memoryGB %] GB memory).\">\n<meta property=\"og:title\"        content=\"Comparison [% instance_a.name %] vs. [% instance_b.name %]\">\n<meta property=\"og:description\"  content=\"Google Compute Engine machine type [% instance.name %] with [% instance.vCpus %] vCPU and [% instance.memoryGB %] GB memory. Available in [% regions.size %] Google Cloud Platform region[% IF regions.size > 1 %]s[% END %].\">\n<meta property=\"og:url\"          content=\"[% site.url %]/comparison/[% instance_a.name %]/vs/[% instance_b.name %].html\">\n\n[%- ELSIF template.name == 'vs.tt2'-%]\n<title>[% instance_a.name %] - GCE Machine Type Comparison</title>\n<meta name=\"description\"         content=\"Compare Google Compute Engine machine type [% instance_a.name %] ([% instance_a.vCpus %] vCPU, [% instance_a.memoryGB %] GB memory) with other Google Cloud Platform GCE machine types.\">\n<link rel=\"canonical\"            href=\"[% site.url %]/comparison/[% instance_a.name %]/vs.html\">\n<meta name=\"twitter:title\"       content=\"Compare Machine Type [% instance_a.name %]\">\n<meta name=\"twitter:description\" content=\"Compare Google Compute Engine machine type [% instance_a.name %] ([% instance_a.vCpus %] vCPU, [% instance_a.memoryGB %] GB memory) with other Google Cloud Platform GCE machine types.\">\n<meta property=\"og:title\"        content=\"Compare Machine Type [% instance_a.name %]\">\n<meta property=\"og:description\"  content=\"Compare Google Compute Engine machine type [% instance_a.name %] ([% instance_a.vCpus %] vCPU, [% instance_a.memoryGB %] GB memory) with other Google Cloud Platform GCE machine types.\">\n<meta property=\"og:url\"          content=\"[% site.url %]/comparison/[% instance_a.name %]/vs.html\">\n\n[%- ELSIF template.name == 'region.tt2'-%]\n<title>[% region.name %] - Google Cloud Platform Region</title>\n<meta name=\"description\"         content=\"List off all Google Compute Engine machine and disk types in Google Cloud Platform region [% region.name %].[% IF region.regionLocation %] The location of the region is [% region.regionLocation %][% END %].\">\n<link rel=\"canonical\"            href=\"[% site.url %]/[% region.name %].html\">\n<meta name=\"twitter:title\"       content=\"Google Cloud Region [% region.name %]\">\n<meta name=\"twitter:description\" content=\"List off all Google Compute Engine machine and disk types in Google Cloud Platform region [% region.name %].[% IF region.regionLocation %] The location of the region is [% region.regionLocation %][% END %].\">\n<meta property=\"og:title\"        content=\"Google Cloud Region [% region.name %]\">\n<meta property=\"og:description\"  content=\"List off all Google Compute Engine machine and disk types in Google Cloud Platform region [% region.name %].[% IF region.regionLocation %] The location of the region is [% region.regionLocation %][% END %].\">\n<meta property=\"og:url\"          content=\"[% site.url %]/[% region.name %].html\">\n\n[%- ELSIF template.name == 'instance_in_region.tt2'-%]\n<title>[% instance.name %] in [% instance.region %] - Google Cloud</title>\n<meta name=\"description\"         content=\"Google Compute Engine machine type [% instance.name %] with [% instance.vCpus %] vCPU and [% instance.memoryGB %] GB memory in Google Cloud region [% instance.region %].\">\n<link rel=\"canonical\"            href=\"[% site.url %]/[% instance.region %]/[% instance.name %].html\">\n<meta name=\"twitter:title\"       content=\"Machine Type [% instance.name %] in Region [% instance.region %]\">\n<meta name=\"twitter:description\" content=\"Google Compute Engine machine type [% instance.name %] with [% instance.vCpus %] vCPU and [% instance.memoryGB %] GB memory in Google Cloud region [% instance.region %].\">\n<meta property=\"og:title\"        content=\"Machine Type [% instance.name %] in Region [% instance.region %]\">\n<meta property=\"og:description\"  content=\"Google Compute Engine machine type [% instance.name %] with [% instance.vCpus %] vCPU and [% instance.memoryGB %] GB memory in Google Cloud region [% instance.region %].\">\n<meta property=\"og:url\"          content=\"[% site.url %]/[% instance.region %]/[% instance.name %].html\">\n\n[%- ELSIF template.name == 'images.tt2' -%]\n<title>Operating System Images - Google Cloud Platform</title>\n<meta name=\"description\"         content=\"Overview of available operating system images in Google Cloud Platform. Breakdown per operating system developer.\">\n<link rel=\"canonical\"            href=\"[% site.url %]/images.html\">\n<meta name=\"twitter:title\"       content=\"Google Cloud Operating System Images\">\n<meta name=\"twitter:description\" content=\"Overview of available operating system images in Google Cloud Platform. Breakdown per operating system developer.\">\n<meta property=\"og:title\"        content=\"Google Cloud Operating System Images\">\n<meta property=\"og:description\"  content=\"Overview of available operating system images in Google Cloud Platform. Breakdown per operating system developer.\">\n<meta property=\"og:url\"          content=\"[% site.url %]/images.html\">\n\n[%- ELSIF template.name == 'download.tt2' -%]\n<title>Download Google Compute Engine Machine Types</title>\n<meta name=\"description\"         content=\"Download all Google Compute Engine machine types available in Google Cloud Platform as CSV and SQL export.\">\n<link rel=\"canonical\"            href=\"[% site.url %]/download.html\">\n<meta name=\"twitter:title\"       content=\"Download Google Compute Engine Machine Types\">\n<meta name=\"twitter:description\" content=\"Download all Google Compute Engine machine types available in Google Cloud Platform as CSV and SQL export.\">\n<meta property=\"og:title\"        content=\"Download Google Compute Engine Machine Types\">\n<meta property=\"og:description\"  content=\"Download all Google Compute Engine machine types available in Google Cloud Platform as CSV and SQL export.\">\n<meta property=\"og:url\"          content=\"[% site.url %]/download.html\">\n\n[%- ELSIF template.name == 'gcosts.tt2' -%]\n<title>Google Cloud Pricing and Cost Calculator</title>\n<meta name=\"description\"         content=\"Calculate estimated monthly costs of Google Cloud Platform products and resources on your local computer.\">\n<link rel=\"canonical\"            href=\"[% site.url %]/gcosts.html\">\n<meta name=\"twitter:title\"       content=\"Google Cloud Pricing and Cost Calculator\">\n<meta name=\"twitter:description\" content=\"Calculate estimated monthly costs of Google Cloud Platform products and resources on your local computer.\">\n<meta property=\"og:title\"        content=\"Google Cloud Pricing and Cost Calculator\">\n<meta property=\"og:description\"  content=\"Calculate estimated monthly costs of Google Cloud Platform products and resources on your local computer.\">\n<meta property=\"og:url\"          content=\"[% site.url %]/gcosts.html\">\n\n[%- ELSIF template.name == 'imprint.tt2'-%]\n<title>Imprint - gcloud-compute.com</title>\n<link rel=\"canonical\" href=\"[% site.url %]/imprint.html\">\n\n[%- ELSIF template.name == '404.tt2'-%]\n<title>404 - Page Not Found</title>\n<meta name=\"robots\" content=\"noindex, nofollow\">\n\n[%- ELSE -%]\n<title>Google Cloud Platform GCE Machine Type Comparison</title>\n[%- END -%]\n<meta name=\"twitter:card\"        content=\"summary_large_image\">\n<meta name=\"twitter:image:src\"   content=\"[% site.url %]/img/social.png\">\n<meta property=\"og:type\"         content=\"website\">\n<meta property=\"og:image\"        content=\"[% site.url %]/img/social.png\">\n<meta property=\"og:image:alt\"    content=\"Google Cloud pricing\">\n<meta property=\"og:image:width\"  content=\"1280\">\n<meta property=\"og:image:height\" content=\"640\">"
  },
  {
    "path": "build/src/platforms.tt2",
    "content": "[%- PROCESS header.tt2 -%]\n[%- PROCESS regions_header.tt2 -%]\n\n<h1>Available CPU Platforms in Google Cloud Regions</h1>\n\n<blockquote class=\"blockquote\">\n<p>\nYou have the choice between Google Compute Engine machine types with\n<a href=\"/intel.html\">Intel</a>,\n<a href=\"/amd.html\">AMD</a>, or\n<a href=\"/arm.html\">Arm-based</a>\ncentral processing units (CPUs).\nThe different CPU platforms differ from the year of release and performance.\nNot every CPU is available in all Google Cloud region and zones.\n</p>\n</blockquote>\n\n<p>\n\t<a class=\"btn btn-success\" href=\"/map.html\" role=\"button\">🗺️ Region Map</a>\n\t<a class=\"btn btn-secondary\" href=\"https://gcping.com/\" role=\"button\" rel=\"nofollow\" title=\"Measure your latency to Google Cloud regions\">⏱️ Ping</a>\n</p>\n\n<div class=\"table-responsive\">\n<table\n\tclass=\"table table-sm table-hover table-bordered\"\n\tdata-classes=\"table table-sm table-hover table-bordered\"\n\tdata-toggle=\"table\"\n\tdata-sort-name=\"name\"\n\tdata-sort-order=\"asc\"\n\tdata-sortable=\"true\"\n\tdata-sticky-header=\"true\"\n>\n<thead>\n\t<tr>\n\t\t<th scope=\"col\" colspan=\"3\">Region</th>\n\t\t<th scope=\"col\">Zones</th>\n\t\t<th scope=\"col\" colspan=\"6\">Intel</th>\n\t\t<th scope=\"col\" colspan=\"4\">AMD</th>\n\t\t<th scope=\"col\" colspan=\"2\">Arm (Ampere, Google)</th>\n\t</tr>\n\t<tr>\n\t\t<th scope=\"col\" data-field=\"name\" data-sortable=\"true\">Name</th>\n\t\t<th scope=\"col\" data-sortable=\"true\">Location</th>\n\t\t<th scope=\"col\" data-sortable=\"true\" title=\"ISO 3166-1 alpha-2 country code\">Country</th>\n\t\t<th scope=\"col\" data-sortable=\"true\">#</th>\n\t\t<th scope=\"col\" data-sortable=\"true\" title=\"Intel Xeon Scalable Processor (Granite Rapids) 6rd Generation\">Granite</th>\n\t\t<th scope=\"col\" data-sortable=\"true\" title=\"Intel Xeon Scalable Processor (Emerald Rapids) 5rd Generation\">Emerald</th>\n\t\t<th scope=\"col\" data-sortable=\"true\" title=\"Intel Xeon Scalable Processor (Sapphire Rapids) 4rd Generation\">Sapphire</th>\n\t\t<th scope=\"col\" data-sortable=\"true\" title=\"Intel Xeon Scalable Processor (Ice Lake) 3rd Generation\">Ice</th>\n\t\t<th scope=\"col\" data-sortable=\"true\" title=\"Intel Xeon Scalable Processor (Cascade Lake) 2nd Generation\">Cascade</th>\n\t\t<th scope=\"col\" data-sortable=\"true\" title=\"Intel Xeon Scalable Processor (Skylake) 1nd Generation\">Skylake</th>\n\t\t<th scope=\"col\" data-sortable=\"true\" title=\"AMD EPYC Turin 5rd Generation\">Turin</th>\n\t\t<th scope=\"col\" data-sortable=\"true\" title=\"AMD EPYC Genoa 4rd Generation\">Genoa</th>\n\t\t<th scope=\"col\" data-sortable=\"true\" title=\"AMD EPYC Milan 3rd Generation\">Milan</th>\n\t\t<th scope=\"col\" data-sortable=\"true\" title=\"AMD EPYC Rome 2nd Generation\">Rome</th>\n\t\t<th scope=\"col\" data-sortable=\"true\" title=\"Ampere Altra\">Altra</th>\n\t\t<th scope=\"col\" data-sortable=\"true\" title=\"Google Axion\">Axion</th>\n\t</tr>\n</thead>\n<tbody>\n\t[% FOREACH region IN regions %]\n\t<tr>\n\t\t<td><a href=\"/[% region.name %].html\" title=\"Google Cloud region [% region.name %][% IF region.regionLocationLong %] ([% region.regionLocationLong %])[% ELSIF region.regionLocation %] ([% region.regionLocation %])[% END %]\">[% region.name %]</a></td>\n\t\t<td>\n\t\t\t[% IF region.regionLocation %][% region.regionLocation %][% ELSE %]<span class=\"text-muted\">?</span>[% END %]\n\t\t\t[% badgeLowCo2Region(region) %]\n\t\t</td>\n\t\t<td>\n\t\t\t[% IF region.regionLocationCountryCode %]\n\t\t\t\t[% countryFlag(region.regionLocationCountryCode) %]\n\t\t\t\t[% countryName(region.regionLocationCountryCode) %]\n\t\t\t[% ELSE %]\n\t\t\t<span class=\"text-muted\">?</span>\n\t\t\t[% END %]\n\t\t</td>\n\t\t<td>[% region.zoneCount %]</td>\n\t\t[% IF region.intelGraniteRapids  %]<td>[% region.intelGraniteRapids  %]</td>[% ELSE %]<td class=\"text-muted\">0</td>[% END %]\n\t\t[% IF region.intelEmeraldRapids  %]<td>[% region.intelEmeraldRapids  %]</td>[% ELSE %]<td class=\"text-muted\">0</td>[% END %]\n\t\t[% IF region.intelSapphireRapids %]<td>[% region.intelSapphireRapids %]</td>[% ELSE %]<td class=\"text-muted\">0</td>[% END %]\n\t\t[% IF region.intelIceLake        %]<td>[% region.intelIceLake        %]</td>[% ELSE %]<td class=\"text-muted\">0</td>[% END %]\n\t\t[% IF region.intelCascadeLake    %]<td>[% region.intelCascadeLake    %]</td>[% ELSE %]<td class=\"text-muted\">0</td>[% END %]\n\t\t[% IF region.intelSkylake        %]<td>[% region.intelSkylake        %]</td>[% ELSE %]<td class=\"text-muted\">0</td>[% END %]\n\t\t[% IF region.amdTurin            %]<td>[% region.amdTurin            %]</td>[% ELSE %]<td class=\"text-muted\">0</td>[% END %]\n\t\t[% IF region.amdGenoa            %]<td>[% region.amdGenoa            %]</td>[% ELSE %]<td class=\"text-muted\">0</td>[% END %]\n\t\t[% IF region.amdMilan            %]<td>[% region.amdMilan            %]</td>[% ELSE %]<td class=\"text-muted\">0</td>[% END %]\n\t\t[% IF region.amdRome             %]<td>[% region.amdRome             %]</td>[% ELSE %]<td class=\"text-muted\">0</td>[% END %]\n\t\t[% IF region.armAmpereAltra      %]<td>[% region.armAmpereAltra      %]</td>[% ELSE %]<td class=\"text-muted\">0</td>[% END %]\n\t\t[% IF region.armGoogleAxion      %]<td>[% region.armGoogleAxion      %]</td>[% ELSE %]<td class=\"text-muted\">0</td>[% END %]\n\t</tr>\n\t[% END %]\n</tbody>\n</table>\n</div><!-- table-responsive -->\n[% PROCESS footer.tt2 %]"
  },
  {
    "path": "build/src/popin-min.js",
    "content": "var e=document.createElement('div');\ne.id='i59UOEcRSLY1gwtC';\ne.style.display='none';\ndocument.body.appendChild(e);"
  },
  {
    "path": "build/src/region.tt2",
    "content": "[%- PROCESS header.tt2 -%]\n\n<h1>\n\tGoogle Cloud Region [% region.name %]\n\t[% IF region.regionLocation %] <small class=\"text-muted\">[% region.regionLocation %]</small>[% END %]\n\t<small>[% badgeLowCo2Region(region) %]</small>\n</h1>\n\n<blockquote class=\"blockquote\">\n<p>\n\tOut of a total of [% instances.size %] Google Compute Engine machine types,\n\t<mark>[% instances_in_region.size %] machine types</mark> are available in Google Cloud region [% region.name %]\n\t([% countryFlag(region.regionLocationCountryCode) %]\n\t[% IF region.regionLocationLong %][% region.regionLocationLong %][% ELSIF region.regionLocation %][% region.regionLocation %][% END %]).\n</p>\n</blockquote>\n\n<p class=\"d-grid gap-2 d-lg-block\">\n\t<a class=\"btn btn-success\" href=\"/grid.html?region=[% region.name %]\" role=\"button\">✅ Instance Picker with filter on region [% region.name %]</a>\n\t[% IF region.regionLat && region.regionLng %]<a class=\"btn btn-secondary\" href=\"https://www.google.com/maps/search/?api=1&amp;query=[% region.regionLat %]%2C[% region.regionLng %]\" role=\"button\">🗺️ Show region [% region.name %] on Google Maps</a>[% END %]\n</p>\n\n<div class=\"row\">\n\n<div class=\"col-xxl-6\">\n<h2 id=\"disk-types\">Persistent Disk Types</h2>\n<p>Costs and pricing for Google Compute disk types in Google Cloud region [% region.name %][% IF region.regionLocation %] ([% region.regionLocation %])[% END %].</p>\n<div class=\"table-responsive\">\n<table class=\"table table-hover table-striped table-bordered\">\n<thead>\n\t<tr>\n\t\t<th>Name</th>\n\t\t<th>Description</th>\n\t\t<th title=\"Price per GB and month\">1 GB</th>\n\t\t<th title=\"Minimum capacity per disk\">Min. Disk Size</th>\n\t\t<th title=\"Price per minimum disk size and month\">Min. Month</th>\n\t</tr>\n</thead>\n<tbody>\n[%\nFOREACH disk IN disks_in_region;\nminDiskSize = 10;\nIF disk.name == 'pd-extreme'; minDiskSize = 500; END;\nIF disk.name == 'local-ssd';  minDiskSize = 375; END;\n%]\n<tr>\n\t<td>[% disk.name %]</td>\n\t<td>[% disk.description %]</td>\n\t[% IF disk.monthGb %]\n\t<td class=\"currency\" title=\"Costs for 1 GB [% disk.name %] persistent disk per month in region [% region.name %]: [% disk.monthGb %] USD\">[% disk.monthGb %]</td>\n\t<td title=\"Minimum capacity per [% disk.name %] persistent disk: [% minDiskSize %] GB\">[% minDiskSize %] GB</td>\n\t<td class=\"currency\" title=\"Costs for [% minDiskSize %] GB [% disk.name %] persistent disk per month in region [% region.name %]: [% disk.monthGb*minDiskSize FILTER format(\"%.2f\") %] USD\">[% disk.monthGb*minDiskSize FILTER format(\"%.2f\") %]</td>\n\t[% ELSE %]\n\t<td>???</td>\n\t<td>[% minDiskSize %] GB</td>\n\t<td>???</td>\n\t[% END %]\n</tr>\n[% END %]\n</tbody>\n</table>\n</div>\n</div> <!-- // col -->\n\n<div class=\"col-xxl-6\">\n<h2 id=\"region-carbon\">Carbon Data</h2>\n<p>Higher CFE% will emit lower carbon emissions.</p>\n<div class=\"table-responsive\">\n<table class=\"table table-hover table-striped table-bordered\">\n\t<tr>\n\t\t<th>Google CFE%</th>\n\t\t<td>[% IF region.regionCfe %][% region.regionCfe %] %[% ELSE %]?[% END %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>Grid carbon intensity (gCO2eq/kWh)</th>\n\t\t<td>[% IF region.regionCo2Kwh %][% region.regionCo2Kwh %][% ELSE %]?[% END %]</td>\n\t</tr>\n\t<tr>\n\t\t<th>Google Cloud net operational GHG emissions</th>\n\t\t<td>0</td>\n\t</tr>\n</table>\n</div><!-- // table-responsive -->\n</div> <!-- // col -->\n\n</div> <!-- // row -->\n\n<h2 id=\"machine-types\">Machine Types in [% region.name %]</h2>\n<p>Costs and pricing for Google Compute Engine machine types in Google Cloud region [% region.name %][% IF region.regionLocation %] ([% region.regionLocation %])[% END %].</p>\n<div class=\"table-responsive\">\n<table\n\tclass=\"table table-sm table-hover table-bordered\"\n\tdata-classes=\"table table-sm table-hover table-bordered\"\n\tdata-toggle=\"table\"\n\tdata-sort-name=\"vcpu\"\n\tdata-sort-order=\"asc\"\n\tdata-sortable=\"true\"\n\tdata-sticky-header=\"true\"\n>\n<thead>\n\t<tr>\n\t\t<th scope=\"col\" colspan=\"6\">Machine Type</th>\n\t\t<th scope=\"col\">Zones</th>\n\t\t<th scope=\"col\" colspan=\"5\">Costs</th>\n\t\t<th scope=\"col\" colspan=\"3\">OS</th>\n\t</tr>\n\t<tr>\n\t\t<th scope=\"row\" data-sortable=\"true\">Name</th>\n\t\t<th scope=\"col\" data-field=\"vcpu\" data-sortable=\"true\">vCPU</th>\n\t\t<th scope=\"col\" data-sortable=\"true\">Base Clock</th>\n\t\t<th scope=\"col\" data-sortable=\"true\">Memory</th>\n\t\t<th scope=\"col\"></th>\n\t\t<th scope=\"col\" title=\"CPU Platforms\">#Platf.</th>\n\t\t<th scope=\"col\">#</th>\n\t\t<!-- Costs -->\n\t\t<th scope=\"col\" data-sortable=\"true\">Hour</th>\n\t\t<th scope=\"col\" data-sortable=\"true\">Spot</th>\n\t\t<th scope=\"col\" data-sortable=\"true\">Month</th>\n\t\t<th scope=\"col\" data-sortable=\"true\">1Y CUD</th>\n\t\t<th scope=\"col\" data-sortable=\"true\">3Y CUD</th>\n\t\t<!-- OS -->\n\t\t<th scope=\"col\">SLES</th>\n\t\t<th scope=\"col\">RHEL</th>\n\t\t<th scope=\"col\">Windows</th>\n\t</tr>\n</thead>\n<tbody>\n\t[% FOREACH instance IN instances_in_region %]\n\t<tr>\n\t\t<td>\n\t\t\t<a\n\t\t\t   href=\"/[% region.name %]/[% instance.name %].html\"\n\t\t\t   title=\"Google Compute Engine machine type [% instance.name %] in Google Cloud region [% region.name %]\">\n\t\t\t\t[% instance.name %]\n\t\t\t</a>\n\t\t</td>\n\t\t<td class=\"text-nowrap\">[% instance.vCpus %][% badgeSharedCpu(instance) %]</td>\n\t\t<td class=\"frequency\" title=\"CPU base clock frequency: [% instance.cpuBaseClock %] GHz\">[% instance.cpuBaseClock %]</td>\n\t\t<td class=\"memory\" title=\"Random-access memory: [% instance.memoryGB %] GB\">[% instance.memoryGB %]</td>\n\t\t<td>\n\t\t\t[% badgeCpuManufactur(instance) %]\n\t\t\t[% badgeGpu(instance) %]\n\t\t\t[% badgeSap(instance) %]\n\t\t\t[% badgeHana(instance) %]\n\t\t\t[% badgeSpot(instance) %]\n\t\t\t[% badgeSud(instance) %]\n\t\t\t[% badgeLocalSsd(instance) %]\n\t\t</td>\n\t\t<td [% IF instance.availableCpuPlatformCount < instance.cpuPlatformCount %]class=\"table-warning\"[% END%] title=\"Available CPU platforms for machine type [% instance.name %] in region [% region.name %]\">[% IF instance.availableCpuPlatformCount %][% instance.availableCpuPlatformCount %][% ELSE %]<span class=\"text-muted\">?</span>[% END %]</td>\n\t\t<td title=\"Available in [% instance.zoneCount %] zone[% IF instance.zoneCount > 1 %]s[% END %]\">[% instance.zoneCount %]</td>\n\t\t<!-- Costs -->\n\t\t<td class=\"currency\" title=\"[% instance.name %] costs per hour: [% instance.hour %] USD\">[% instance.hour %]</td>\n\t\t<td class=\"currency\" title=\"[% instance.name %] costs per hour with spot provisioning model (Spot VM): [% instance.hourSpot %] USD\">[% instance.hourSpot %]</td>\n\t\t<td class=\"currency\" title=\"[% instance.name %] costs per month: [% instance.month %] USD[% IF instance.sud %] with sustained use discounts (SUD) applied[% END %]\">[% instance.month %]</td>\n\t\t<td class=\"currency\" title=\"[% instance.name %] costs per month w. 1Y CUD: [% instance.month1yCud %] USD\">[% instance.month1yCud %]</td>\n\t\t<td class=\"currency\" title=\"[% instance.name %] costs per month w. 3Y CUD: [% instance.month3yCud %] USD\">[% instance.month3yCud %]</td>\n\t\t<!-- OS -->\n\t\t<td class=\"currency\" title=\"[% instance.name %] license costs for SUSE Linux Enterprise Server: [% instance.monthSles %] USD\">[% instance.monthSles %]</td>\n\t\t<td class=\"currency\" title=\"[% instance.name %] license costs for Red Hat Enterprise Linux: [% instance.monthRhel %] USD\">[% instance.monthRhel %]</td>\n\t\t<td class=\"currency\" title=\"[% instance.name %] license costs for Microsoft Windows Server: [% instance.monthWindows %] USD\">[% instance.monthWindows %]</td>\n</tr>\n\t</tr>\n\t[% END %]\n</tbody>\n</table>\n</div><!-- table-responsive -->\n\n[%-\nid   = region.id - 1\nprev = id - 1\nnext = id + 1\n-%]\n<nav class=\"mt-2\">\n<ul class=\"pagination justify-content-center\">\n\t[% IF id > 0 %]\n\t<li class=\"page-item\"><a class=\"page-link\" href=\"/[% regions.$prev.name %].html\">← [% regions.$prev.name %]</a></li>\n\t[% ELSE %]\n\t<li class=\"page-item disabled\"><span class=\"page-link\">←</span></li>\n\t[% END %]\n\t<li class=\"page-item active\" aria-current=\"page\"><span class=\"page-link\">[% region.name %]</span></li>\n\t[% IF regions.$next.id %]\n\t<li class=\"page-item\"><a class=\"page-link\" href=\"/[% regions.$next.name %].html\">[% regions.$next.name %] →</a></li>\n\t[% ELSE %]\n\t<li class=\"page-item disabled\"><span class=\"page-link\">→</span></li>\n\t[% END %]\n</ul>\n</nav>\n\n[% PROCESS footer.tt2 %]"
  },
  {
    "path": "build/src/regions.tt2",
    "content": "[%- PROCESS header.tt2 -%]\n[%- PROCESS regions_header.tt2 -%]\n\n<h1>Google Cloud Platform Regions</h1>\n\n[%\ntotal_public_ip_addr = 0;\nFOREACH region IN regions;\n\tIF region.regionPublicIpv4Addr; total_public_ip_addr = total_public_ip_addr + region.regionPublicIpv4Addr; END;\nEND;\n%]\n\n<blockquote class=\"blockquote\">\n<p>\nWorldwide, there are <mark>[% regions.size %]</mark> Google Cloud regions.\nA total of <mark>[% total_public_ip_addr / 1000000 FILTER format(\"%d\") %] million public IPv4 addresses</mark> are assigned to all Google Cloud Platform regions.\nThe pricing differs.\n</p>\n</blockquote>\n\n<p>\n\t<a class=\"btn btn-success\" href=\"/map.html\" role=\"button\">🗺️ Region Map</a>\n\t<a class=\"btn btn-secondary\" href=\"https://gcping.com/\" role=\"button\" rel=\"nofollow\" title=\"Measure your latency to Google Cloud regions\">⏱️ Ping</a>\n</p>\n\n<div class=\"table-responsive\">\n<table\n\tclass=\"table table-sm table-hover table-bordered\"\n\tdata-classes=\"table table-sm table-hover table-bordered\"\n\tdata-toggle=\"table\"\n\tdata-sort-name=\"name\"\n\tdata-sort-order=\"asc\"\n\tdata-sortable=\"true\"\n\tdata-sticky-header=\"true\"\n>\n<thead>\n\t<tr>\n\t\t<th scope=\"col\" colspan=\"3\">Region</th>\n\t\t<th scope=\"col\" colspan=\"2\" title=\"Public IPv4 addresses (allows conclusions about the size of the region)\">IP Addr.</th>\n\t\t<th scope=\"col\">Zones</th>\n\t\t<th scope=\"col\" colspan=\"5\">Machine Family</th>\n\t\t<th scope=\"col\" colspan=\"2\">SAP</th>\n\t\t<th scope=\"col\" colspan=\"2\">Costs (e2-standard-8)</th>\n\t\t<th scope=\"col\" colspan=\"2\">Carbon</th>\n\t</tr>\n\t<tr>\n\t\t<th scope=\"col\" data-field=\"name\" data-sortable=\"true\">Name</th>\n\t\t<th scope=\"col\" data-sortable=\"true\">Location</th>\n\t\t<th scope=\"col\" data-sortable=\"true\" title=\"ISO 3166-1 alpha-2 country code\">Country</th>\n\t\t<th scope=\"col\" data-sortable=\"true\" title=\"Public IPv4 addresses (allows conclusions about the size of the region)\">#</th>\n\t\t<th scope=\"col\" data-sortable=\"true\" title=\"Percent of total Google Cloud Platform usage\">%</th>\n\t\t<th scope=\"col\" data-sortable=\"true\">#</th>\n\t\t<!-- Machine Family -->\n\t\t<th scope=\"col\" title=\"General-purpose\" data-sortable=\"true\">General</th>\n\t\t<th scope=\"col\" title=\"Compute-optimized\" data-sortable=\"true\">Compute</th>\n\t\t<th scope=\"col\" title=\"Memory-optimized\" data-sortable=\"true\">Memory</th>\n\t\t<th scope=\"col\" title=\"Accelerator-optimized\" data-sortable=\"true\">GPU</th>\n\t\t<th scope=\"col\" title=\"Storage-optimized\" data-sortable=\"true\">Storage</th>\n\t\t<!-- SAP -->\n\t\t<th scope=\"col\" data-sortable=\"true\" title=\"Certified for SAP applications on Google Cloud\">App.</th>\n\t\t<th scope=\"col\" data-sortable=\"true\" title=\"Certified for SAP HANA on Google Cloud\">HANA</th>\n\t\t<!-- e2-standard-8 -->\n\t\t<th scope=\"col\" class=\"currancy\" data-sortable=\"true\">Hour</th>\n\t\t<th scope=\"col\" class=\"currancy\" data-sortable=\"true\">Month</th>\n\t\t<!-- Carbon -->\n\t\t<th scope=\"col\" data-sortable=\"true\" title=\"Google CFE%: Average percentage of carbon free energy consumed in a particular location on an hourly basis\">CFE%</th>\n\t\t<th scope=\"col\" data-sortable=\"true\" title=\"Grid carbon intensity (gCO2eq/kWh): Average lifecycle gross emissions per unit of energy from the grid\">gCO2eq/kWh</th>\n\t</tr>\n</thead>\n<tbody>\n\t[% FOREACH region IN regions %]\n\t<tr>\n\t\t<td><a href=\"/[% region.name %].html\" title=\"Google Cloud region [% region.name %][% IF region.regionLocationLong %] ([% region.regionLocationLong %])[% ELSIF region.regionLocation %] ([% region.regionLocation %])[% END %]\">[% region.name %]</a></td>\n\t\t<td>\n\t\t\t[% IF region.regionLocation %][% region.regionLocation %][% ELSE %]<span class=\"text-muted\">?</span>[% END %]\n\t\t\t[% badgeLowCo2Region(region) %]\n\t\t</td>\n\t\t<td>\n\t\t\t[% IF region.regionLocationCountryCode %]\n\t\t\t\t[% countryFlag(region.regionLocationCountryCode) %]\n\t\t\t\t[% countryName(region.regionLocationCountryCode) %]\n\t\t\t[% ELSE %]\n\t\t\t<span class=\"text-muted\">?</span>\n\t\t\t[% END %]\n\t\t</td>\n\t\t<td [% IF region.regionPublicIpv4Addr %]title=\"[% region.regionPublicIpv4Addr FILTER format(\"%d\") %] public IPv4 addresses are assigned to region [% region.name %]\"[% END %]>\n\t\t\t[% IF region.regionPublicIpv4Addr %][% region.regionPublicIpv4Addr FILTER format(\"%d\") %][% ELSE %]<span class=\"text-muted\">?</span>[% END %]\n\t\t</td>\n\t\t<td>\n\t\t\t[% IF region.regionPublicIpv4Addr %][% region.regionPublicIpv4Addr / total_public_ip_addr * 100 FILTER format(\"%.2f\") %][% ELSE %]<span class=\"text-muted\">?</span>[% END %]\n\t\t</td>\n\t\t<td>[% region.zoneCount %]</td>\n\t\t<!-- Machine Series -->\n\t\t[% IF region.generalCount     %]<td>[% region.generalCount      %]</td>[% ELSE %]<td class=\"text-muted\">0</td>[% END %]\n\t\t[% IF region.computeCount     %]<td>[% region.computeCount      %]</td>[% ELSE %]<td class=\"text-muted\">0</td>[% END %]\n\t\t[% IF region.memoryCount      %]<td>[% region.memoryCount       %]</td>[% ELSE %]<td class=\"text-muted\">0</td>[% END %]\n\t\t[% IF region.acceleratorCount %]<td>[% region.acceleratorCount  %]</td>[% ELSE %]<td class=\"text-muted\">0</td>[% END %]\n\t\t[% IF region.storageCount     %]<td>[% region.storageCount      %]</td>[% ELSE %]<td class=\"text-muted\">0</td>[% END %]\n\t\t<!-- SAP -->\n\t\t[% IF region.sap  %]<td>[% region.sap  %]</td>[% ELSE %]<td class=\"text-muted\">0</td>[% END %]\n\t\t[% IF region.hana %]<td>[% region.hana %]</td>[% ELSE %]<td class=\"text-muted\">0</td>[% END %]\n\t\t<!-- e2-standard-8 -->\n\t\t<td\n\t\t    title=\"Costs per hour for machine type e2-standard-8 in region [% region.name %]: [% region.hour %] USD\">\n\t\t\t<span class=\"currency\">[% region.e2Standard8Hour %]</span>\n\t\t</td>\n\t\t<td\n\t\t    title=\"Costs per month for machine type e2-standard-8 in region [% region.name %]: [% region.hour %] USD\">\n\t\t\t<span class=\"currency\">[% region.e2Standard8Month %]</span>\n\t\t</td>\n\t\t<td>[% IF region.regionCfe    %][% region.regionCfe    %][% ELSE %]<span class=\"text-muted\">?</span>[% END %]</td>\n\t\t<td>[% IF region.regionCo2Kwh %][% region.regionCo2Kwh %][% ELSE %]<span class=\"text-muted\">?</span>[% END %]</td>\n\t</tr>\n\t[% END %]\n</tbody>\n</table>\n</div><!-- table-responsive -->\n[% PROCESS footer.tt2 %]"
  },
  {
    "path": "build/src/regions_header.tt2",
    "content": "<div class=\"row mt-2\">\n<div class=\"col\">\n<ul class=\"nav nav-tabs\">\n\t<li class=\"nav-item\">\n\t\t<a [% IF template.name == 'regions.tt2' %]class=\"nav-link active\" aria-current=\"page\"[% ELSE %]class=\"nav-link\"[% END %] href=\"/regions.html\">Regions (All)</a>\n\t</li>\n\t<li class=\"nav-item\">\n\t\t<a [% IF template.name == 'platforms.tt2' %]class=\"nav-link active\" aria-current=\"page\"[% ELSE %]class=\"nav-link\"[% END %] href=\"/platforms.html\">CPU</a>\n\t</li>\n\t<li class=\"nav-item\">\n\t\t<a [% IF template.name == 'diskpricing.tt2' %]class=\"nav-link active\" aria-current=\"page\"[% ELSE %]class=\"nav-link\"[% END %] href=\"/diskpricing.html\">Disk</a>\n\t</li>\n</ul>\n</div> <!-- // col -->\n</div> <!-- // row -->"
  },
  {
    "path": "build/src/robots.txt",
    "content": "User-agent: *\nDisallow: /img/\nDisallow: /index.html\nDisallow: /imprint.html\nDisallow: /grid.html\nDisallow: /map.html\nDisallow: /*.js\nDisallow: /*.csv\nDisallow: /*.sql\nDisallow: /*.gz\nDisallow: /*.json\nDisallow: /404.html\nDisallow: /cdn-cgi/\nDisallow: /comparison/\n[% FOREACH region IN regions; IF region.name %]Disallow: /[% region.name %]/\n[% END; END; %]"
  },
  {
    "path": "build/src/sap.tt2",
    "content": "[%- PROCESS header.tt2 -%]\n[%- PROCESS instances_header.tt2 -%]\n\n<h1>Certified for SAP Application on Google Cloud Platform</h1>\n\n[%- countSAP = 0; FOREACH instance IN instances; IF instance.sap; countSAP = countSAP + 1; END; END -%]\n<blockquote class=\"blockquote\">\n<p>\nThere are <mark>[% countSAP %]</mark> Google Compute Engine machine types certified for SAP applications on Google Cloud Platform.\nNot every certified GCE machine type is available in every Google Cloud region.\n</p>\n</blockquote>\n\n<p><a class=\"btn btn-success\" href=\"/grid.html?sap=1\" role=\"button\">✅ Instance Picker with filter on SAP</a></p>\n\n<div class=\"table-responsive\">\n<table\n\tclass=\"table table-sm table-hover table-bordered\"\n\tdata-classes=\"table table-sm table-hover table-bordered\"\n\tdata-toggle=\"table\"\n\tdata-sort-name=\"vcpu\"\n\tdata-sort-order=\"asc\"\n\tdata-sortable=\"true\"\n\tdata-sticky-header=\"true\"\n>\n<thead>\n\t<tr>\n\t\t<th scope=\"col\" colspan=\"6\">Machine Type</th>\n\t\t<th scope=\"col\">Regions</th>\n\t\t<th scope=\"col\" colspan=\"4\">Costs (Avg. Region)</th>\n\t\t<th scope=\"col\" colspan=\"3\">OS</th>\n\t</tr>\n\t<tr>\n\t\t<th scope=\"col\" data-sortable=\"true\">Name</th>\n\t\t<th scope=\"col\" data-field=\"vcpu\" data-sortable=\"true\">vCPU</th>\n\t\t<th scope=\"col\" data-sortable=\"true\">Base Clock</th>\n\t\t<th scope=\"col\" data-sortable=\"true\">Memory</th>\n\t\t<th scope=\"col\" data-sortable=\"true\">SAPS</th>\n\t\t<th scope=\"col\"></th>\n\t\t<th scope=\"col\">#</th>\n\t\t<!-- Costs -->\n\t\t<th scope=\"col\" data-sortable=\"true\">Hour</th>\n\t\t<th scope=\"col\" data-sortable=\"true\">Month</th>\n\t\t<th scope=\"col\" data-sortable=\"true\">1Y CUD</th>\n\t\t<th scope=\"col\" data-sortable=\"true\">3Y CUD</th>\n\t\t<!-- OS -->\n\t\t<th scope=\"col\">SLES for SAP</th>\n\t\t<th scope=\"col\">RHEL for SAP</th>\n\t\t<th scope=\"col\">Windows</th>\n\t</tr>\n</thead>\n<tbody>\n\t[% FOREACH instance IN instances; IF instance.sap; %]\n\t<tr>\n\t\t<td><a href=\"[% instance.name %].html\">[% instance.name %]</a></td>\n\t\t<td class=\"text-nowrap\">[% instance.vCpus %][% badgeSharedCpu(instance) %]</td>\n\t\t<td class=\"frequency\" title=\"CPU base clock frequency: [% instance.cpuBaseClock %] GHz\">[% instance.cpuBaseClock %]</td>\n\t\t<td class=\"memory\" title=\"Random-access memory: [% instance.memoryGB %] GB\">[% instance.memoryGB %]</td>\n\t\t<td title=\"SAP Standard Benchmark: [% instance.saps %]\">[% instance.saps %]</td>\n\t\t<td>\n\t\t\t[% badgeCpuManufactur(instance) %]\n\t\t\t[% badgeHana(instance) %]\n\t\t\t[% badgeSpot(instance) %]\n\t\t\t[% badgeSud(instance) %]\n\t\t\t[% badgeLocalSsd(instance) %]\n\t\t</td>\n\t\t<td>[% instance.regionCount %]</td>\n\t\t<!-- Costs -->\n\t\t<td class=\"currency\" title=\"[% instance.name %] avg. costs per hour: [% instance.avgHour %] USD\">[% instance.avgHour %]</td>\n\t\t<td class=\"currency\" title=\"[% instance.name %] avg. costs per month: [% instance.avgMonth %] USD[% IF instance.sud %] with sustained use discounts (SUD) applied[% END %]\">[% instance.avgMonth %]</td>\n\t\t<td class=\"currency\" title=\"[% instance.name %] avg. costs per month w. 1Y CUD: [% instance.avgMonth1yCud %] USD\">[% instance.avgMonth1yCud %]</td>\n\t\t<td class=\"currency\" title=\"[% instance.name %] avg. costs per month w. 3Y CUD: [% instance.avgMonth3yCud %] USD\">[% instance.avgMonth3yCud %]</td>\n\t\t<!-- OS -->\n\t\t<td class=\"currency\" title=\"[% instance.name %] license costs for SUSE Linux Enterprise Server for SAP: [% instance.monthSlesSap %] USD\">[% instance.monthSlesSap %]</td>\n\t\t<td class=\"currency\" title=\"[% instance.name %] license costs for Red Hat Enterprise Linux for SAP: [% instance.monthRhelSap %] USD\">[% instance.monthRhelSap %]</td>\n\t\t<td class=\"currency\" title=\"[% instance.name %] license costs for Microsoft Windows Server: [% instance.monthWindows %] USD\">[% instance.monthWindows %]</td>\n\t</tr>\n\t[% END; END; %]\n</tbody>\n</table>\n</div> <!-- // table-responsive -->\n[% PROCESS footer.tt2 %]"
  },
  {
    "path": "build/src/sitemap.tt2",
    "content": "[% site.url %]/\n[% FOREACH file IN files %][% site.url %]/[% file %]\n[% END %]"
  },
  {
    "path": "build/src/vs.tt2",
    "content": "[%- PROCESS header.tt2 -%]\n\n<h1>Compare Google Compute Engine Machine Type [% instance_a.name %]</h1>\n\n<blockquote class=\"blockquote\">\n<p>\n\tCompare Google Compute Engine machine type\n\t<a href=\"/[% instance_a.name %].html\" title=\"Show machine type [% instance_a.name %] in all regions\">[% instance_a.name %]</a>\n\t([% instance_a.vCpus %] vCPU, [% instance_a.memoryGB %] GB memory)\n\twith other GCE machine types.\n</p>\n</blockquote>\n\n<div class=\"table-responsive\">\n<table\n\tclass=\"table table-hover table-bordered\"\n\tdata-toggle=\"table\"\n\tdata-sort-name=\"vcpu\"\n\tdata-sort-order=\"asc\"\n\tdata-sticky-header=\"true\"\n>\n<thead>\n\t<tr>\n\t\t<th scope=\"col\" data-sortable=\"true\">Name</th>\n\t\t<th scope=\"col\"></th>\n\t\t<th scope=\"col\" data-field=\"vcpu\" data-sortable=\"true\">vCPU</th>\n\t\t<th scope=\"col\"></th>\n\t\t<th scope=\"col\" data-sortable=\"true\">Memory</th>\n\t\t<th scope=\"col\"></th>\n\t\t<th scope=\"col\"></th>\n\t\t<th scope=\"col\">Avg. costs per hour</th>\n\t\t<th scope=\"col\"></th>\n\t\t<th scope=\"col\">Avg. costs per Spot VM hour</th>\n\t\t<th scope=\"col\"></th>\n\t\t<th scope=\"col\">Avg. costs per month</th>\n\t</tr>\n</thead>\n<tbody>\n\t[% FOREACH instance IN instances %]\n\t[% IF instance_a.name == instance.name %]\n\t<tr class=\"table-info\">\n\t\t<td>[% instance.name %]</td>\n\t\t<!-- vCPU -->\n\t\t<td></td>\n\t\t<td class=\"text-nowrap\">[% instance.vCpus %][% badgeSharedCpu(instance) %]</td>\n\t\t<!-- Memory -->\n\t\t<td></td>\n\t\t<td class=\"memory\" title=\"Random-access memory: [% instance.memoryGB %] GB\">[% instance.memoryGB %]</td>\n\t\t<td>\n\t\t\t[% badgeCpuManufactur(instance) %]\n\t\t\t[% badgeGpu(instance) %]\n\t\t\t[% badgeSap(instance) %]\n\t\t\t[% badgeHana(instance) %]\n\t\t\t[% badgeSpot(instance) %]\n\t\t\t[% badgeLocalSsd(instance) %]\n\t\t</td>\n\t\t<!-- Hour -->\n\t\t<td></td>\n\t\t<td title=\"[% instance.name %] avg. costs per hour: [% instance.avgHour %] USD\">\n\t\t\t<span class=\"currency\">[% instance.avgHour %]</span>\n\t\t</td>\n\t\t<!-- // Hour -->\n\t\t<!-- Spot VM -->\n\t\t<td></td>\n\t\t<td title=\"[% instance.name %] avg. costs per Spot VM hour: [% instance.avgHourSpot %] USD\">\n\t\t\t<span class=\"currency\">[% instance.avgHourSpot %]</span>\n\t\t</td>\n\t\t<!-- // Spot VM -->\n\t\t<!-- Month -->\n\t\t<td></td>\n\t\t<td title=\"[% instance.name %] avg. costs per month: [% instance.avgMonth %] USD[% IF instance.sud %] with sustained use discounts (SUD) applied[% END %]\">\n\t\t\t<span class=\"currency\">[% instance.avgMonth %]</span>\n\t\t\t[% badgeSud(instance) %]\n\t\t</td>\n\t\t<!-- // Month -->\n\t</tr>\n\t[% ELSE %]\n\t<tr>\n\t\t<td>\n\t\t\t<a href=\"/comparison/[% instance_a.name %]/vs/[% instance.name %].html\" title=\"Compare Google Compute Engine machine type [% instance_a.name %] vs. [% instance.name %]\">\n\t\t\t\t[% instance.name %]\n\t\t\t</a>\n\t\t</td>\n\t\t<!-- vCPU -->\n\t\t[% tableCompareNumber(instance_a.vCpus || 0, instance.vCpus || 0) %]\n\t\t<td>[% instance.vCpus %][% badgeSharedCpu(instance) %]</td>\n\t\t<!-- Memory -->\n\t\t[% tableCompareNumber(instance_a.memoryGB || 0, instance.memoryGB || 0) %]\n\t\t<td class=\"memory\" title=\"Random-access memory: [% instance.memoryGB %] GB\">[% instance.memoryGB %]</td>\n\t\t<td>\n\t\t\t[% badgeCpuManufactur(instance) %]\n\t\t\t[% badgeGpu(instance) %]\n\t\t\t[% badgeSap(instance) %]\n\t\t\t[% badgeHana(instance) %]\n\t\t\t[% badgeSpot(instance) %]\n\t\t\t[% badgeLocalSsd(instance) %]\n\t\t</td>\n\t\t<!-- Hour -->\n\t\t[% tableCompareCosts(instance_a.avgHour || 0, instance.avgHour || 0) %]\n\t\t<td title=\"[% instance.name %] avg. costs per hour: [% instance.avgHour %] USD\">\n\t\t\t<span class=\"currency\">[% instance.avgHour %]</span>\n\t\t</td>\n\t\t<!-- // Hour -->\n\t\t<!-- Spot VM -->\n\t\t[% tableCompareCosts(instance_a.avgHourSpot || 0, instance.avgHourSpot || 0) %]\n\t\t<td title=\"[% instance.name %] avg. costs per Spot VM hour: [% instance.avgHourSpot %] USD\">\n\t\t\t<span class=\"currency\">[% instance.avgHourSpot %]</span>\n\t\t</td>\n\t\t<!-- // Spot VM -->\n\t\t<!-- Month -->\n\t\t[% tableCompareCosts(instance_a.avgMonth || 0, instance.avgMonth || 0) %]\n\t\t<td class=\"text-nowrap\" title=\"[% instance.name %] avg. costs per month: [% instance.avgMonth %] USD[% IF instance.sud %] with sustained use discounts (SUD) applied[% END %]\">\n\t\t\t<span class=\"currency\">[% instance.avgMonth %]</span>\n\t\t\t[% badgeSud(instance) %]\n\t\t</td>\n\t\t<!-- // Month -->\n\t</tr>\n\t[% END; END; %]\n</tbody>\n</table>\n</div> <!-- // table-responsive -->\n[% PROCESS footer.tt2 %]"
  },
  {
    "path": "instances/README.md",
    "content": "# Google Compute Engine\n\nHere you can find the SQL files that add the different information from the Google websites.\nThe information is in addition to the data of the Google Cloud Compute API.\n\nFeel free to make changes if something is wrong or you want to expand it.\n\nThe SQL files are read during the [build](../build/) process.\n\n## Machine Types\n\n* [Series](./series/)\n\t* [A2](./series/a2.sql)\n\t* [A3](./series/a2.sql)\n\t* [C2](./series/c2.sql)\n\t* [C2D](./series/c2d.sql)\n\t* [C3](./series/c3.sql)\n\t* [C3D](./series/c3d.sql)\n\t* [C4](./series/c4.sql)\n\t* [C4A](./series/c4a.sql)\n\t* [C4D](./series/c4d.sql)\n\t* [E2](./series/e2.sql)\n\t* [G2](./series/g2.sql)\n\t* [M1](./series/m1.sql)\n\t* [M2](./series/m2.sql)\n\t* [M3](./series/m3.sql)\n\t* [M4](./series/m4.sql)\n\t* [N1](./series/n1.sql)\n\t* [N2](./series/n2.sql)\n\t* [N2D](./series/n2d.sql)\n\t* [N4](./series/n4.sql)\n\t* [N4A](./series/n4a.sql)\n\t* [N4D](./series/n4d.sql)\n\t* [T2D](./series/t2d.sql)\n\t* [T2A](./series/t2a.sql)\n\t* [Z3](./series/z3.sql)\n* [CPU Platform](./series/cpu/)\n\t* [Frequency (GHz)](./series/cpu/frequency.sql)\n\t* [EEMBC CoreMark Benchmark](./series/cpu/coremark.sql)\n* [SAP](./series/sap/)\n\t* [SAP certified machine types](./series/sap/sap.sql)\n\t* [SAP HANA certified machine types](./series/sap/hana.sql)\n\n## Costs\n\nThe cost per machine type in region and licenses are added with the [gcosts](https://github.com/Cyclenerd/google-cloud-pricing-cost-calculator) program.\n\n## Resources of the Information\n\n<ul>\n\t<li>\n\t\t<a href=\"https://cloud.google.com/compute/docs/machine-types#machine_type_comparison\" rel=\"nofollow\">Machine series comparison</a>\n\t\t<ul>\n\t\t\t<li>\n\t\t\t\t<a href=\"https://cloud.google.com/compute/docs/accelerator-optimized-machines#a2_vms\" rel=\"nofollow\">A2</a> and\n\t\t\t\t<a href=\"https://cloud.google.com/compute/docs/accelerator-optimized-machines#g2-vms\" rel=\"nofollow\">G2</a> accelerator optimized machines\n\t\t\t</li>\n\t\t\t<li>\n\t\t\t\t<a href=\"https://cloud.google.com/compute/docs/compute-optimized-machines#c2_machine_types\" rel=\"nofollow\">C2</a>,\n\t\t\t\t<a href=\"https://cloud.google.com/compute/docs/compute-optimized-machines#c2d_machine_types\" rel=\"nofollow\">C2D</a> and\n\t\t\t\t<a href=\"https://cloud.google.com/compute/docs/compute-optimized-machines#h3_series\" rel=\"nofollow\">H3</a> compute optimized machine series\n\t\t\t</li>\n\t\t\t<li>\n\t\t\t\t<a href=\"https://cloud.google.com/compute/docs/memory-optimized-machines#m1_machine_types\" rel=\"nofollow\">M1</a>,\n\t\t\t\t<a href=\"https://cloud.google.com/compute/docs/memory-optimized-machines#m2_machine_types\" rel=\"nofollow\">M2</a> and\n\t\t\t\t<a href=\"https://cloud.google.com/compute/docs/memory-optimized-machines#m3_machine_types\" rel=\"nofollow\">M3</a> memory optimized machine series\n\t\t\t</li>\n\t\t\t<li>\n\t\t\t\t<a href=\"https://cloud.google.com/compute/docs/general-purpose-machines#c3_series\" rel=\"nofollow\">C3</a>,\n\t\t\t\t<a href=\"https://cloud.google.com/compute/docs/general-purpose-machines#c3d_series\" rel=\"nofollow\">C3D</a>,\n\t\t\t\t<a href=\"https://cloud.google.com/compute/docs/general-purpose-machines#c4_series\" rel=\"nofollow\">C4</a>,\n\t\t\t\t<a href=\"https://cloud.google.com/compute/docs/general-purpose-machines#c4a_series\" rel=\"nofollow\">C4A</a>,\n\t\t\t\t<a href=\"https://cloud.google.com/compute/docs/general-purpose-machines#e2_machine_types\" rel=\"nofollow\">E2</a>,\n\t\t\t\t<a href=\"https://cloud.google.com/compute/docs/general-purpose-machines#n1_machines\" rel=\"nofollow\">N1</a>,\n\t\t\t\t<a href=\"https://cloud.google.com/compute/docs/general-purpose-machines#n2_machines\" rel=\"nofollow\">N2</a>,\n\t\t\t\t<a href=\"https://cloud.google.com/compute/docs/general-purpose-machines#n2d_machines\" rel=\"nofollow\">N2D</a>,\n\t\t\t\t<a href=\"https://cloud.google.com/compute/docs/general-purpose-machines#n4_series\" rel=\"nofollow\">N4</a>,\n\t\t\t\t<a href=\"https://cloud.google.com/compute/docs/general-purpose-machines#n4a_series\" rel=\"nofollow\">N4A</a>,\n\t\t\t\t<a href=\"https://cloud.google.com/compute/docs/general-purpose-machines#n4d_series\" rel=\"nofollow\">N4D</a>,\n\t\t\t\t<a href=\"https://cloud.google.com/compute/docs/general-purpose-machines#t2d_machines\" rel=\"nofollow\">T2D</a> and\n\t\t\t\t<a href=\"https://cloud.google.com/compute/docs/general-purpose-machines#t2a_machines\" rel=\"nofollow\">T2A</a> general purpose machine series\n\t\t\t</li>\n\t\t</ul>\n\t</li>\n\t</li>\n\t<li><a href=\"https://cloud.google.com/compute/docs/regions-zones#available\">Available regions and zones</a></li>\n\t<li><a href=\"https://cloud.google.com/compute/docs/cpu-platforms\" rel=\"nofollow\">CPU Platform</a></li>\n\t<li><a href=\"https://cloud.google.com/compute/docs/benchmarks-linux\" rel=\"nofollow\">Benchmarks for Linux VM instances</a></li>\n\t<li><a href=\"https://cloud.google.com/solutions/sap/docs/certifications-sap-apps#sap-certified-vms\" rel=\"nofollow\">Certified SAP applications on Google Cloud</a></li>\n\t<li><a href=\"https://cloud.google.com/solutions/sap/docs/certifications-sap-hana#hana-cert-table-vms\" rel=\"nofollow\">Certified machine types for SAP HANA</a></li>\n</ul>\n\n"
  },
  {
    "path": "instances/clean_up.sql",
    "content": "/* \n * Delete not yet official 100% released machine types\n */\n\nDELETE FROM machinetypes WHERE name LIKE 'ct3-%';\nDELETE FROM machinetypes WHERE name LIKE 'ct3p-%';\nDELETE FROM machinetypes WHERE name LIKE 'ct4p-%';\nDELETE FROM machinetypes WHERE name LIKE 'ct5l-%';\nDELETE FROM machinetypes WHERE name LIKE 'ct5lp-%';\nDELETE FROM machinetypes WHERE name LIKE 'ct5p-%';\nDELETE FROM machinetypes WHERE name LIKE 'ct6e-%';\n\nDELETE FROM machinetypes WHERE name LIKE 'x4-%';\n\n/* \n * Delete not yet official 100% finished regions\n */\n\nDELETE FROM machinetypes WHERE zone LIKE 'us-west8-%';\nDELETE FROM disktypes    WHERE zone LIKE 'us-west8-%';\n\n\n/*\n * Remove disconnected data centers\n */\n/* us-central2 */\nDELETE FROM machinetypes WHERE zone LIKE 'us-central2-%';\nDELETE FROM disktypes    WHERE zone LIKE 'us-central2-%';\n/* us-east2 */\nDELETE FROM machinetypes WHERE zone LIKE 'us-east2-%';\nDELETE FROM disktypes    WHERE zone LIKE 'us-east2-%';\n/* us-east7 */\nDELETE FROM machinetypes WHERE zone LIKE 'us-east7-%';\nDELETE FROM disktypes    WHERE zone LIKE 'us-east7-%';\n/* europe-west5 */\nDELETE FROM machinetypes WHERE zone LIKE 'europe-west5-%';\nDELETE FROM disktypes    WHERE zone LIKE 'europe-west5-%';"
  },
  {
    "path": "instances/series/a2.sql",
    "content": "/* A2 Accelerator-optimized high-gpu */\n/* https://cloud.google.com/compute/docs/machine-types#machine_type_comparison */\n/* https://cloud.google.com/compute/docs/accelerator-optimized-machines#a2_vms */\nUPDATE instances SET\nseries      = 'a2',\nfamily      = 'Accelerator-optimized',\ncpuPlatform = 'Cascade Lake',\nlocalSsd    = '1',\nspot        = '1'\nWHERE name LIKE 'a2-%';\nUPDATE instances SET bandwidth = '24'  WHERE name LIKE 'a2-%-1g';\nUPDATE instances SET bandwidth = '32'  WHERE name LIKE 'a2-%-2g';\nUPDATE instances SET bandwidth = '50'  WHERE name LIKE 'a2-%-4g';\nUPDATE instances SET bandwidth = '100' WHERE name LIKE 'a2-%-8g';\nUPDATE instances SET bandwidth = '100' WHERE name LIKE 'a2-%-16g';\n\nUPDATE instances SET localSsd = '375'  WHERE name LIKE 'a2-ultragpu-1g';\nUPDATE instances SET localSsd = '750'  WHERE name LIKE 'a2-ultragpu-2g';\nUPDATE instances SET localSsd = '1500' WHERE name LIKE 'a2-ultragpu-4g';\nUPDATE instances SET localSsd = '3000' WHERE name LIKE 'a2-ultragpu-8g';\n"
  },
  {
    "path": "instances/series/a3.sql",
    "content": "/* A3 Accelerator-optimized machine family */\n/* https://cloud.google.com/compute/docs/accelerator-optimized-machines#a3-vms */\nUPDATE instances SET\nseries      = 'a3',\nfamily      = 'Accelerator-optimized',\ncpuPlatform = 'Sapphire Rapids',\nlocalSsd    = '1',\nbandwidth   = '200',\nspot        = '1'\nWHERE name LIKE 'a3-%';\n\nUPDATE instances SET localSsd = '6000' WHERE name LIKE 'a3-%-8g';\n\nUPDATE instances SET bandwidth = '800'  WHERE name LIKE 'a3-highgpu-8g';\nUPDATE instances SET bandwidth = '1600' WHERE name LIKE 'a3-megagpu-8g';\n"
  },
  {
    "path": "instances/series/c2.sql",
    "content": "/* C2 Compute-optimized */\n/* https://cloud.google.com/compute/docs/machine-types#machine_type_comparison */\n/* https://cloud.google.com/compute/docs/compute-optimized-machines#c2_machine_types */\nUPDATE instances SET\nseries      = 'c2',\nfamily      = 'Compute-optimized',\ncpuPlatform = 'Cascade Lake',\nlocalSsd    = '1',\nsud         = '1',\nspot        = '1'\nWHERE name LIKE 'c2-%';\nUPDATE instances SET bandwidth = '10' WHERE name LIKE 'c2-%-4';\nUPDATE instances SET bandwidth = '16' WHERE name LIKE 'c2-%-8';\nUPDATE instances SET bandwidth = '32' WHERE name LIKE 'c2-%-16';\nUPDATE instances SET bandwidth = '32', tier1 = '50'  WHERE name LIKE 'c2-%-30';\nUPDATE instances SET bandwidth = '32', tier1 = '100' WHERE name LIKE 'c2-%-60';"
  },
  {
    "path": "instances/series/c2d.sql",
    "content": "/* C2D Compute-optimized */\n/* https://cloud.google.com/compute/docs/machine-types#machine_type_comparison */\n/* https://cloud.google.com/compute/docs/compute-optimized-machines#c2d-standard */\nUPDATE instances SET\nseries      = 'c2d',\nfamily      = 'Compute-optimized',\ncpuPlatform = 'Milan',\nlocalSsd    = '1',\nbandwidth   = '32',\nspot        = '1'\nWHERE name LIKE 'c2d-%';\nUPDATE instances SET bandwidth = '10'  WHERE name LIKE 'c2d-%-2';\nUPDATE instances SET bandwidth = '10'  WHERE name LIKE 'c2d-%-4';\nUPDATE instances SET bandwidth = '16'  WHERE name LIKE 'c2d-%-8';\nUPDATE instances SET tier1 = '50'  WHERE name LIKE 'c2d-%-32';\nUPDATE instances SET tier1 = '50'  WHERE name LIKE 'c2d-%-56';\nUPDATE instances SET tier1 = '100' WHERE name LIKE 'c2d-%-112';"
  },
  {
    "path": "instances/series/c3.sql",
    "content": "/* C3 Compute-optimized */\n/* https://cloud.google.com/compute/docs/general-purpose-machines#c3-standard_1 */\nUPDATE instances SET\nseries      = 'c3',\nfamily      = 'General-purpose',\ncpuPlatform = 'Sapphire Rapids',\nlocalSsd    = '0',\nbandwidth   = '32',\nspot        = '1'\nWHERE name LIKE 'c3-%';\n\nUPDATE instances SET bandwidth = '23'  WHERE name LIKE 'c3-%-4%';\nUPDATE instances SET bandwidth = '23'  WHERE name LIKE 'c3-%-8%';\nUPDATE instances SET bandwidth = '23'  WHERE name LIKE 'c3-%-22%';\nUPDATE instances SET bandwidth = '32'  WHERE name LIKE 'c3-%-44%';\nUPDATE instances SET bandwidth = '62'  WHERE name LIKE 'c3-%-88%';\nUPDATE instances SET bandwidth = '100' WHERE name LIKE 'c3-%-176%';\nUPDATE instances SET bandwidth = '100' WHERE name LIKE 'c3-%-192-metal%';\n\nUPDATE instances SET tier1 = '50'  WHERE name LIKE 'c3-%-44%';\nUPDATE instances SET tier1 = '100' WHERE name LIKE 'c3-%-88%';\nUPDATE instances SET tier1 = '200' WHERE name LIKE 'c3-%-176%';\nUPDATE instances SET tier1 = '200' WHERE name LIKE 'c3-%-192-metal%';\n\nUPDATE instances SET localSsd = '1' WHERE name LIKE 'c3-%-lssd';"
  },
  {
    "path": "instances/series/c3d.sql",
    "content": "/* C3 Compute-optimized */\n/* https://cloud.google.com/compute/docs/general-purpose-machines#c3-standard_1 */\nUPDATE instances SET\nseries      = 'c3d',\nfamily      = 'General-purpose',\ncpuPlatform = 'Genoa',\nlocalSsd    = '0',\nbandwidth   = '20',\nspot        = '1'\nWHERE name LIKE 'c3d-%';\n\nUPDATE instances SET bandwidth = '40'  WHERE name LIKE 'c3d-%-60%';\nUPDATE instances SET bandwidth = '60'  WHERE name LIKE 'c3d-%-90%';\nUPDATE instances SET bandwidth = '100' WHERE name LIKE 'c3d-%-180%';\nUPDATE instances SET bandwidth = '100' WHERE name LIKE 'c3d-%-360%';\n\nUPDATE instances SET tier1 = '50'  WHERE name LIKE 'c3d-%-30%';\nUPDATE instances SET tier1 = '75'  WHERE name LIKE 'c3d-%-60%';\nUPDATE instances SET tier1 = '100' WHERE name LIKE 'c3d-%-90%';\nUPDATE instances SET tier1 = '150' WHERE name LIKE 'c3d-%-180%';\nUPDATE instances SET tier1 = '200' WHERE name LIKE 'c3d-%-360%';\n\nUPDATE instances SET localSsd = '1' WHERE name LIKE 'c3d-%-lssd';"
  },
  {
    "path": "instances/series/c4.sql",
    "content": "/* C4 General-purpose */\n/* https://cloud.google.com/compute/docs/general-purpose-machines#c4_series */\nUPDATE instances SET\nseries      = 'c4',\nfamily      = 'General-purpose',\ncpuPlatform = 'Emerald Rapids, Granite Rapids',\nlocalSsd    = '0',\nsud         = '0',\nspot        = '1'\nWHERE name LIKE 'c4-%';\nUPDATE instances SET bandwidth = '10' WHERE name LIKE 'c4-%-2%';\nUPDATE instances SET bandwidth = '10' WHERE name LIKE 'c4-%-4%';\nUPDATE instances SET bandwidth = '23' WHERE name LIKE 'c4-%-8%';\nUPDATE instances SET bandwidth = '23' WHERE name LIKE 'c4-%-16%';\nUPDATE instances SET bandwidth = '23' WHERE name LIKE 'c4-%-24%';\nUPDATE instances SET bandwidth = '23' WHERE name LIKE 'c4-%-32%';\nUPDATE instances SET bandwidth = '34' WHERE name LIKE 'c4-%-48%';\nUPDATE instances SET bandwidth = '67' WHERE name LIKE 'c4-%-96%';\nUPDATE instances SET bandwidth = '100' WHERE name LIKE 'c4-%-144%';\nUPDATE instances SET bandwidth = '100' WHERE name LIKE 'c4-%-192%';\nUPDATE instances SET bandwidth = '100' WHERE name LIKE 'c4-%-288%';\n\nUPDATE instances SET tier1 = '50'  WHERE name LIKE 'c4-%-48%';\nUPDATE instances SET tier1 = '100' WHERE name LIKE 'c4-%-96%';\nUPDATE instances SET tier1 = '150' WHERE name LIKE 'c4-%-144%';\nUPDATE instances SET tier1 = '200' WHERE name LIKE 'c4-%-192%';\nUPDATE instances SET tier1 = '200' WHERE name LIKE 'c4-%-288%';\n\nUPDATE instances SET localSsd = '1' WHERE name LIKE 'c4-%-lssd';\nUPDATE instances SET localSsd = '1' WHERE name LIKE 'c4-%-lssd-metal';"
  },
  {
    "path": "instances/series/c4a.sql",
    "content": "/* C4A General-purpose */\n/* https://cloud.google.com/compute/docs/general-purpose-machines#c4a_series */\nUPDATE instances SET\nseries      = 'c4a',\nfamily      = 'General-purpose',\ncpuPlatform = 'Google Axion',\nlocalSsd    = '0',\nsud         = '0',\nspot        = '1'\nWHERE name LIKE 'c4a-%';\nUPDATE instances SET bandwidth = '10' WHERE name LIKE 'c4a-%-1%';\nUPDATE instances SET bandwidth = '10' WHERE name LIKE 'c4a-%-2%';\nUPDATE instances SET bandwidth = '23' WHERE name LIKE 'c4a-%-4%';\nUPDATE instances SET bandwidth = '23' WHERE name LIKE 'c4a-%-8%';\nUPDATE instances SET bandwidth = '23' WHERE name LIKE 'c4a-%-16%';\nUPDATE instances SET bandwidth = '23' WHERE name LIKE 'c4a-%-32%';\nUPDATE instances SET bandwidth = '34' WHERE name LIKE 'c4a-%-48%';\nUPDATE instances SET bandwidth = '45' WHERE name LIKE 'c4a-%-64%';\nUPDATE instances SET bandwidth = '50' WHERE name LIKE 'c4a-%-72%';\n\nUPDATE instances SET tier1 = '50'  WHERE name LIKE 'c4a-%-32%';\nUPDATE instances SET tier1 = '50'  WHERE name LIKE 'c4a-%-48%';\nUPDATE instances SET tier1 = '75'  WHERE name LIKE 'c4a-%-64%';\nUPDATE instances SET tier1 = '100' WHERE name LIKE 'c4a-%-72%';\n\nUPDATE instances SET localSsd = '1' WHERE name LIKE 'c4a-%-lssd';"
  },
  {
    "path": "instances/series/c4d.sql",
    "content": "/* C4D General-purpose */\n/* https://cloud.google.com/compute/docs/general-purpose-machines#c4d_machine_types */\nUPDATE instances SET\nseries      = 'c4d',\nfamily      = 'General-purpose',\ncpuPlatform = 'Turin',\nlocalSsd    = '0',\nsud         = '0',\nspot        = '1'\nWHERE name LIKE 'c4d-%';\nUPDATE instances SET bandwidth = '10' WHERE name LIKE 'c4d-%-2%';\nUPDATE instances SET bandwidth = '20' WHERE name LIKE 'c4d-%-4%';\nUPDATE instances SET bandwidth = '20' WHERE name LIKE 'c4d-%-8%';\nUPDATE instances SET bandwidth = '20' WHERE name LIKE 'c4d-%-16%';\nUPDATE instances SET bandwidth = '23' WHERE name LIKE 'c4d-%-32%';\nUPDATE instances SET bandwidth = '34' WHERE name LIKE 'c4d-%-48%';\nUPDATE instances SET bandwidth = '45' WHERE name LIKE 'c4d-%-64%';\nUPDATE instances SET bandwidth = '67' WHERE name LIKE 'c4d-%-96%';\nUPDATE instances SET bandwidth = '100' WHERE name LIKE 'c4d-%-192%';\nUPDATE instances SET bandwidth = '100' WHERE name LIKE 'c4d-%-384%';\n\nUPDATE instances SET tier1 = '50'  WHERE name LIKE 'c4d-%-48%';\nUPDATE instances SET tier1 = '75'  WHERE name LIKE 'c4d-%-64%';\nUPDATE instances SET tier1 = '100' WHERE name LIKE 'c4d-%-96%';\nUPDATE instances SET tier1 = '150' WHERE name LIKE 'c4d-%-192%';\nUPDATE instances SET tier1 = '200' WHERE name LIKE 'c4d-%-384%';\n\nUPDATE instances SET localSsd = '1' WHERE name LIKE 'c4d-%-lssd';"
  },
  {
    "path": "instances/series/cpu/README.md",
    "content": "# CPU Platforms\n\n* Google documentation: <https://cloud.google.com/compute/docs/cpu-platforms>\n* Wikipedia\n\t* Intel: <https://en.wikipedia.org/wiki/Xeon>\n\t* AMD: <https://en.wikipedia.org/wiki/Epyc>\n\t* AMPERE: <https://en.wikipedia.org/wiki/Ampere_Computing>\n* WikiChip\n\t* Intel: <https://en.wikichip.org/wiki/intel/microarchitectures>\n\t* AMD: <https://en.wikichip.org/wiki/amd/microarchitectures>\n\t* AMPERE: <https://en.wikichip.org/wiki/ampere_computing>\n\nPerformance benchmarks are created with [PerfKitBenchmarker](https://github.com/GoogleCloudPlatform/PerfKitBenchmarker) on Compute Engine VM instances.\n\n* Google documentation: <https://cloud.google.com/compute/docs/benchmarks-linux>\n* Wikipedia: <https://googlecloudplatform.github.io/PerfKitBenchmarker/>\n\nMore help with resource mappings from on-premises hardware to Google Cloud: <https://cloud.google.com/architecture/resource-mappings-from-on-premises-hardware-to-gcp>\n\n## Coremark Benchmark\n\nCopy benchmarks from website <https://cloud.google.com/compute/docs/benchmarks-linux> and paste as unformatted text (<kbd>Crtl</kbd>+<kbd>Shift</kbd>+<kbd>V</kbd>) to spreadsheet (`coremark.ods`) and export as CSV (`coremark.csv`).\n\nRun `coremark.pl` to convert CSV to SQL:\n```shell\nperl coremark.pl > coremark.sql\n```\n\n## Intel\n\nIntel Xeon processor family\n\n### Sandy Bridge\n\n* Code named: Sandy Bridge-EP (E5-46xx)\n* Release date: 2012\n\n### Ivy Bridge\n\n* Code named: Ivy Bridge-EP (E5-46xx v2)\n* Release date: 2014\n\n### Haswell\n\n* Code name: Haswell-EP (E5-46xx v3)\n* Release date: 2015\n\n### Broadwell\n\n* Code name: Broadwell (E3/E5-1xxx/E5-2xxx v4)\n* Release date: 2015\n\n### Skylake\n\n* Code name: Skylake-SP\n* Release date: 2017\n\n### Cascade Lake\n\n* Code name: Cascade Lake-SP\n* Release date: 2019\n\n### Ice Lake\n\n* Code name: Ice Lake-SP\n* Release date: 2021\n\n### Sapphire Rapids\n\n* Code name: Sapphire Rapids\n* Release date: 2023\n\n### Emerald Rapids\n\n* Code name: Emerald Rapids\n* Release date: 2023\n* [Wikipedia](https://en.wikipedia.org/wiki/Emerald_Rapids)\n\n### Granite Rapids\n\n* Code name: Granite Rapids\n* Release date: 2024\n* [Wikipedia](https://en.wikipedia.org/wiki/Granite_Rapids)\n\n## AMD\n\nAMD Zen based Epyc microarchitecture\n\n### Rome\n\n* Generation 2nd\n* Release date: 2019\n\n### Milan\n\n* Generation 3rd\n* Release date: 2021\n\n### Milan X\n\n* Generation 3rd\n* Release date: 2022\n\n### Genoa\n\n* Generation 4rd\n* Release date: 2022\n\n## Arm\n\n### Ampere Altra\n\n<https://amperecomputing.com/processors/ampere-altra/>\n\n* SKU: Q64-30\n\t* Cores: 64\n\t* Frequency: 3.0 GHz\n\t* TDP: 180 W\n* Release date: 2020"
  },
  {
    "path": "instances/series/cpu/coremark.csv",
    "content": "MACHINE_TYPE;CPU;vCores;COREMARK_SCORE;STANDARD_DEVIATION;SAMPLE_COUNT\nn2-standard-2 ;Ice Lake ;2;34,735 ;0.53 ;3672\nn2-standard-4 ;Ice Lake ;4;66,884 ;0.61 ;2336\nn2-standard-8 ;Ice Lake ;8;138,567 ;0.67 ;1592\nn2-standard-16 ;Ice Lake ;16;277,010 ;0.72 ;616\nn2-standard-32 ;Ice Lake ;32;553,662 ;0.77 ;312\nn2-standard-48 ;Ice Lake ;48;824,915 ;1.18 ;216\nn2-standard-64 ;Ice Lake ;64;1,091,008 ;1.34 ;168\nn2-standard-80 ;Ice Lake ;80;1,365,998 ;1.53 ;128\nn2-standard-96 ;Ice Lake ;96;1,651,980 ;0.93 ;112\nn2-standard-128 ;Ice Lake ;128;2,169,248 ;2.33 ;88\n;;;;;\nn2-highmem-2 ;Ice Lake ;2;34,695 ;0.82 ;3688\nn2-highmem-4 ;Ice Lake ;4;66,798 ;0.60 ;2344\nn2-highmem-8 ;Ice Lake ;8;138,406 ;0.79 ;1192\nn2-highmem-16 ;Ice Lake ;16;276,327 ;0.91 ;624\nn2-highmem-32 ;Ice Lake ;32;550,448 ;1.23 ;320\nn2-highmem-48 ;Ice Lake ;48;814,034 ;1.88 ;208\nn2-highmem-64 ;Ice Lake ;64;1,097,943 ;1.34 ;160\nn2-highmem-80 ;Ice Lake ;80;1,361,752 ;1.97 ;128\nn2-highmem-96 ;Ice Lake ;96;1,643,949 ;1.10 ;112\nn2-highmem-128 ;Ice Lake ;128;2,191,510 ;0.81 ;88\n;;;;;\nn2-highcpu-2 ;Ice Lake ;2;34,740 ;0.53 ;3688\nn2-highcpu-4 ;Ice Lake ;4;66,908 ;0.64 ;2328\nn2-highcpu-8 ;Ice Lake ;8;138,600 ;0.75 ;1208\nn2-highcpu-16 ;Ice Lake ;16;276,855 ;0.71 ;632\nn2-highcpu-32 ;Ice Lake ;32;550,940 ;1.60 ;312\nn2-highcpu-48 ;Ice Lake ;48;822,890 ;1.82 ;216\nn2-highcpu-64 ;Ice Lake ;64;1,100,249 ;1.18 ;160\nn2-highcpu-80 ;Ice Lake ;80;1,377,373 ;1.08 ;128\n;;;;;\nt2a-standard-1 ;Ampere ;1;23,509 ;0.29 ;5240\nt2a-standard-2 ;Ampere ;2;47,054 ;0.18 ;1846\nt2a-standard-4 ;Ampere ;4;94,096 ;0.20 ;1176\nt2a-standard-8 ;Ampere ;8;188,206 ;0.11 ;1168\nt2a-standard-16 ;Ampere ;16;375,477 ;0.15 ;308\nt2a-standard-32 ;Ampere ;32;748,166 ;0.11 ;160\nt2a-standard-48 ;Ampere ;48;1,118,158 ;0.17 ;680\n;;;;;\nt2d-standard-1 ;Milan ;1;29,363 ;1.43 ;5264\nt2d-standard-2 ;Milan ;2;59,889 ;1.06 ;1840\nt2d-standard-4 ;Milan ;4;119,587 ;0.98 ;1176\nt2d-standard-8 ;Milan ;8;238,534 ;1.06 ;596\nt2d-standard-16 ;Milan ;16;475,405 ;1.45 ;308\nt2d-standard-32 ;Milan ;32;945,524 ;1.88 ;160\nt2d-standard-48 ;Milan ;48;1,395,082 ;2.13 ;108\nt2d-standard-60 ;Milan ;60;1,667,024 ;1.00 ;88\n;;;;;\nn2d-standard-2 ;Milan ;2;41,092 ;0.94 ;3704\nn2d-standard-4 ;Milan ;4;80,098 ;1.29 ;2344\nn2d-standard-8 ;Milan ;8;163,858 ;1.01 ;1256\nn2d-standard-16 ;Milan ;16;327,484 ;0.93 ;664\nn2d-standard-32 ;Milan ;32;651,986 ;1.39 ;312\nn2d-standard-48 ;Milan ;48;967,312 ;3.54 ;280\nn2d-standard-64 ;Milan ;64;1,162,499 ;5.05 ;160\nn2d-standard-80 ;Milan ;80;1,425,708 ;4.12 ;128\nn2d-standard-96 ;Milan ;96;1,768,996 ;4.32 ;112\nn2d-standard-128 ;Milan ;128;2,305,562 ;4.48 ;144\nn2d-standard-224 ;Milan ;224;3,835,775 ;1.46 ;104\n;;;;;\nn2d-highmem-2 ;Milan ;2;41,073 ;1.04 ;3682\nn2d-highmem-4 ;Milan ;4;80,065 ;1.00 ;2344\nn2d-highmem-8 ;Milan ;8;163,486 ;1.36 ;1208\nn2d-highmem-16 ;Milan ;16;327,341 ;1.29 ;632\nn2d-highmem-32 ;Milan ;32;652,572 ;1.59 ;312\nn2d-highmem-48 ;Milan ;48;975,016 ;2.19 ;216\nn2d-highmem-64 ;Milan ;64;1,198,883 ;3.25 ;160\nn2d-highmem-80 ;Milan ;80;1,484,925 ;2.95 ;128\nn2d-highmem-96 ;Milan ;96;1,794,083 ;4.69 ;112\n;;;;;\nn2d-highcpu-2 ;Milan ;2;41,112 ;0.76 ;3696\nn2d-highcpu-4 ;Milan ;4;80,173 ;0.93 ;2352\nn2d-highcpu-8 ;Milan ;8;163,935 ;0.83 ;1192\nn2d-highcpu-16 ;Milan ;16;327,122 ;1.22 ;628\nn2d-highcpu-32 ;Milan ;32;654,523 ;0.82 ;320\nn2d-highcpu-48 ;Milan ;48;973,067 ;2.52 ;216\nn2d-highcpu-64 ;Milan ;64;1,174,712 ;4.22 ;160\nn2d-highcpu-80 ;Milan ;80;1,478,174 ;3.51 ;128\nn2d-highcpu-96 ;Milan ;96;1,801,312 ;4.94 ;112\n;;;;;\ne2-standard-2 ;Intel ;2;26,255 ;1.94 ;712\ne2-standard-4 ;Intel ;4;52,043 ;0.53 ;464\ne2-standard-8 ;Intel ;8;103,957 ;0.65 ;80\ne2-standard-16 ;Intel ;16;208,075 ;0.83 ;72\ne2-standard-32 ;Intel ;32;417,535 ;0.74 ;48\n;;;;;\ne2-highmem-2 ;Skylake ;2;26,243 ;1.20 ;696\ne2-highmem-4 ;Skylake ;4;51,736 ;0.88 ;472\ne2-highmem-8 ;Skylake ;8;104,083 ;0.63 ;128\ne2-highmem-16 ;Skylake ;16;208,433 ;0.72 ;56\n;;;;;\ne2-highcpu-2 ;Skylake ;2;26,092 ;1.39 ;592\ne2-highcpu-4 ;Skylake ;4;51,937 ;0.64 ;360\ne2-highcpu-8 ;Skylake ;8;104,080 ;0.65 ;128\ne2-highcpu-16 ;Skylake ;16;207,561 ;0.77 ;88\ne2-highcpu-32 ;Skylake ;32;416,599 ;0.86 ;32\n;;;;;\ne2-micro ;Skylake ;2;3,238 ;3.57 ;18,499\ne2-small ;Skylake ;2;6,745 ;4.32 ;18,614\ne2-medium ;Skylake ;2;14,529 ;6.35 ;18,423\n;;;;;\nm2-megamem-416 ;Cascade Lake ;416;6,193,999 ;2.50 ;1097\nm2-hypermem-416 ;Cascade Lake ;416;6,192,759 ;2.61 ;1107\nm2-ultramem-416 ;Cascade Lake ;416;6,205,665 ;2.04 ;1100\nm2-ultramem-208 ;Cascade Lake ;208;3,124,387 ;0.71 ;1141\n;;;;;\nm1-megamem-96 ;Skylake ;96;1,223,742 ;0.35 ;2264\nm1-ultramem-40 ;Broadwell ;40;516,435 ;0.27 ;2272\nm1-ultramem-80 ;Broadwell ;80;1,010,128 ;0.41 ;2280\nm1-ultramem-160 ;Broadwell ;160;2,015,006 ;0.56 ;2280\n;;;;;\nc2-standard-4 ;Cascade Lake ;4;73,269 ;0.65 ;1180\nc2-standard-8 ;Cascade Lake ;8;146,712 ;0.69 ;596\nc2-standard-16 ;Cascade Lake ;16;292,366 ;0.73 ;312\nc2-standard-30 ;Cascade Lake ;30;531,709 ;1.31 ;168\nc2-standard-60 ;Cascade Lake ;60;1,060,101 ;1.14 ;84\n;;;;;\nc2d-standard-2 ;Milan ;2;44,674 ;0.74 ;1832\nc2d-standard-4 ;Milan ;4;86,943 ;0.79 ;1176\nc2d-standard-8 ;Milan ;8;177,921 ;0.70 ;600\nc2d-standard-16 ;Milan ;16;354,249 ;0.88 ;312\nc2d-standard-32 ;Milan ;32;709,399 ;0.59 ;160\nc2d-standard-56 ;Milan ;56;1,244,451 ;0.48 ;92\nc2d-standard-112 ;Milan ;112;2,299,545 ;0.58 ;40\n;;;;;\nc2d-highmem-2 ;Milan ;2;44,649 ;0.88 ;1848\nc2d-highmem-4 ;Milan ;4;86,956 ;0.81 ;1176\nc2d-highmem-8 ;Milan ;8;177,882 ;0.77 ;596\nc2d-highmem-16 ;Milan ;16;354,656 ;0.89 ;317\nc2d-highmem-32 ;Milan ;32;709,754 ;0.63 ;160\nc2d-highmem-56 ;Milan ;56;1,242,783 ;0.43 ;92\nc2d-highmem-112 ;Milan ;112;2,294,226 ;0.78 ;40\n;;;;;\nc2d-highcpu-2 ;Milan ;2;44,678 ;0.74 ;1844\nc2d-highcpu-4 ;Milan ;4;86,953 ;0.72 ;1176\nc2d-highcpu-8 ;Milan ;8;177,774 ;0.81 ;596\nc2d-highcpu-16 ;Milan ;16;354,771 ;0.79 ;308\nc2d-highcpu-32 ;Milan ;32;710,036 ;0.62 ;160\nc2d-highcpu-56 ;Milan ;56;1,244,008 ;0.56 ;92\nc2d-highcpu-112 ;Milan ;112;2,299,260 ;0.37 ;40\n;;;;;\nn1-standard-1 ;Skylake ;1;20,060 ;0.78 ;10434\nn1-standard-2 ;Skylake ;2;26,293 ;0.72 ;3696\nn1-standard-4 ;Skylake ;4;52,091 ;0.74 ;2368\nn1-standard-8 ;Skylake ;8;104,161 ;0.56 ;1200\nn1-standard-16 ;Skylake ;16;208,193 ;0.58 ;624\nn1-standard-32 ;Skylake ;32;414,412 ;1.54 ;320\nn1-standard-64 ;Skylake ;64;812,905 ;3.64 ;160\nn1-standard-96 ;Skylake ;96;1,231,358 ;0.49 ;112\n;;;;;\nn1-highmem-2 ;Skylake ;2;26,293 ;0.65 ;3688\nn1-highmem-4 ;Skylake ;4;52,095 ;0.66 ;2344\nn1-highmem-8 ;Skylake ;8;104,145 ;0.84 ;1200\nn1-highmem-16 ;Skylake ;16;208,446 ;0.55 ;616\nn1-highmem-32 ;Skylake ;32;415,396 ;0.75 ;320\nn1-highmem-64 ;Skylake ;64;817,050 ;0.88 ;160\nn1-highmem-96 ;Skylake ;96;1,233,066 ;0.53 ;112\n;;;;;\nn1-highcpu-2 ;Skylake ;2;26,348 ;0.58 ;3696\nn1-highcpu-4 ;Skylake ;4;52,108 ;0.58 ;2352\nn1-highcpu-8 ;Skylake ;8;104,238 ;0.60 ;1192\nn1-highcpu-16 ;Skylake ;16;207,968 ;0.60 ;640\nn1-highcpu-32 ;Skylake ;32;414,526 ;1.27 ;320\nn1-highcpu-64 ;Skylake ;64;815,329 ;0.86 ;160\nn1-highcpu-96 ;Skylake ;96;1,232,561 ;0.30 ;112\n;;;;;\nf1-micro ;Skylake ;1;3,949 ;3.24 ;2318\ng1-small ;Skylake ;1;10,191 ;2.94 ;2256\n;;;;;\na2-highgpu-1g;Cascade Lake ;12;171,520 ;0.45 ;4\na2-highgpu-2g;Cascade Lake ;24;359,881 ;0.33 ;4\na2-highgpu-4g;Cascade Lake ;48;646,934 ;0.27 ;4\na2-highgpu-8g ;Cascade Lake ;96 ;1,269,327 ;0.76 ;8\n;;;;;\na2-megagpu-16g;Cascade Lake ;96 ;1,258,852 ;6.56 ;172\n;;;;;\nn4-standard-2 ;Emerald Rapids ;2;44,377 ;0.26 ;80\nn4-standard-4 ;Emerald Rapids ;4;86,569 ;0.61 ;84\nn4-standard-8 ;Emerald Rapids ;8;177,655 ;0.29 ;88\nn4-standard-16 ;Emerald Rapids ;16;354,249 ;0.29 ;81\nn4-standard-32 ;Emerald Rapids ;32;706,433 ;0.28 ;80\nn4-standard-48 ;Emerald Rapids ;48;1,057,781 ;2.09 ;84\nn4-standard-64 ;Emerald Rapids ;64;1,351,294 ;2.44 ;84\nn4-standard-80 ;Emerald Rapids ;80;1,626,413 ;3.18 ;84\n;;;;;\nn4-highcpu-2 ;Emerald Rapids ;2;44,397 ;0.26 ;80\nn4-highcpu-4 ;Emerald Rapids ;4;86,649 ;0.58 ;80\nn4-highcpu-8 ;Emerald Rapids ;8;177,628 ;0.29 ;87\nn4-highcpu-16 ;Emerald Rapids ;16;354,814 ;0.29 ;84\nn4-highcpu-32 ;Emerald Rapids ;32;707,229 ;0.30 ;80\nn4-highcpu-48 ;Emerald Rapids ;48;1,058,224 ;0.19 ;88\nn4-highcpu-64 ;Emerald Rapids ;64;1,351,265 ;1.23 ;80\nn4-highcpu-80 ;Emerald Rapids ;80;1,651,766 ;0.87 ;84\n;;;;;\nn4-highmem-2 ;Emerald Rapids ;2;44,371 ;2.22 ;84\nn4-highmem-4 ;Emerald Rapids ;4;86,305 ;0.89 ;80\nn4-highmem-8 ;Emerald Rapids ;8;177,336 ;3.06 ;80\nn4-highmem-16 ;Emerald Rapids ;16;354,343 ;3.61 ;84\nn4-highmem-32 ;Emerald Rapids ;32;704,876 ;2.13 ;84\nn4-highmem-48 ;Emerald Rapids ;48;1,027,463 ;2.89 ;80\nn4-highmem-64 ;Emerald Rapids ;64;1,256,257 ;3.45 ;84\nn4-highmem-80 ;Emerald Rapids ;80;1,536,069 ;2.82 ;80\n;;;;;\nc3d-standard-4 ;Genoa ;4;94,572 ;0.78 ;1732\nc3d-standard-8 ;Genoa ;8;192,584 ;0.72 ;1168\nc3d-standard-16 ;Genoa ;16;384,420 ;0.97 ;884\nc3d-standard-30 ;Genoa ;30;681,460 ;0.94 ;752\nc3d-standard-60 ;Genoa ;60;1,360,072 ;1.18 ;659\nc3d-standard-90 ;Genoa ;90;2,138,141 ;1.18 ;616\nc3d-standard-180 ;Genoa ;180;3,905,736 ;1.83 ;552\nc3d-standard-360 ;Genoa ;360;8,026,988 ;0.88 ;60\n;;;;;\nc3d-highcpu-4 ;Genoa ;4;94,611 ;0.46 ;1168\nc3d-highcpu-8 ;Genoa ;8;192,661 ;0.51 ;592\nc3d-highcpu-16 ;Genoa ;16;384,658 ;0.75 ;304\nc3d-highcpu-30 ;Genoa ;30;682,826 ;0.48 ;168\nc3d-highcpu-60 ;Genoa ;60;1,363,944 ;0.47 ;84\nc3d-highcpu-90 ;Genoa ;90;2,149,508 ;0.30 ;64\nc3d-highcpu-180 ;Genoa ;180;3,940,383 ;1.44 ;28\nc3d-highcpu-360 ;Genoa ;360;7,977,725 ;1.41 ;16\n;;;;;\nc3d-highmem-4 ;Genoa ;4;94,477 ;0.49 ;304\nc3d-highmem-8 ;Genoa ;8;192,283 ;0.66 ;164\nc3d-highmem-16 ;Genoa ;16;384,623 ;0.67 ;88\nc3d-highmem-30 ;Genoa ;30;681,272 ;0.85 ;44\nc3d-highmem-60 ;Genoa ;60;1,364,173 ;0.55 ;24\nc3d-highmem-90 ;Genoa ;90;2,143,972 ;0.57 ;16\nc3d-highmem-180 ;Genoa ;180;3,958,388 ;1.13 ;8\nc3d-highmem-360 ;Genoa ;360;8,069,686 ;0.17 ;4\n;;;;;\nc3-standard-4 ;Sapphire Rapids ;4;80,609 ;0.39 ;1180\nc3-standard-8 ;Sapphire Rapids ;8;160,341 ;0.32 ;1116\nc3-standard-22 ;Sapphire Rapids ;22;440,662 ;0.34 ;252\nc3-standard-44 ;Sapphire Rapids ;44;878,867 ;0.80 ;612\nc3-standard-88 ;Sapphire Rapids ;88;1,691,035 ;1.18 ;528\nc3-standard-176 ;Sapphire Rapids ;176;3,377,967 ;0.91 ;484\n;;;;;\nc3-highcpu-4 ;Sapphire Rapids ;4;80,641 ;0.47 ;1176\nc3-highcpu-8 ;Sapphire Rapids ;8;160,329 ;0.48 ;600\nc3-highcpu-22 ;Sapphire Rapids ;22;441,164 ;0.29 ;224\nc3-highcpu-44 ;Sapphire Rapids ;44;880,832 ;0.87 ;112\nc3-highcpu-88 ;Sapphire Rapids ;88;1,696,613 ;1.07 ;56\nc3-highcpu-176 ;Sapphire Rapids ;176;3,388,373 ;0.62 ;28\n;;;;;\nc3-highmem-4 ;Sapphire Rapids ;4;80,742 ;0.44 ;1200\nc3-highmem-8 ;Sapphire Rapids ;8;160,478 ;0.29 ;612\nc3-highmem-22 ;Sapphire Rapids ;22;441,229 ;0.21 ;252\nc3-highmem-44 ;Sapphire Rapids ;44;877,637 ;1.12 ;136\nc3-highmem-88 ;Sapphire Rapids ;88;1,689,147 ;1.48 ;72\nc3-highmem-176 ;Sapphire Rapids ;176;3,347,332 ;1.44 ;56\n;;;;;\nm3-ultramem-32;Ice Lake ;32;556,066 ;0.22 ;1020\nm3-ultramem-64;Ice Lake ;64;1,101,308 ;0.73 ;1144\nm3-ultramem-128;Ice Lake ;128;2,190,379 ;0.62 ;1128\n;;;;;\nm3-megamem-64;Ice Lake ;64;1,094,465 ;0.98 ;1132\nm3-megamem-128;Ice Lake ;128;2,182,236 ;0.89 ;1144\n;;;;;\nz3-highmem-88 ;Sapphire Rapids ;88;1,691,169 ;1.02 ;84\nz3-highmem-176 ;Sapphire Rapids ;176;3,373,295 ;0.97 ;88\n;;;;;\ng2-standard-4 ;Cascade Lake ;4;56,273 ;0.66 ;88\ng2-standard-8 ;Cascade Lake ;8;111,997 ;0.64 ;48\ng2-standard-12 ;Cascade Lake ;12;167,604 ;0.52 ;36\ng2-standard-16 ;Cascade Lake ;16;223,514 ;0.51 ;28\ng2-standard-24 ;Cascade Lake ;24;334,411 ;0.53 ;20\ng2-standard-32 ;Cascade Lake ;32;446,322 ;0.64 ;16\ng2-standard-48 ;Cascade Lake ;48;656,106 ;2.97 ;12\ng2-standard-96 ;Cascade Lake ;96;1,249,876 ;0.20 ;8\n"
  },
  {
    "path": "instances/series/cpu/coremark.pl",
    "content": "#!/usr/bin/env perl\n\n# Copyright 2022 Nils Knieling. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nuse strict;\nuse DBI;\n\nmy $dbh = DBI->connect(\"dbi:CSV:\", undef, undef, {\n\tf_ext        => \".csv/r\",\n\tcsv_sep_char => \";\",\n\tcsv_class    => \"Text::CSV_XS\",\n\tRaiseError   => 1,\n}) or die \"ERROR: Cannot connect $DBI::errstr\\n\";\n\nmy $sth = $dbh->prepare(\"SELECT MACHINE_TYPE, COREMARK_SCORE, STANDARD_DEVIATION, SAMPLE_COUNT FROM coremark\");\n$sth->execute();\n$sth->bind_columns(\\my ($name, $coremarkScore, $standardDeviation, $sampleCount));\nprint \"/*\\n\";\nprint \" * GENERATED WITH coremark.pl\\n\";\nprint \" * Please see: https://github.com/Cyclenerd/google-cloud-compute-machine-types/blob/master/instances/series/cpu/README.md\\n\";\nprint \" */\\n\";\nwhile ($sth->fetch) {\n\tif ($name) {\n\t\t$name =~ s/^\\s//;\n\t\t$name =~ s/\\s$//;\n\t\t$coremarkScore =~ s/,//g;\n\t\t$coremarkScore =~ s/\\s//g;\n\t\t$sampleCount   =~ s/,//g;\n\t\t$sampleCount   =~ s/\\s//g;\n\t\tprint \"UPDATE instances SET coremarkScore = '$coremarkScore', standardDeviation = '$standardDeviation', sampleCount = '$sampleCount' WHERE name LIKE '$name';\\n\";\n\t}\n}\n$dbh->disconnect;"
  },
  {
    "path": "instances/series/cpu/coremark.sql",
    "content": "/*\n * GENERATED WITH coremark.pl\n * Please see: https://github.com/Cyclenerd/google-cloud-compute-machine-types/blob/master/instances/series/cpu/README.md\n */\nUPDATE instances SET coremarkScore = '34735', standardDeviation = '0.53 ', sampleCount = '3672' WHERE name LIKE 'n2-standard-2';\nUPDATE instances SET coremarkScore = '66884', standardDeviation = '0.61 ', sampleCount = '2336' WHERE name LIKE 'n2-standard-4';\nUPDATE instances SET coremarkScore = '138567', standardDeviation = '0.67 ', sampleCount = '1592' WHERE name LIKE 'n2-standard-8';\nUPDATE instances SET coremarkScore = '277010', standardDeviation = '0.72 ', sampleCount = '616' WHERE name LIKE 'n2-standard-16';\nUPDATE instances SET coremarkScore = '553662', standardDeviation = '0.77 ', sampleCount = '312' WHERE name LIKE 'n2-standard-32';\nUPDATE instances SET coremarkScore = '824915', standardDeviation = '1.18 ', sampleCount = '216' WHERE name LIKE 'n2-standard-48';\nUPDATE instances SET coremarkScore = '1091008', standardDeviation = '1.34 ', sampleCount = '168' WHERE name LIKE 'n2-standard-64';\nUPDATE instances SET coremarkScore = '1365998', standardDeviation = '1.53 ', sampleCount = '128' WHERE name LIKE 'n2-standard-80';\nUPDATE instances SET coremarkScore = '1651980', standardDeviation = '0.93 ', sampleCount = '112' WHERE name LIKE 'n2-standard-96';\nUPDATE instances SET coremarkScore = '2169248', standardDeviation = '2.33 ', sampleCount = '88' WHERE name LIKE 'n2-standard-128';\nUPDATE instances SET coremarkScore = '34695', standardDeviation = '0.82 ', sampleCount = '3688' WHERE name LIKE 'n2-highmem-2';\nUPDATE instances SET coremarkScore = '66798', standardDeviation = '0.60 ', sampleCount = '2344' WHERE name LIKE 'n2-highmem-4';\nUPDATE instances SET coremarkScore = '138406', standardDeviation = '0.79 ', sampleCount = '1192' WHERE name LIKE 'n2-highmem-8';\nUPDATE instances SET coremarkScore = '276327', standardDeviation = '0.91 ', sampleCount = '624' WHERE name LIKE 'n2-highmem-16';\nUPDATE instances SET coremarkScore = '550448', standardDeviation = '1.23 ', sampleCount = '320' WHERE name LIKE 'n2-highmem-32';\nUPDATE instances SET coremarkScore = '814034', standardDeviation = '1.88 ', sampleCount = '208' WHERE name LIKE 'n2-highmem-48';\nUPDATE instances SET coremarkScore = '1097943', standardDeviation = '1.34 ', sampleCount = '160' WHERE name LIKE 'n2-highmem-64';\nUPDATE instances SET coremarkScore = '1361752', standardDeviation = '1.97 ', sampleCount = '128' WHERE name LIKE 'n2-highmem-80';\nUPDATE instances SET coremarkScore = '1643949', standardDeviation = '1.10 ', sampleCount = '112' WHERE name LIKE 'n2-highmem-96';\nUPDATE instances SET coremarkScore = '2191510', standardDeviation = '0.81 ', sampleCount = '88' WHERE name LIKE 'n2-highmem-128';\nUPDATE instances SET coremarkScore = '34740', standardDeviation = '0.53 ', sampleCount = '3688' WHERE name LIKE 'n2-highcpu-2';\nUPDATE instances SET coremarkScore = '66908', standardDeviation = '0.64 ', sampleCount = '2328' WHERE name LIKE 'n2-highcpu-4';\nUPDATE instances SET coremarkScore = '138600', standardDeviation = '0.75 ', sampleCount = '1208' WHERE name LIKE 'n2-highcpu-8';\nUPDATE instances SET coremarkScore = '276855', standardDeviation = '0.71 ', sampleCount = '632' WHERE name LIKE 'n2-highcpu-16';\nUPDATE instances SET coremarkScore = '550940', standardDeviation = '1.60 ', sampleCount = '312' WHERE name LIKE 'n2-highcpu-32';\nUPDATE instances SET coremarkScore = '822890', standardDeviation = '1.82 ', sampleCount = '216' WHERE name LIKE 'n2-highcpu-48';\nUPDATE instances SET coremarkScore = '1100249', standardDeviation = '1.18 ', sampleCount = '160' WHERE name LIKE 'n2-highcpu-64';\nUPDATE instances SET coremarkScore = '1377373', standardDeviation = '1.08 ', sampleCount = '128' WHERE name LIKE 'n2-highcpu-80';\nUPDATE instances SET coremarkScore = '23509', standardDeviation = '0.29 ', sampleCount = '5240' WHERE name LIKE 't2a-standard-1';\nUPDATE instances SET coremarkScore = '47054', standardDeviation = '0.18 ', sampleCount = '1846' WHERE name LIKE 't2a-standard-2';\nUPDATE instances SET coremarkScore = '94096', standardDeviation = '0.20 ', sampleCount = '1176' WHERE name LIKE 't2a-standard-4';\nUPDATE instances SET coremarkScore = '188206', standardDeviation = '0.11 ', sampleCount = '1168' WHERE name LIKE 't2a-standard-8';\nUPDATE instances SET coremarkScore = '375477', standardDeviation = '0.15 ', sampleCount = '308' WHERE name LIKE 't2a-standard-16';\nUPDATE instances SET coremarkScore = '748166', standardDeviation = '0.11 ', sampleCount = '160' WHERE name LIKE 't2a-standard-32';\nUPDATE instances SET coremarkScore = '1118158', standardDeviation = '0.17 ', sampleCount = '680' WHERE name LIKE 't2a-standard-48';\nUPDATE instances SET coremarkScore = '29363', standardDeviation = '1.43 ', sampleCount = '5264' WHERE name LIKE 't2d-standard-1';\nUPDATE instances SET coremarkScore = '59889', standardDeviation = '1.06 ', sampleCount = '1840' WHERE name LIKE 't2d-standard-2';\nUPDATE instances SET coremarkScore = '119587', standardDeviation = '0.98 ', sampleCount = '1176' WHERE name LIKE 't2d-standard-4';\nUPDATE instances SET coremarkScore = '238534', standardDeviation = '1.06 ', sampleCount = '596' WHERE name LIKE 't2d-standard-8';\nUPDATE instances SET coremarkScore = '475405', standardDeviation = '1.45 ', sampleCount = '308' WHERE name LIKE 't2d-standard-16';\nUPDATE instances SET coremarkScore = '945524', standardDeviation = '1.88 ', sampleCount = '160' WHERE name LIKE 't2d-standard-32';\nUPDATE instances SET coremarkScore = '1395082', standardDeviation = '2.13 ', sampleCount = '108' WHERE name LIKE 't2d-standard-48';\nUPDATE instances SET coremarkScore = '1667024', standardDeviation = '1.00 ', sampleCount = '88' WHERE name LIKE 't2d-standard-60';\nUPDATE instances SET coremarkScore = '41092', standardDeviation = '0.94 ', sampleCount = '3704' WHERE name LIKE 'n2d-standard-2';\nUPDATE instances SET coremarkScore = '80098', standardDeviation = '1.29 ', sampleCount = '2344' WHERE name LIKE 'n2d-standard-4';\nUPDATE instances SET coremarkScore = '163858', standardDeviation = '1.01 ', sampleCount = '1256' WHERE name LIKE 'n2d-standard-8';\nUPDATE instances SET coremarkScore = '327484', standardDeviation = '0.93 ', sampleCount = '664' WHERE name LIKE 'n2d-standard-16';\nUPDATE instances SET coremarkScore = '651986', standardDeviation = '1.39 ', sampleCount = '312' WHERE name LIKE 'n2d-standard-32';\nUPDATE instances SET coremarkScore = '967312', standardDeviation = '3.54 ', sampleCount = '280' WHERE name LIKE 'n2d-standard-48';\nUPDATE instances SET coremarkScore = '1162499', standardDeviation = '5.05 ', sampleCount = '160' WHERE name LIKE 'n2d-standard-64';\nUPDATE instances SET coremarkScore = '1425708', standardDeviation = '4.12 ', sampleCount = '128' WHERE name LIKE 'n2d-standard-80';\nUPDATE instances SET coremarkScore = '1768996', standardDeviation = '4.32 ', sampleCount = '112' WHERE name LIKE 'n2d-standard-96';\nUPDATE instances SET coremarkScore = '2305562', standardDeviation = '4.48 ', sampleCount = '144' WHERE name LIKE 'n2d-standard-128';\nUPDATE instances SET coremarkScore = '3835775', standardDeviation = '1.46 ', sampleCount = '104' WHERE name LIKE 'n2d-standard-224';\nUPDATE instances SET coremarkScore = '41073', standardDeviation = '1.04 ', sampleCount = '3682' WHERE name LIKE 'n2d-highmem-2';\nUPDATE instances SET coremarkScore = '80065', standardDeviation = '1.00 ', sampleCount = '2344' WHERE name LIKE 'n2d-highmem-4';\nUPDATE instances SET coremarkScore = '163486', standardDeviation = '1.36 ', sampleCount = '1208' WHERE name LIKE 'n2d-highmem-8';\nUPDATE instances SET coremarkScore = '327341', standardDeviation = '1.29 ', sampleCount = '632' WHERE name LIKE 'n2d-highmem-16';\nUPDATE instances SET coremarkScore = '652572', standardDeviation = '1.59 ', sampleCount = '312' WHERE name LIKE 'n2d-highmem-32';\nUPDATE instances SET coremarkScore = '975016', standardDeviation = '2.19 ', sampleCount = '216' WHERE name LIKE 'n2d-highmem-48';\nUPDATE instances SET coremarkScore = '1198883', standardDeviation = '3.25 ', sampleCount = '160' WHERE name LIKE 'n2d-highmem-64';\nUPDATE instances SET coremarkScore = '1484925', standardDeviation = '2.95 ', sampleCount = '128' WHERE name LIKE 'n2d-highmem-80';\nUPDATE instances SET coremarkScore = '1794083', standardDeviation = '4.69 ', sampleCount = '112' WHERE name LIKE 'n2d-highmem-96';\nUPDATE instances SET coremarkScore = '41112', standardDeviation = '0.76 ', sampleCount = '3696' WHERE name LIKE 'n2d-highcpu-2';\nUPDATE instances SET coremarkScore = '80173', standardDeviation = '0.93 ', sampleCount = '2352' WHERE name LIKE 'n2d-highcpu-4';\nUPDATE instances SET coremarkScore = '163935', standardDeviation = '0.83 ', sampleCount = '1192' WHERE name LIKE 'n2d-highcpu-8';\nUPDATE instances SET coremarkScore = '327122', standardDeviation = '1.22 ', sampleCount = '628' WHERE name LIKE 'n2d-highcpu-16';\nUPDATE instances SET coremarkScore = '654523', standardDeviation = '0.82 ', sampleCount = '320' WHERE name LIKE 'n2d-highcpu-32';\nUPDATE instances SET coremarkScore = '973067', standardDeviation = '2.52 ', sampleCount = '216' WHERE name LIKE 'n2d-highcpu-48';\nUPDATE instances SET coremarkScore = '1174712', standardDeviation = '4.22 ', sampleCount = '160' WHERE name LIKE 'n2d-highcpu-64';\nUPDATE instances SET coremarkScore = '1478174', standardDeviation = '3.51 ', sampleCount = '128' WHERE name LIKE 'n2d-highcpu-80';\nUPDATE instances SET coremarkScore = '1801312', standardDeviation = '4.94 ', sampleCount = '112' WHERE name LIKE 'n2d-highcpu-96';\nUPDATE instances SET coremarkScore = '26255', standardDeviation = '1.94 ', sampleCount = '712' WHERE name LIKE 'e2-standard-2';\nUPDATE instances SET coremarkScore = '52043', standardDeviation = '0.53 ', sampleCount = '464' WHERE name LIKE 'e2-standard-4';\nUPDATE instances SET coremarkScore = '103957', standardDeviation = '0.65 ', sampleCount = '80' WHERE name LIKE 'e2-standard-8';\nUPDATE instances SET coremarkScore = '208075', standardDeviation = '0.83 ', sampleCount = '72' WHERE name LIKE 'e2-standard-16';\nUPDATE instances SET coremarkScore = '417535', standardDeviation = '0.74 ', sampleCount = '48' WHERE name LIKE 'e2-standard-32';\nUPDATE instances SET coremarkScore = '26243', standardDeviation = '1.20 ', sampleCount = '696' WHERE name LIKE 'e2-highmem-2';\nUPDATE instances SET coremarkScore = '51736', standardDeviation = '0.88 ', sampleCount = '472' WHERE name LIKE 'e2-highmem-4';\nUPDATE instances SET coremarkScore = '104083', standardDeviation = '0.63 ', sampleCount = '128' WHERE name LIKE 'e2-highmem-8';\nUPDATE instances SET coremarkScore = '208433', standardDeviation = '0.72 ', sampleCount = '56' WHERE name LIKE 'e2-highmem-16';\nUPDATE instances SET coremarkScore = '26092', standardDeviation = '1.39 ', sampleCount = '592' WHERE name LIKE 'e2-highcpu-2';\nUPDATE instances SET coremarkScore = '51937', standardDeviation = '0.64 ', sampleCount = '360' WHERE name LIKE 'e2-highcpu-4';\nUPDATE instances SET coremarkScore = '104080', standardDeviation = '0.65 ', sampleCount = '128' WHERE name LIKE 'e2-highcpu-8';\nUPDATE instances SET coremarkScore = '207561', standardDeviation = '0.77 ', sampleCount = '88' WHERE name LIKE 'e2-highcpu-16';\nUPDATE instances SET coremarkScore = '416599', standardDeviation = '0.86 ', sampleCount = '32' WHERE name LIKE 'e2-highcpu-32';\nUPDATE instances SET coremarkScore = '3238', standardDeviation = '3.57 ', sampleCount = '18499' WHERE name LIKE 'e2-micro';\nUPDATE instances SET coremarkScore = '6745', standardDeviation = '4.32 ', sampleCount = '18614' WHERE name LIKE 'e2-small';\nUPDATE instances SET coremarkScore = '14529', standardDeviation = '6.35 ', sampleCount = '18423' WHERE name LIKE 'e2-medium';\nUPDATE instances SET coremarkScore = '6193999', standardDeviation = '2.50 ', sampleCount = '1097' WHERE name LIKE 'm2-megamem-416';\nUPDATE instances SET coremarkScore = '6192759', standardDeviation = '2.61 ', sampleCount = '1107' WHERE name LIKE 'm2-hypermem-416';\nUPDATE instances SET coremarkScore = '6205665', standardDeviation = '2.04 ', sampleCount = '1100' WHERE name LIKE 'm2-ultramem-416';\nUPDATE instances SET coremarkScore = '3124387', standardDeviation = '0.71 ', sampleCount = '1141' WHERE name LIKE 'm2-ultramem-208';\nUPDATE instances SET coremarkScore = '1223742', standardDeviation = '0.35 ', sampleCount = '2264' WHERE name LIKE 'm1-megamem-96';\nUPDATE instances SET coremarkScore = '516435', standardDeviation = '0.27 ', sampleCount = '2272' WHERE name LIKE 'm1-ultramem-40';\nUPDATE instances SET coremarkScore = '1010128', standardDeviation = '0.41 ', sampleCount = '2280' WHERE name LIKE 'm1-ultramem-80';\nUPDATE instances SET coremarkScore = '2015006', standardDeviation = '0.56 ', sampleCount = '2280' WHERE name LIKE 'm1-ultramem-160';\nUPDATE instances SET coremarkScore = '73269', standardDeviation = '0.65 ', sampleCount = '1180' WHERE name LIKE 'c2-standard-4';\nUPDATE instances SET coremarkScore = '146712', standardDeviation = '0.69 ', sampleCount = '596' WHERE name LIKE 'c2-standard-8';\nUPDATE instances SET coremarkScore = '292366', standardDeviation = '0.73 ', sampleCount = '312' WHERE name LIKE 'c2-standard-16';\nUPDATE instances SET coremarkScore = '531709', standardDeviation = '1.31 ', sampleCount = '168' WHERE name LIKE 'c2-standard-30';\nUPDATE instances SET coremarkScore = '1060101', standardDeviation = '1.14 ', sampleCount = '84' WHERE name LIKE 'c2-standard-60';\nUPDATE instances SET coremarkScore = '44674', standardDeviation = '0.74 ', sampleCount = '1832' WHERE name LIKE 'c2d-standard-2';\nUPDATE instances SET coremarkScore = '86943', standardDeviation = '0.79 ', sampleCount = '1176' WHERE name LIKE 'c2d-standard-4';\nUPDATE instances SET coremarkScore = '177921', standardDeviation = '0.70 ', sampleCount = '600' WHERE name LIKE 'c2d-standard-8';\nUPDATE instances SET coremarkScore = '354249', standardDeviation = '0.88 ', sampleCount = '312' WHERE name LIKE 'c2d-standard-16';\nUPDATE instances SET coremarkScore = '709399', standardDeviation = '0.59 ', sampleCount = '160' WHERE name LIKE 'c2d-standard-32';\nUPDATE instances SET coremarkScore = '1244451', standardDeviation = '0.48 ', sampleCount = '92' WHERE name LIKE 'c2d-standard-56';\nUPDATE instances SET coremarkScore = '2299545', standardDeviation = '0.58 ', sampleCount = '40' WHERE name LIKE 'c2d-standard-112';\nUPDATE instances SET coremarkScore = '44649', standardDeviation = '0.88 ', sampleCount = '1848' WHERE name LIKE 'c2d-highmem-2';\nUPDATE instances SET coremarkScore = '86956', standardDeviation = '0.81 ', sampleCount = '1176' WHERE name LIKE 'c2d-highmem-4';\nUPDATE instances SET coremarkScore = '177882', standardDeviation = '0.77 ', sampleCount = '596' WHERE name LIKE 'c2d-highmem-8';\nUPDATE instances SET coremarkScore = '354656', standardDeviation = '0.89 ', sampleCount = '317' WHERE name LIKE 'c2d-highmem-16';\nUPDATE instances SET coremarkScore = '709754', standardDeviation = '0.63 ', sampleCount = '160' WHERE name LIKE 'c2d-highmem-32';\nUPDATE instances SET coremarkScore = '1242783', standardDeviation = '0.43 ', sampleCount = '92' WHERE name LIKE 'c2d-highmem-56';\nUPDATE instances SET coremarkScore = '2294226', standardDeviation = '0.78 ', sampleCount = '40' WHERE name LIKE 'c2d-highmem-112';\nUPDATE instances SET coremarkScore = '44678', standardDeviation = '0.74 ', sampleCount = '1844' WHERE name LIKE 'c2d-highcpu-2';\nUPDATE instances SET coremarkScore = '86953', standardDeviation = '0.72 ', sampleCount = '1176' WHERE name LIKE 'c2d-highcpu-4';\nUPDATE instances SET coremarkScore = '177774', standardDeviation = '0.81 ', sampleCount = '596' WHERE name LIKE 'c2d-highcpu-8';\nUPDATE instances SET coremarkScore = '354771', standardDeviation = '0.79 ', sampleCount = '308' WHERE name LIKE 'c2d-highcpu-16';\nUPDATE instances SET coremarkScore = '710036', standardDeviation = '0.62 ', sampleCount = '160' WHERE name LIKE 'c2d-highcpu-32';\nUPDATE instances SET coremarkScore = '1244008', standardDeviation = '0.56 ', sampleCount = '92' WHERE name LIKE 'c2d-highcpu-56';\nUPDATE instances SET coremarkScore = '2299260', standardDeviation = '0.37 ', sampleCount = '40' WHERE name LIKE 'c2d-highcpu-112';\nUPDATE instances SET coremarkScore = '20060', standardDeviation = '0.78 ', sampleCount = '10434' WHERE name LIKE 'n1-standard-1';\nUPDATE instances SET coremarkScore = '26293', standardDeviation = '0.72 ', sampleCount = '3696' WHERE name LIKE 'n1-standard-2';\nUPDATE instances SET coremarkScore = '52091', standardDeviation = '0.74 ', sampleCount = '2368' WHERE name LIKE 'n1-standard-4';\nUPDATE instances SET coremarkScore = '104161', standardDeviation = '0.56 ', sampleCount = '1200' WHERE name LIKE 'n1-standard-8';\nUPDATE instances SET coremarkScore = '208193', standardDeviation = '0.58 ', sampleCount = '624' WHERE name LIKE 'n1-standard-16';\nUPDATE instances SET coremarkScore = '414412', standardDeviation = '1.54 ', sampleCount = '320' WHERE name LIKE 'n1-standard-32';\nUPDATE instances SET coremarkScore = '812905', standardDeviation = '3.64 ', sampleCount = '160' WHERE name LIKE 'n1-standard-64';\nUPDATE instances SET coremarkScore = '1231358', standardDeviation = '0.49 ', sampleCount = '112' WHERE name LIKE 'n1-standard-96';\nUPDATE instances SET coremarkScore = '26293', standardDeviation = '0.65 ', sampleCount = '3688' WHERE name LIKE 'n1-highmem-2';\nUPDATE instances SET coremarkScore = '52095', standardDeviation = '0.66 ', sampleCount = '2344' WHERE name LIKE 'n1-highmem-4';\nUPDATE instances SET coremarkScore = '104145', standardDeviation = '0.84 ', sampleCount = '1200' WHERE name LIKE 'n1-highmem-8';\nUPDATE instances SET coremarkScore = '208446', standardDeviation = '0.55 ', sampleCount = '616' WHERE name LIKE 'n1-highmem-16';\nUPDATE instances SET coremarkScore = '415396', standardDeviation = '0.75 ', sampleCount = '320' WHERE name LIKE 'n1-highmem-32';\nUPDATE instances SET coremarkScore = '817050', standardDeviation = '0.88 ', sampleCount = '160' WHERE name LIKE 'n1-highmem-64';\nUPDATE instances SET coremarkScore = '1233066', standardDeviation = '0.53 ', sampleCount = '112' WHERE name LIKE 'n1-highmem-96';\nUPDATE instances SET coremarkScore = '26348', standardDeviation = '0.58 ', sampleCount = '3696' WHERE name LIKE 'n1-highcpu-2';\nUPDATE instances SET coremarkScore = '52108', standardDeviation = '0.58 ', sampleCount = '2352' WHERE name LIKE 'n1-highcpu-4';\nUPDATE instances SET coremarkScore = '104238', standardDeviation = '0.60 ', sampleCount = '1192' WHERE name LIKE 'n1-highcpu-8';\nUPDATE instances SET coremarkScore = '207968', standardDeviation = '0.60 ', sampleCount = '640' WHERE name LIKE 'n1-highcpu-16';\nUPDATE instances SET coremarkScore = '414526', standardDeviation = '1.27 ', sampleCount = '320' WHERE name LIKE 'n1-highcpu-32';\nUPDATE instances SET coremarkScore = '815329', standardDeviation = '0.86 ', sampleCount = '160' WHERE name LIKE 'n1-highcpu-64';\nUPDATE instances SET coremarkScore = '1232561', standardDeviation = '0.30 ', sampleCount = '112' WHERE name LIKE 'n1-highcpu-96';\nUPDATE instances SET coremarkScore = '3949', standardDeviation = '3.24 ', sampleCount = '2318' WHERE name LIKE 'f1-micro';\nUPDATE instances SET coremarkScore = '10191', standardDeviation = '2.94 ', sampleCount = '2256' WHERE name LIKE 'g1-small';\nUPDATE instances SET coremarkScore = '171520', standardDeviation = '0.45 ', sampleCount = '4' WHERE name LIKE 'a2-highgpu-1g';\nUPDATE instances SET coremarkScore = '359881', standardDeviation = '0.33 ', sampleCount = '4' WHERE name LIKE 'a2-highgpu-2g';\nUPDATE instances SET coremarkScore = '646934', standardDeviation = '0.27 ', sampleCount = '4' WHERE name LIKE 'a2-highgpu-4g';\nUPDATE instances SET coremarkScore = '1269327', standardDeviation = '0.76 ', sampleCount = '8' WHERE name LIKE 'a2-highgpu-8g';\nUPDATE instances SET coremarkScore = '1258852', standardDeviation = '6.56 ', sampleCount = '172' WHERE name LIKE 'a2-megagpu-16g';\nUPDATE instances SET coremarkScore = '44377', standardDeviation = '0.26 ', sampleCount = '80' WHERE name LIKE 'n4-standard-2';\nUPDATE instances SET coremarkScore = '86569', standardDeviation = '0.61 ', sampleCount = '84' WHERE name LIKE 'n4-standard-4';\nUPDATE instances SET coremarkScore = '177655', standardDeviation = '0.29 ', sampleCount = '88' WHERE name LIKE 'n4-standard-8';\nUPDATE instances SET coremarkScore = '354249', standardDeviation = '0.29 ', sampleCount = '81' WHERE name LIKE 'n4-standard-16';\nUPDATE instances SET coremarkScore = '706433', standardDeviation = '0.28 ', sampleCount = '80' WHERE name LIKE 'n4-standard-32';\nUPDATE instances SET coremarkScore = '1057781', standardDeviation = '2.09 ', sampleCount = '84' WHERE name LIKE 'n4-standard-48';\nUPDATE instances SET coremarkScore = '1351294', standardDeviation = '2.44 ', sampleCount = '84' WHERE name LIKE 'n4-standard-64';\nUPDATE instances SET coremarkScore = '1626413', standardDeviation = '3.18 ', sampleCount = '84' WHERE name LIKE 'n4-standard-80';\nUPDATE instances SET coremarkScore = '44397', standardDeviation = '0.26 ', sampleCount = '80' WHERE name LIKE 'n4-highcpu-2';\nUPDATE instances SET coremarkScore = '86649', standardDeviation = '0.58 ', sampleCount = '80' WHERE name LIKE 'n4-highcpu-4';\nUPDATE instances SET coremarkScore = '177628', standardDeviation = '0.29 ', sampleCount = '87' WHERE name LIKE 'n4-highcpu-8';\nUPDATE instances SET coremarkScore = '354814', standardDeviation = '0.29 ', sampleCount = '84' WHERE name LIKE 'n4-highcpu-16';\nUPDATE instances SET coremarkScore = '707229', standardDeviation = '0.30 ', sampleCount = '80' WHERE name LIKE 'n4-highcpu-32';\nUPDATE instances SET coremarkScore = '1058224', standardDeviation = '0.19 ', sampleCount = '88' WHERE name LIKE 'n4-highcpu-48';\nUPDATE instances SET coremarkScore = '1351265', standardDeviation = '1.23 ', sampleCount = '80' WHERE name LIKE 'n4-highcpu-64';\nUPDATE instances SET coremarkScore = '1651766', standardDeviation = '0.87 ', sampleCount = '84' WHERE name LIKE 'n4-highcpu-80';\nUPDATE instances SET coremarkScore = '44371', standardDeviation = '2.22 ', sampleCount = '84' WHERE name LIKE 'n4-highmem-2';\nUPDATE instances SET coremarkScore = '86305', standardDeviation = '0.89 ', sampleCount = '80' WHERE name LIKE 'n4-highmem-4';\nUPDATE instances SET coremarkScore = '177336', standardDeviation = '3.06 ', sampleCount = '80' WHERE name LIKE 'n4-highmem-8';\nUPDATE instances SET coremarkScore = '354343', standardDeviation = '3.61 ', sampleCount = '84' WHERE name LIKE 'n4-highmem-16';\nUPDATE instances SET coremarkScore = '704876', standardDeviation = '2.13 ', sampleCount = '84' WHERE name LIKE 'n4-highmem-32';\nUPDATE instances SET coremarkScore = '1027463', standardDeviation = '2.89 ', sampleCount = '80' WHERE name LIKE 'n4-highmem-48';\nUPDATE instances SET coremarkScore = '1256257', standardDeviation = '3.45 ', sampleCount = '84' WHERE name LIKE 'n4-highmem-64';\nUPDATE instances SET coremarkScore = '1536069', standardDeviation = '2.82 ', sampleCount = '80' WHERE name LIKE 'n4-highmem-80';\nUPDATE instances SET coremarkScore = '94572', standardDeviation = '0.78 ', sampleCount = '1732' WHERE name LIKE 'c3d-standard-4';\nUPDATE instances SET coremarkScore = '192584', standardDeviation = '0.72 ', sampleCount = '1168' WHERE name LIKE 'c3d-standard-8';\nUPDATE instances SET coremarkScore = '384420', standardDeviation = '0.97 ', sampleCount = '884' WHERE name LIKE 'c3d-standard-16';\nUPDATE instances SET coremarkScore = '681460', standardDeviation = '0.94 ', sampleCount = '752' WHERE name LIKE 'c3d-standard-30';\nUPDATE instances SET coremarkScore = '1360072', standardDeviation = '1.18 ', sampleCount = '659' WHERE name LIKE 'c3d-standard-60';\nUPDATE instances SET coremarkScore = '2138141', standardDeviation = '1.18 ', sampleCount = '616' WHERE name LIKE 'c3d-standard-90';\nUPDATE instances SET coremarkScore = '3905736', standardDeviation = '1.83 ', sampleCount = '552' WHERE name LIKE 'c3d-standard-180';\nUPDATE instances SET coremarkScore = '8026988', standardDeviation = '0.88 ', sampleCount = '60' WHERE name LIKE 'c3d-standard-360';\nUPDATE instances SET coremarkScore = '94611', standardDeviation = '0.46 ', sampleCount = '1168' WHERE name LIKE 'c3d-highcpu-4';\nUPDATE instances SET coremarkScore = '192661', standardDeviation = '0.51 ', sampleCount = '592' WHERE name LIKE 'c3d-highcpu-8';\nUPDATE instances SET coremarkScore = '384658', standardDeviation = '0.75 ', sampleCount = '304' WHERE name LIKE 'c3d-highcpu-16';\nUPDATE instances SET coremarkScore = '682826', standardDeviation = '0.48 ', sampleCount = '168' WHERE name LIKE 'c3d-highcpu-30';\nUPDATE instances SET coremarkScore = '1363944', standardDeviation = '0.47 ', sampleCount = '84' WHERE name LIKE 'c3d-highcpu-60';\nUPDATE instances SET coremarkScore = '2149508', standardDeviation = '0.30 ', sampleCount = '64' WHERE name LIKE 'c3d-highcpu-90';\nUPDATE instances SET coremarkScore = '3940383', standardDeviation = '1.44 ', sampleCount = '28' WHERE name LIKE 'c3d-highcpu-180';\nUPDATE instances SET coremarkScore = '7977725', standardDeviation = '1.41 ', sampleCount = '16' WHERE name LIKE 'c3d-highcpu-360';\nUPDATE instances SET coremarkScore = '94477', standardDeviation = '0.49 ', sampleCount = '304' WHERE name LIKE 'c3d-highmem-4';\nUPDATE instances SET coremarkScore = '192283', standardDeviation = '0.66 ', sampleCount = '164' WHERE name LIKE 'c3d-highmem-8';\nUPDATE instances SET coremarkScore = '384623', standardDeviation = '0.67 ', sampleCount = '88' WHERE name LIKE 'c3d-highmem-16';\nUPDATE instances SET coremarkScore = '681272', standardDeviation = '0.85 ', sampleCount = '44' WHERE name LIKE 'c3d-highmem-30';\nUPDATE instances SET coremarkScore = '1364173', standardDeviation = '0.55 ', sampleCount = '24' WHERE name LIKE 'c3d-highmem-60';\nUPDATE instances SET coremarkScore = '2143972', standardDeviation = '0.57 ', sampleCount = '16' WHERE name LIKE 'c3d-highmem-90';\nUPDATE instances SET coremarkScore = '3958388', standardDeviation = '1.13 ', sampleCount = '8' WHERE name LIKE 'c3d-highmem-180';\nUPDATE instances SET coremarkScore = '8069686', standardDeviation = '0.17 ', sampleCount = '4' WHERE name LIKE 'c3d-highmem-360';\nUPDATE instances SET coremarkScore = '80609', standardDeviation = '0.39 ', sampleCount = '1180' WHERE name LIKE 'c3-standard-4';\nUPDATE instances SET coremarkScore = '160341', standardDeviation = '0.32 ', sampleCount = '1116' WHERE name LIKE 'c3-standard-8';\nUPDATE instances SET coremarkScore = '440662', standardDeviation = '0.34 ', sampleCount = '252' WHERE name LIKE 'c3-standard-22';\nUPDATE instances SET coremarkScore = '878867', standardDeviation = '0.80 ', sampleCount = '612' WHERE name LIKE 'c3-standard-44';\nUPDATE instances SET coremarkScore = '1691035', standardDeviation = '1.18 ', sampleCount = '528' WHERE name LIKE 'c3-standard-88';\nUPDATE instances SET coremarkScore = '3377967', standardDeviation = '0.91 ', sampleCount = '484' WHERE name LIKE 'c3-standard-176';\nUPDATE instances SET coremarkScore = '80641', standardDeviation = '0.47 ', sampleCount = '1176' WHERE name LIKE 'c3-highcpu-4';\nUPDATE instances SET coremarkScore = '160329', standardDeviation = '0.48 ', sampleCount = '600' WHERE name LIKE 'c3-highcpu-8';\nUPDATE instances SET coremarkScore = '441164', standardDeviation = '0.29 ', sampleCount = '224' WHERE name LIKE 'c3-highcpu-22';\nUPDATE instances SET coremarkScore = '880832', standardDeviation = '0.87 ', sampleCount = '112' WHERE name LIKE 'c3-highcpu-44';\nUPDATE instances SET coremarkScore = '1696613', standardDeviation = '1.07 ', sampleCount = '56' WHERE name LIKE 'c3-highcpu-88';\nUPDATE instances SET coremarkScore = '3388373', standardDeviation = '0.62 ', sampleCount = '28' WHERE name LIKE 'c3-highcpu-176';\nUPDATE instances SET coremarkScore = '80742', standardDeviation = '0.44 ', sampleCount = '1200' WHERE name LIKE 'c3-highmem-4';\nUPDATE instances SET coremarkScore = '160478', standardDeviation = '0.29 ', sampleCount = '612' WHERE name LIKE 'c3-highmem-8';\nUPDATE instances SET coremarkScore = '441229', standardDeviation = '0.21 ', sampleCount = '252' WHERE name LIKE 'c3-highmem-22';\nUPDATE instances SET coremarkScore = '877637', standardDeviation = '1.12 ', sampleCount = '136' WHERE name LIKE 'c3-highmem-44';\nUPDATE instances SET coremarkScore = '1689147', standardDeviation = '1.48 ', sampleCount = '72' WHERE name LIKE 'c3-highmem-88';\nUPDATE instances SET coremarkScore = '3347332', standardDeviation = '1.44 ', sampleCount = '56' WHERE name LIKE 'c3-highmem-176';\nUPDATE instances SET coremarkScore = '556066', standardDeviation = '0.22 ', sampleCount = '1020' WHERE name LIKE 'm3-ultramem-32';\nUPDATE instances SET coremarkScore = '1101308', standardDeviation = '0.73 ', sampleCount = '1144' WHERE name LIKE 'm3-ultramem-64';\nUPDATE instances SET coremarkScore = '2190379', standardDeviation = '0.62 ', sampleCount = '1128' WHERE name LIKE 'm3-ultramem-128';\nUPDATE instances SET coremarkScore = '1094465', standardDeviation = '0.98 ', sampleCount = '1132' WHERE name LIKE 'm3-megamem-64';\nUPDATE instances SET coremarkScore = '2182236', standardDeviation = '0.89 ', sampleCount = '1144' WHERE name LIKE 'm3-megamem-128';\nUPDATE instances SET coremarkScore = '1691169', standardDeviation = '1.02 ', sampleCount = '84' WHERE name LIKE 'z3-highmem-88';\nUPDATE instances SET coremarkScore = '3373295', standardDeviation = '0.97 ', sampleCount = '88' WHERE name LIKE 'z3-highmem-176';\nUPDATE instances SET coremarkScore = '56273', standardDeviation = '0.66 ', sampleCount = '88' WHERE name LIKE 'g2-standard-4';\nUPDATE instances SET coremarkScore = '111997', standardDeviation = '0.64 ', sampleCount = '48' WHERE name LIKE 'g2-standard-8';\nUPDATE instances SET coremarkScore = '167604', standardDeviation = '0.52 ', sampleCount = '36' WHERE name LIKE 'g2-standard-12';\nUPDATE instances SET coremarkScore = '223514', standardDeviation = '0.51 ', sampleCount = '28' WHERE name LIKE 'g2-standard-16';\nUPDATE instances SET coremarkScore = '334411', standardDeviation = '0.53 ', sampleCount = '20' WHERE name LIKE 'g2-standard-24';\nUPDATE instances SET coremarkScore = '446322', standardDeviation = '0.64 ', sampleCount = '16' WHERE name LIKE 'g2-standard-32';\nUPDATE instances SET coremarkScore = '656106', standardDeviation = '2.97 ', sampleCount = '12' WHERE name LIKE 'g2-standard-48';\nUPDATE instances SET coremarkScore = '1249876', standardDeviation = '0.20 ', sampleCount = '8' WHERE name LIKE 'g2-standard-96';\n"
  },
  {
    "path": "instances/series/cpu/frequency.sql",
    "content": "/* Intel */\n/* https://cloud.google.com/compute/docs/cpu-platforms#intel_processors */\n\n/* Intel Xeon E5 (Sandy Bridge) */\nUPDATE instances SET cpuBaseClock  = '2.6', cpuTurboClock  = '3.2', cpuSingleMaxTurboClock = '3.6' WHERE availableCpuPlatform LIKE '%Sandy%' AND series LIKE 'n1';\n\n/* Intel Xeon E5 v2 (Ivy Bridge) */\nUPDATE instances SET cpuBaseClock  = '2.5', cpuTurboClock  = '3.1', cpuSingleMaxTurboClock = '3.5' WHERE availableCpuPlatform LIKE '%Ivy%' AND series LIKE 'n1';\n\n/* Intel Xeon E5 v3 (Haswell) */\nUPDATE instances SET cpuBaseClock  = '2.3', cpuTurboClock  = '2.8', cpuSingleMaxTurboClock = '3.8' WHERE availableCpuPlatform LIKE '%Haswell%' AND series LIKE 'n1';\n\n/* Intel Xeon E5 (Broadwell E5) */\nUPDATE instances SET cpuBaseClock  = '2.2', cpuTurboClock  = '2.8', cpuSingleMaxTurboClock = '3.7' WHERE availableCpuPlatform LIKE '%Broadwell%' AND series LIKE 'n1';\nUPDATE instances SET cpuBaseClock  = '2.2', cpuTurboClock  = '2.8', cpuSingleMaxTurboClock = '3.7' WHERE availableCpuPlatform LIKE '%Broadwell%' AND series LIKE 'e2';\n\n/* Intel Xeon E7 (Broadwell E7) */\nUPDATE instances SET cpuBaseClock  = '2.2', cpuTurboClock  = '2.6', cpuSingleMaxTurboClock = '3.3' WHERE availableCpuPlatform LIKE '%Broadwell%' AND series LIKE 'm1';\n\n/* Intel Xeon Scalable Processor (Skylake) 1st Generation */\nUPDATE instances SET cpuBaseClock  = '2.0', cpuTurboClock  = '2.7', cpuSingleMaxTurboClock = '3.5' WHERE availableCpuPlatform LIKE '%Skylake%' AND series LIKE 'n1';\nUPDATE instances SET cpuBaseClock  = '2.0', cpuTurboClock  = '2.7', cpuSingleMaxTurboClock = '3.5' WHERE availableCpuPlatform LIKE '%Skylake%' AND series LIKE 'e2';\nUPDATE instances SET cpuBaseClock  = '2.0', cpuTurboClock  = '2.7', cpuSingleMaxTurboClock = '3.5' WHERE availableCpuPlatform LIKE '%Skylake%' AND series LIKE 'm1';\n\n/* Intel Xeon Scalable Processor (Cascade Lake) 2nd Generation */\nUPDATE instances SET cpuBaseClock  = '2.8', cpuTurboClock  = '3.4', cpuSingleMaxTurboClock = '3.9' WHERE availableCpuPlatform LIKE '%Cascade Lake%' AND series LIKE 'n2';\nUPDATE instances SET cpuBaseClock  = '3.1', cpuTurboClock  = '3.8', cpuSingleMaxTurboClock = '3.9' WHERE availableCpuPlatform LIKE '%Cascade Lake%' AND series LIKE 'c2';\nUPDATE instances SET cpuBaseClock  = '2.5', cpuTurboClock  = '3.4', cpuSingleMaxTurboClock = '4.0' WHERE availableCpuPlatform LIKE '%Cascade Lake%' AND series LIKE 'm2';\nUPDATE instances SET cpuBaseClock  = '2.2', cpuTurboClock  = '2.9', cpuSingleMaxTurboClock = '3.7' WHERE availableCpuPlatform LIKE '%Cascade Lake%' AND series LIKE 'a2';\nUPDATE instances SET cpuBaseClock  = '2.2', cpuTurboClock  = '2.9', cpuSingleMaxTurboClock = '3.7' WHERE availableCpuPlatform LIKE '%Cascade Lake%' AND series LIKE 'g2';\n\n/* Intel Xeon Scalable Processor (Ice Lake) 3rd Generation */\nUPDATE instances SET cpuBaseClock  = '2.6', cpuTurboClock  = '3.4', cpuSingleMaxTurboClock = '3.5' WHERE availableCpuPlatform LIKE '%Ice Lake%' AND series LIKE 'n2';\nUPDATE instances SET cpuBaseClock  = '3.1', cpuTurboClock  = '3.8', cpuSingleMaxTurboClock = '3.9' WHERE availableCpuPlatform LIKE '%Ice Lake%' AND series LIKE 'c2';\nUPDATE instances SET cpuBaseClock  = '2.6', cpuTurboClock  = '3.4', cpuSingleMaxTurboClock = '3.5' WHERE availableCpuPlatform LIKE '%Ice Lake%' AND series LIKE 'm3';\n\n/* Intel Xeon Scalable Processor (Sapphire Rapids) 4rd Generation */\nUPDATE instances SET cpuBaseClock  = '1.9', cpuTurboClock  = '3.0', cpuSingleMaxTurboClock = '3.3' WHERE availableCpuPlatform LIKE '%Sapphire Rapids%' AND series LIKE 'a3';\nUPDATE instances SET cpuBaseClock  = '1.9', cpuTurboClock  = '3.0', cpuSingleMaxTurboClock = '3.3' WHERE availableCpuPlatform LIKE '%Sapphire Rapids%' AND series LIKE 'c3';\nUPDATE instances SET cpuBaseClock  = '1.9', cpuTurboClock  = '3.0', cpuSingleMaxTurboClock = '3.3' WHERE availableCpuPlatform LIKE '%Sapphire Rapids%' AND series LIKE 'h3';\nUPDATE instances SET cpuBaseClock  = '1.9', cpuTurboClock  = '3.0', cpuSingleMaxTurboClock = '3.3' WHERE availableCpuPlatform LIKE '%Sapphire Rapids%' AND series LIKE 'z3';\n\n/* Intel Xeon Scalable Processor (Emerald Rapids) 5th Generation */\nUPDATE instances SET cpuBaseClock  = '2.3', cpuTurboClock  = '3.1', cpuSingleMaxTurboClock = '4.0' WHERE availableCpuPlatform LIKE '%Emerald Rapids%' AND series LIKE 'c4';\nUPDATE instances SET cpuBaseClock  = '2.1', cpuTurboClock  = '2.9', cpuSingleMaxTurboClock = '4.0' WHERE availableCpuPlatform LIKE '%Emerald Rapids%' AND series LIKE 'a4';\nUPDATE instances SET cpuBaseClock  = '2.1', cpuTurboClock  = '2.9', cpuSingleMaxTurboClock = '4.0' WHERE availableCpuPlatform LIKE '%Emerald Rapids%' AND series LIKE 'm4';\nUPDATE instances SET cpuBaseClock  = '2.1', cpuTurboClock  = '2.9', cpuSingleMaxTurboClock = '3.3' WHERE availableCpuPlatform LIKE '%Emerald Rapids%' AND series LIKE 'n4';\n\n/* Intel Xeon Scalable Processor (Granite Rapids) 6th Generation */\nUPDATE instances SET cpuBaseClock  = '2.8', cpuTurboClock  = '3.9', cpuSingleMaxTurboClock = '4.2' WHERE availableCpuPlatform LIKE '%Granite Rapids%' AND series LIKE 'c4';\n\n/* AMD */\n/* https://cloud.google.com/compute/docs/cpu-platforms#amd_processors */\n\n/* AMD EPYC Rome 2nd Generation */\nUPDATE instances SET cpuBaseClock  = '2.25', cpuTurboClock  = '2.7', cpuSingleMaxTurboClock = '3.3' WHERE availableCpuPlatform LIKE '%Rome%';\n\n/* AMD EPYC Milan 3rd Generation */\nUPDATE instances SET cpuBaseClock  = '2.45', cpuTurboClock  = '2.8', cpuSingleMaxTurboClock = '3.5' WHERE availableCpuPlatform LIKE '%Milan%';\n\n/* AMD EPYC Genoa 4rd Generation */\nUPDATE instances SET cpuBaseClock  = '2.6', cpuTurboClock  = '3.45', cpuSingleMaxTurboClock = '3.7' WHERE availableCpuPlatform LIKE '%Genoa%';\n\n/* AMD EPYC Turin 5th Generation */\nUPDATE instances SET cpuBaseClock  = '2.7', cpuTurboClock  = '3.5', cpuSingleMaxTurboClock = '4.1' WHERE availableCpuPlatform LIKE '%Turin%';\n\n\n/* Arm */\n/* https://cloud.google.com/compute/docs/cpu-platforms#arm_processors */\n\n/* Ampere Altra Q64-30 */\n/* https://amperecomputing.com/briefs/ampere-altra-family-product-brief */\nUPDATE instances SET cpuBaseClock = '3.0', cpuTurboClock = '3.0', cpuSingleMaxTurboClock = '3.0' WHERE availableCpuPlatform LIKE '%Ampere Altra%';\n\n/* Google Axion Processors */\n/* https://gist.github.com/Cyclenerd/57ffee632dcb3d7e537fbcdc9779cb50 */\nUPDATE instances SET cpuBaseClock = '3.0', cpuTurboClock = '3.0', cpuSingleMaxTurboClock = '3.0' WHERE availableCpuPlatform LIKE '%Google Axion%';\n"
  },
  {
    "path": "instances/series/e2.sql",
    "content": "/* E2 General-purpose */\n/* https://cloud.google.com/compute/docs/machine-types#machine_type_comparison */\n/* https://cloud.google.com/compute/docs/general-purpose-machines#e2_machine_types */\nUPDATE instances SET\nseries      = 'e2',\nfamily      = 'General-purpose',\ncpuPlatform = 'Skylake, Broadwell, Haswell, Rome',\nspot        = '1'\nWHERE name LIKE 'e2-%';\nUPDATE instances SET bandwidth = '4'  WHERE name LIKE 'e2-%-2';\nUPDATE instances SET bandwidth = '8'  WHERE name LIKE 'e2-%-4';\nUPDATE instances SET bandwidth = '16' WHERE name LIKE 'e2-%-8';\nUPDATE instances SET bandwidth = '16' WHERE name LIKE 'e2-%-16';\nUPDATE instances SET bandwidth = '16' WHERE name LIKE 'e2-%-32';\n\n/* E2 shared-core */\n/* https://cloud.google.com/compute/docs/machine-types#machine_type_comparison */\n/* https://cloud.google.com/compute/docs/general-purpose-machines#e2_machine_types */\nUPDATE instances SET bandwidth = '1' WHERE name LIKE 'e2-micro';\nUPDATE instances SET bandwidth = '2' WHERE name LIKE 'e2-small';\nUPDATE instances SET bandwidth = '2' WHERE name LIKE 'e2-medium';"
  },
  {
    "path": "instances/series/g2.sql",
    "content": "/* G2 Accelerator-optimized machines */\n/* https://cloud.google.com/compute/docs/machine-types#machine_type_comparison */\n/* https://cloud.google.com/compute/docs/accelerator-optimized-machines#g2-vms */\nUPDATE instances SET\nseries      = 'g2',\nfamily      = 'Accelerator-optimized',\ncpuPlatform = 'Cascade Lake',\nlocalSsd    = '1',\nspot        = '1'\nWHERE name LIKE 'g2-%';\nUPDATE instances SET bandwidth = '10'  WHERE name LIKE 'g2-standard-4';\nUPDATE instances SET bandwidth = '16'  WHERE name LIKE 'g2-standard-8';\nUPDATE instances SET bandwidth = '16'  WHERE name LIKE 'g2-standard-12';\nUPDATE instances SET bandwidth = '32'  WHERE name LIKE 'g2-standard-16';\nUPDATE instances SET bandwidth = '32'  WHERE name LIKE 'g2-standard-24';\nUPDATE instances SET bandwidth = '32'  WHERE name LIKE 'g2-standard-32';\nUPDATE instances SET bandwidth = '50'  WHERE name LIKE 'g2-standard-48';\nUPDATE instances SET bandwidth = '100' WHERE name LIKE 'g2-standard-96';"
  },
  {
    "path": "instances/series/gpu/gpu_names.sql",
    "content": "/* \n * Replace graphics processing units (GPUs) type names\n * https://cloud.google.com/compute/docs/gpus#gpus-list\n */\n\nUPDATE instances SET acceleratorType = 'NVIDIA L4 vWS'     WHERE acceleratorType LIKE 'nvidia-l4-vws';\nUPDATE instances SET acceleratorType = 'NVIDIA L4'         WHERE acceleratorType LIKE 'nvidia-l4';\n\nUPDATE instances SET acceleratorType = 'NVIDIA A100 40GB'  WHERE acceleratorType LIKE 'nvidia-tesla-a100';\nUPDATE instances SET acceleratorType = 'NVIDIA A100 80GB'  WHERE acceleratorType LIKE 'nvidia-a100-80gb';\n\nUPDATE instances SET acceleratorType = 'NVIDIA T4 vWS'     WHERE acceleratorType LIKE 'nvidia-tesla-t4-vws';\nUPDATE instances SET acceleratorType = 'NVIDIA T4'         WHERE acceleratorType LIKE 'nvidia-tesla-t4';\n\nUPDATE instances SET acceleratorType = 'NVIDIA P4 vWS'     WHERE acceleratorType LIKE 'nvidia-tesla-p4-vws';\nUPDATE instances SET acceleratorType = 'NVIDIA P4'         WHERE acceleratorType LIKE 'nvidia-tesla-p4';\n\nUPDATE instances SET acceleratorType = 'NVIDIA V100'       WHERE acceleratorType LIKE 'nvidia-tesla-v100';\n\nUPDATE instances SET acceleratorType = 'NVIDIA P100 vWS'   WHERE acceleratorType LIKE 'nvidia-tesla-p100-vws';\nUPDATE instances SET acceleratorType = 'NVIDIA P100'       WHERE acceleratorType LIKE 'nvidia-tesla-p100';\n\nUPDATE instances SET acceleratorType = 'NVIDIA H100 80GB'      WHERE acceleratorType LIKE 'nvidia-h100-80gb';\nUPDATE instances SET acceleratorType = 'NVIDIA H100 80GB Mega' WHERE acceleratorType LIKE 'nvidia-h100-mega-80gb';\n\nUPDATE instances SET acceleratorType = 'NVIDIA K80 (EOL!)' WHERE acceleratorType LIKE 'nvidia-tesla-k80';\n"
  },
  {
    "path": "instances/series/h3.sql",
    "content": "/* H3 Compute-optimized */\n/* https://cloud.google.com/compute/docs/compute-optimized-machines#h3_series */\nUPDATE instances SET\nseries      = 'h3',\nfamily      = 'Compute-optimized',\ncpuPlatform = 'Sapphire Rapids',\nlocalSsd    = '0',\nbandwidth   = '200',\nspot        = '0'\nWHERE name LIKE 'h3-%';"
  },
  {
    "path": "instances/series/m1.sql",
    "content": "/* M1 Memory-optimized megamem */\n/* https://cloud.google.com/compute/docs/machine-types#machine_type_comparison */\n/* https://cloud.google.com/compute/docs/memory-optimized-machines#m1_machine_types */\nUPDATE instances SET\nseries      = 'm1',\nfamily      = 'Memory-optimized',\ncpuPlatform = 'Skylake',\nlocalSsd    = '1',\nbandwidth   = '32',\nsud         = '1',\nspot        = '1'\nWHERE name LIKE 'm1-megamem-%';\n\n/* M1 Memory-optimized ultramem */\n/* https://cloud.google.com/compute/docs/machine-types#machine_type_comparison */\n/* https://cloud.google.com/compute/docs/memory-optimized-machines#m1_machine_types */\nUPDATE instances SET\nseries      = 'm1',\nfamily      = 'Memory-optimized',\ncpuPlatform = 'Broadwell',\nbandwidth   = '32',\nsud         = '1',\nspot        = '1'\nWHERE name LIKE 'm1-ultramem-%';"
  },
  {
    "path": "instances/series/m2.sql",
    "content": "/* M2 Memory-optimized ultramem */\n/* https://cloud.google.com/compute/docs/machine-types#machine_type_comparison */\n/* https://cloud.google.com/compute/docs/memory-optimized-machines#m2_machine_types */\nUPDATE instances SET\nseries      = 'm2',\nfamily      = 'Memory-optimized',\ncpuPlatform = 'Cascade Lake',\nbandwidth   = '32',\nsud         = '1'\nWHERE name LIKE 'm2-%';"
  },
  {
    "path": "instances/series/m3.sql",
    "content": "/* M3 Memory-optimized */\n/* https://cloud.google.com/compute/docs/memory-optimized-machines#m3_machine_types */\nUPDATE instances SET\nseries      = 'm3',\nfamily      = 'Memory-optimized',\ncpuPlatform = 'Ice Lake',\nlocalSsd    = '1',\nbandwidth   = '32',\nsud         = '0',\nspot        = '1'\nWHERE name LIKE 'm3-%';\nUPDATE instances SET tier1 = '50'  WHERE name LIKE 'm3-%-64';\nUPDATE instances SET tier1 = '100' WHERE name LIKE 'm3-%-128';"
  },
  {
    "path": "instances/series/m4.sql",
    "content": "/* M3 Memory-optimized */\n/* https://cloud.google.com/compute/docs/memory-optimized-machines#m4_series */\nUPDATE instances SET\nseries      = 'm4',\nfamily      = 'Memory-optimized',\ncpuPlatform = 'Emerald Rapids',\nlocalSsd    = '0',\nbandwidth   = '32',\ntier1       = '50',\nsud         = '0',\nspot        = '0'\nWHERE name LIKE 'm4-%';\nUPDATE instances SET bandwidth = '32',  tier1 = '50'  WHERE name LIKE 'm4-%-56';\nUPDATE instances SET bandwidth = '50',  tier1 = '100' WHERE name LIKE 'm4-%-112';\nUPDATE instances SET bandwidth = '100', tier1 = '200' WHERE name LIKE 'm4-%-224';\n\n"
  },
  {
    "path": "instances/series/n1.sql",
    "content": "/* N1 General-purpose */\n/* https://cloud.google.com/compute/docs/machine-types#machine_type_comparison */\n/* https://cloud.google.com/compute/docs/general-purpose-machines#n1_machines */\nUPDATE instances SET\nseries      = 'n1',\nfamily      = 'General-purpose',\ncpuPlatform = 'Skylake, Broadwell, Haswell, Sandy Bridge, Ivy Bridge',\nlocalSsd    = '1',\nsud         = '1',\nspot        = '1'\nWHERE name LIKE 'n1-%';\nUPDATE instances SET bandwidth = '2'  WHERE name LIKE 'n1-%-1';\nUPDATE instances SET bandwidth = '10' WHERE name LIKE 'n1-%-2';\nUPDATE instances SET bandwidth = '10' WHERE name LIKE 'n1-%-4';\nUPDATE instances SET bandwidth = '16' WHERE name LIKE 'n1-%-8';\nUPDATE instances SET bandwidth = '32' WHERE name LIKE 'n1-%-16';\nUPDATE instances SET bandwidth = '32' WHERE name LIKE 'n1-%-32';\nUPDATE instances SET bandwidth = '32' WHERE name LIKE 'n1-%-64';\nUPDATE instances SET bandwidth = '32' WHERE name LIKE 'n1-%-96';\n\n/* N1 shared-core */\n/* https://cloud.google.com/compute/docs/machine-types#machine_type_comparison */\n/* https://cloud.google.com/compute/docs/general-purpose-machines#n1_machines */\nUPDATE instances SET\nseries      = 'n1',\nfamily      = 'General-purpose',\ncpuPlatform = 'Skylake, Broadwell, Haswell, Sandy Bridge, Ivy Bridge',\nbandwidth   = '1',\nsud         = '1',\nspot        = '1'\nWHERE name LIKE 'g1-%' OR name LIKE 'f1-%';"
  },
  {
    "path": "instances/series/n2.sql",
    "content": "/* N2 General-purpose */\n/* https://cloud.google.com/compute/docs/machine-types#machine_type_comparison */\n/* https://cloud.google.com/compute/docs/general-purpose-machines#n2_machines */\nUPDATE instances SET\nseries      = 'n2',\nfamily      = 'General-purpose',\ncpuPlatform = 'Cascade Lake, Ice Lake',\nlocalSsd    = '1',\nsud         = '1',\nspot        = '1'\nWHERE name LIKE 'n2-%';\nUPDATE instances SET bandwidth = '10' WHERE name LIKE 'n2-%-2';\nUPDATE instances SET bandwidth = '10' WHERE name LIKE 'n2-%-4';\nUPDATE instances SET bandwidth = '16' WHERE name LIKE 'n2-%-8';\nUPDATE instances SET bandwidth = '32' WHERE name LIKE 'n2-%-16';\nUPDATE instances SET bandwidth = '32', tier1 = '50'  WHERE name LIKE 'n2-%-32';\nUPDATE instances SET bandwidth = '32', tier1 = '50'  WHERE name LIKE 'n2-%-48';\nUPDATE instances SET bandwidth = '32', tier1 = '75'  WHERE name LIKE 'n2-%-64';\nUPDATE instances SET bandwidth = '32', tier1 = '100' WHERE name LIKE 'n2-%-80';\nUPDATE instances SET bandwidth = '32', tier1 = '100' WHERE name LIKE 'n2-%-96';\nUPDATE instances SET bandwidth = '32', tier1 = '100' WHERE name LIKE 'n2-%-128';"
  },
  {
    "path": "instances/series/n2d.sql",
    "content": "/* N2D General-purpose */\n/* https://cloud.google.com/compute/docs/machine-types#machine_type_comparison */\n/* https://cloud.google.com/compute/docs/general-purpose-machines#n2d_machines */\nUPDATE instances SET\nseries      = 'n2d',\nfamily      = 'General-purpose',\ncpuPlatform = 'Rome, Milan',\nlocalSsd    = '1',\nsud         = '1',\nspot        = '1'\nWHERE name LIKE 'n2d-%';\nUPDATE instances SET bandwidth = '10' WHERE name LIKE 'n2d-%-2';\nUPDATE instances SET bandwidth = '10' WHERE name LIKE 'n2d-%-4';\nUPDATE instances SET bandwidth = '16' WHERE name LIKE 'n2d-%-8';\nUPDATE instances SET bandwidth = '32' WHERE name LIKE 'n2d-%-16';\nUPDATE instances SET bandwidth = '32' WHERE name LIKE 'n2d-%-32';\nUPDATE instances SET bandwidth = '32', tier1 = '50'  WHERE name LIKE 'n2d-%-48';\nUPDATE instances SET bandwidth = '32', tier1 = '50'  WHERE name LIKE 'n2d-%-64';\nUPDATE instances SET bandwidth = '32', tier1 = '50'  WHERE name LIKE 'n2d-%-80';\nUPDATE instances SET bandwidth = '32', tier1 = '100' WHERE name LIKE 'n2d-%-96';\nUPDATE instances SET bandwidth = '32', tier1 = '100' WHERE name LIKE 'n2d-%-128';\nUPDATE instances SET bandwidth = '32', tier1 = '100' WHERE name LIKE 'n2d-%-224';"
  },
  {
    "path": "instances/series/n4.sql",
    "content": "/* N4 General-purpose */\n/* https://cloud.google.com/compute/docs/general-purpose-machines#n4_series */\nUPDATE instances SET\nseries      = 'n4',\nfamily      = 'General-purpose',\ncpuPlatform = 'Emerald Rapids',\nlocalSsd    = '0',\nsud         = '0',\nspot        = '1'\nWHERE name LIKE 'n4-%';\nUPDATE instances SET bandwidth = '10' WHERE name LIKE 'n4-%-2';\nUPDATE instances SET bandwidth = '10' WHERE name LIKE 'n4-%-4';\nUPDATE instances SET bandwidth = '16' WHERE name LIKE 'n4-%-8';\nUPDATE instances SET bandwidth = '32' WHERE name LIKE 'n4-%-16';\nUPDATE instances SET bandwidth = '32' WHERE name LIKE 'n4-%-32';\nUPDATE instances SET bandwidth = '32' WHERE name LIKE 'n4-%-48';\nUPDATE instances SET bandwidth = '45' WHERE name LIKE 'n4-%-64';\nUPDATE instances SET bandwidth = '50' WHERE name LIKE 'n4-%-80';\n"
  },
  {
    "path": "instances/series/n4a.sql",
    "content": "/* N4A General-purpose */\n/* https://docs.cloud.google.com/compute/docs/general-purpose-machines?hl=en#n4a_series */\nUPDATE instances SET\nseries      = 'n4a',\nfamily      = 'General-purpose',\ncpuPlatform = 'Google Axion',\nlocalSsd    = '0',\nsud         = '0',\nspot        = '1'\nWHERE name LIKE 'n4a-%';\nUPDATE instances SET bandwidth = '10' WHERE name LIKE 'n4a-%-1';\nUPDATE instances SET bandwidth = '10' WHERE name LIKE 'n4a-%-2';\nUPDATE instances SET bandwidth = '10' WHERE name LIKE 'n4a-%-4';\nUPDATE instances SET bandwidth = '16' WHERE name LIKE 'n4a-%-8';\nUPDATE instances SET bandwidth = '32' WHERE name LIKE 'n4a-%-16';\nUPDATE instances SET bandwidth = '32' WHERE name LIKE 'n4a-%-32';\nUPDATE instances SET bandwidth = '32' WHERE name LIKE 'n4a-%-48';\nUPDATE instances SET bandwidth = '50' WHERE name LIKE 'n4a-%-64';\n"
  },
  {
    "path": "instances/series/n4d.sql",
    "content": "/* N4 General-purpose */\n/* https://cloud.google.com/compute/docs/general-purpose-machines#n4_series */\nUPDATE instances SET\nseries      = 'n4d',\nfamily      = 'General-purpose',\ncpuPlatform = 'Turin',\nlocalSsd    = '0',\nsud         = '0',\nspot        = '1'\nWHERE name LIKE 'n4d-%';\nUPDATE instances SET bandwidth = '10' WHERE name LIKE 'n4d-%-2';\nUPDATE instances SET bandwidth = '10' WHERE name LIKE 'n4d-%-4';\nUPDATE instances SET bandwidth = '16' WHERE name LIKE 'n4d-%-8';\nUPDATE instances SET bandwidth = '32' WHERE name LIKE 'n4d-%-16';\nUPDATE instances SET bandwidth = '32' WHERE name LIKE 'n4d-%-32';\nUPDATE instances SET bandwidth = '32' WHERE name LIKE 'n4d-%-48';\nUPDATE instances SET bandwidth = '45' WHERE name LIKE 'n4d-%-64';\nUPDATE instances SET bandwidth = '50' WHERE name LIKE 'n4d-%-80';\nUPDATE instances SET bandwidth = '50' WHERE name LIKE 'n4d-%-96';\n"
  },
  {
    "path": "instances/series/sap/hana.sql",
    "content": "/* SAP HANA certified machine types */\n/* https://cloud.google.com/solutions/sap/docs/certifications-sap-hana#hana-cert-table-vms */\n\nUPDATE instances SET hana = '1' WHERE name LIKE 'c3-highmem-88';\nUPDATE instances SET hana = '1' WHERE name LIKE 'c3-standard-44';\nUPDATE instances SET hana = '1' WHERE name LIKE 'c3-highmem-44';\nUPDATE instances SET hana = '1' WHERE name LIKE 'c3-highmem-88';\nUPDATE instances SET hana = '1' WHERE name LIKE 'c3-highmem-176';\nUPDATE instances SET hana = '1' WHERE name LIKE 'c3-highmem-192-metal';\n\nUPDATE instances SET hana = '1' WHERE name LIKE 'c4-highmem-32';\nUPDATE instances SET hana = '1' WHERE name LIKE 'c4-highmem-48';\nUPDATE instances SET hana = '1' WHERE name LIKE 'c4-highmem-96';\nUPDATE instances SET hana = '1' WHERE name LIKE 'c4-highmem-192';\n\nUPDATE instances SET hana = '1' WHERE name LIKE 'n1-highmem-32';\nUPDATE instances SET hana = '1' WHERE name LIKE 'n1-highmem-64';\nUPDATE instances SET hana = '1' WHERE name LIKE 'n1-highmem-96';\n\nUPDATE instances SET hana = '1' WHERE name LIKE 'n2-highmem-32';\nUPDATE instances SET hana = '1' WHERE name LIKE 'n2-highmem-48';\nUPDATE instances SET hana = '1' WHERE name LIKE 'n2-highmem-64';\nUPDATE instances SET hana = '1' WHERE name LIKE 'n2-highmem-80';\nUPDATE instances SET hana = '1' WHERE name LIKE 'n2-highmem-96';\nUPDATE instances SET hana = '1' WHERE name LIKE 'n2-highmem-128';\n\nUPDATE instances SET hana = '1' WHERE name LIKE 'm1-%';\n\nUPDATE instances SET hana = '1' WHERE name LIKE 'm2-%';\n\nUPDATE instances SET hana = '1' WHERE name LIKE 'm3-%';\n\nUPDATE instances SET hana = '1' WHERE name LIKE 'm4-%';"
  },
  {
    "path": "instances/series/sap/sap.sql",
    "content": "/* SAP certified machine types */\n/* https://cloud.google.com/solutions/sap/docs/certifications-sap-apps#sap-certified-vms */\n/* https://launchpad.support.sap.com/#/notes/2456432 */\n\n/* C2 */\n/* Intel Cascade Lake */\nUPDATE instances SET sap = '1', saps = '6040'  WHERE name LIKE 'c2-standard-4'  AND availableCpuPlatform LIKE '%Cascade Lake%';\nUPDATE instances SET sap = '1', saps = '12080' WHERE name LIKE 'c2-standard-8'  AND availableCpuPlatform LIKE '%Cascade Lake%';\nUPDATE instances SET sap = '1', saps = '24160' WHERE name LIKE 'c2-standard-16' AND availableCpuPlatform LIKE '%Cascade Lake%';\nUPDATE instances SET sap = '1', saps = '45300' WHERE name LIKE 'c2-standard-30' AND availableCpuPlatform LIKE '%Cascade Lake%';\nUPDATE instances SET sap = '1', saps = '90600' WHERE name LIKE 'c2-standard-60' AND availableCpuPlatform LIKE '%Cascade Lake%';\n\n/* C3 */\n/* Intel Sapphire Rapids */\nUPDATE instances SET sap = '1', saps = '7835'   WHERE name LIKE 'c3-standard-4'   AND availableCpuPlatform LIKE '%Sapphire Rapids%';\nUPDATE instances SET sap = '1', saps = '15670'  WHERE name LIKE 'c3-standard-8'   AND availableCpuPlatform LIKE '%Sapphire Rapids%';\nUPDATE instances SET sap = '1', saps = '41720'  WHERE name LIKE 'c3-standard-22'  AND availableCpuPlatform LIKE '%Sapphire Rapids%';\nUPDATE instances SET sap = '1', saps = '140200' WHERE name LIKE 'c3-standard-88'  AND availableCpuPlatform LIKE '%Sapphire Rapids%';\nUPDATE instances SET sap = '1', saps = '270320' WHERE name LIKE 'c3-standard-176' AND availableCpuPlatform LIKE '%Sapphire Rapids%';\nUPDATE instances SET sap = '1', saps = '7840'   WHERE name LIKE 'c3-highmem-4'    AND availableCpuPlatform LIKE '%Sapphire Rapids%';\nUPDATE instances SET sap = '1', saps = '15680'  WHERE name LIKE 'c3-highmem-8'    AND availableCpuPlatform LIKE '%Sapphire Rapids%';\nUPDATE instances SET sap = '1', saps = '41580'  WHERE name LIKE 'c3-highmem-22'   AND availableCpuPlatform LIKE '%Sapphire Rapids%';\nUPDATE instances SET sap = '1', saps = '76150'  WHERE name LIKE 'c3-highmem-44'   AND availableCpuPlatform LIKE '%Sapphire Rapids%';\nUPDATE instances SET sap = '1', saps = '142420' WHERE name LIKE 'c3-highmem-88'   AND availableCpuPlatform LIKE '%Sapphire Rapids%';\nUPDATE instances SET sap = '1', saps = '271550' WHERE name LIKE 'c3-highmem-176'  AND availableCpuPlatform LIKE '%Sapphire Rapids%';\n/* TODO: Add SAPS */\nUPDATE instances SET sap = '1' WHERE name LIKE 'c3-standard-192-metal' AND availableCpuPlatform LIKE '%Sapphire Rapids%';\nUPDATE instances SET sap = '1' WHERE name LIKE 'c3-highmem-192-metal' AND availableCpuPlatform LIKE '%Sapphire Rapids%';\n\n\n/* C4 */\n/* Intel Emerald Rapids */\n/* TODO: Add SAPS */\nUPDATE instances SET sap = '1' WHERE name LIKE 'c4-highmem-2' AND availableCpuPlatform LIKE '%Emerald Rapids%';\nUPDATE instances SET sap = '1' WHERE name LIKE 'c4-highmem-4' AND availableCpuPlatform LIKE '%Emerald Rapids%';\nUPDATE instances SET sap = '1' WHERE name LIKE 'c4-highmem-8' AND availableCpuPlatform LIKE '%Emerald Rapids%';\nUPDATE instances SET sap = '1' WHERE name LIKE 'c4-highmem-16' AND availableCpuPlatform LIKE '%Emerald Rapids%';\nUPDATE instances SET sap = '1' WHERE name LIKE 'c4-highmem-32' AND availableCpuPlatform LIKE '%Emerald Rapids%';\nUPDATE instances SET sap = '1' WHERE name LIKE 'c4-highmem-48' AND availableCpuPlatform LIKE '%Emerald Rapids%';\nUPDATE instances SET sap = '1' WHERE name LIKE 'c4-highmem-96' AND availableCpuPlatform LIKE '%Emerald Rapids%';\nUPDATE instances SET sap = '1' WHERE name LIKE 'c4-highmem-192' AND availableCpuPlatform LIKE '%Emerald Rapids%';\nUPDATE instances SET sap = '1' WHERE name LIKE 'c4-standard-2' AND availableCpuPlatform LIKE '%Emerald Rapids%';\nUPDATE instances SET sap = '1' WHERE name LIKE 'c4-standard-4' AND availableCpuPlatform LIKE '%Emerald Rapids%';\nUPDATE instances SET sap = '1' WHERE name LIKE 'c4-standard-8' AND availableCpuPlatform LIKE '%Emerald Rapids%';\nUPDATE instances SET sap = '1' WHERE name LIKE 'c4-standard-16' AND availableCpuPlatform LIKE '%Emerald Rapids%';\nUPDATE instances SET sap = '1' WHERE name LIKE 'c4-standard-32' AND availableCpuPlatform LIKE '%Emerald Rapids%';\nUPDATE instances SET sap = '1' WHERE name LIKE 'c4-standard-48' AND availableCpuPlatform LIKE '%Emerald Rapids%';\nUPDATE instances SET sap = '1' WHERE name LIKE 'c4-standard-96' AND availableCpuPlatform LIKE '%Emerald Rapids%';\nUPDATE instances SET sap = '1' WHERE name LIKE 'c4-standard-192' AND availableCpuPlatform LIKE '%Emerald Rapids%';\n\n/* C2D */\n/* AMD EPYC Milan */\nUPDATE instances SET sap = '1', saps = '3543'   WHERE name LIKE 'c2d-highmem-2'    AND availableCpuPlatform LIKE '%Milan%';\nUPDATE instances SET sap = '1', saps = '7086'   WHERE name LIKE 'c2d-highmem-4'    AND availableCpuPlatform LIKE '%Milan%';\nUPDATE instances SET sap = '1', saps = '14171'  WHERE name LIKE 'c2d-highmem-8'    AND availableCpuPlatform LIKE '%Milan%';\nUPDATE instances SET sap = '1', saps = '28343'  WHERE name LIKE 'c2d-highmem-16'   AND availableCpuPlatform LIKE '%Milan%';\nUPDATE instances SET sap = '1', saps = '56686'  WHERE name LIKE 'c2d-highmem-32'   AND availableCpuPlatform LIKE '%Milan%';\nUPDATE instances SET sap = '1', saps = '99200'  WHERE name LIKE 'c2d-highmem-56'   AND availableCpuPlatform LIKE '%Milan%';\nUPDATE instances SET sap = '1', saps = '190150' WHERE name LIKE 'c2d-highmem-112'  AND availableCpuPlatform LIKE '%Milan%';\nUPDATE instances SET sap = '1', saps = '3545'   WHERE name LIKE 'c2d-standard-2'   AND availableCpuPlatform LIKE '%Milan%';\nUPDATE instances SET sap = '1', saps = '7089'   WHERE name LIKE 'c2d-standard-4'   AND availableCpuPlatform LIKE '%Milan%';\nUPDATE instances SET sap = '1', saps = '14179'  WHERE name LIKE 'c2d-standard-8'   AND availableCpuPlatform LIKE '%Milan%';\nUPDATE instances SET sap = '1', saps = '28357'  WHERE name LIKE 'c2d-standard-16'  AND availableCpuPlatform LIKE '%Milan%';\nUPDATE instances SET sap = '1', saps = '56714'  WHERE name LIKE 'c2d-standard-32'  AND availableCpuPlatform LIKE '%Milan%';\nUPDATE instances SET sap = '1', saps = '99250'  WHERE name LIKE 'c2d-standard-56'  AND availableCpuPlatform LIKE '%Milan%';\nUPDATE instances SET sap = '1', saps = '189400' WHERE name LIKE 'c2d-standard-112' AND availableCpuPlatform LIKE '%Milan%';\n\n/* C3D */\n/* AMD EPYC Genoa */\n/* TODO: Add SAPS */\nUPDATE instances SET sap = '1' WHERE name LIKE 'c3d-highmem-4';\nUPDATE instances SET sap = '1' WHERE name LIKE 'c3d-highmem-8';\nUPDATE instances SET sap = '1' WHERE name LIKE 'c3d-highmem-16';\nUPDATE instances SET sap = '1' WHERE name LIKE 'c3d-highmem-30';\nUPDATE instances SET sap = '1' WHERE name LIKE 'c3d-highmem-60';\nUPDATE instances SET sap = '1' WHERE name LIKE 'c3d-highmem-90';\nUPDATE instances SET sap = '1' WHERE name LIKE 'c3d-highmem-180';\nUPDATE instances SET sap = '1' WHERE name LIKE 'c3d-standard-4';\nUPDATE instances SET sap = '1' WHERE name LIKE 'c3d-standard-8';\nUPDATE instances SET sap = '1' WHERE name LIKE 'c3d-standard-16';\nUPDATE instances SET sap = '1' WHERE name LIKE 'c3d-standard-30';\nUPDATE instances SET sap = '1' WHERE name LIKE 'c3d-standard-60';\nUPDATE instances SET sap = '1' WHERE name LIKE 'c3d-standard-90';\nUPDATE instances SET sap = '1' WHERE name LIKE 'c3d-standard-180';\n\n/* N2 */\n/* Intel Cascade Lake */\nUPDATE instances SET sap = '1', saps = '2688'   WHERE name LIKE 'n2-highmem-2'    AND availableCpuPlatform LIKE '%Cascade Lake%';\nUPDATE instances SET sap = '1', saps = '5376'   WHERE name LIKE 'n2-highmem-4'    AND availableCpuPlatform LIKE '%Cascade Lake%';\nUPDATE instances SET sap = '1', saps = '10752'  WHERE name LIKE 'n2-highmem-8'    AND availableCpuPlatform LIKE '%Cascade Lake%';\nUPDATE instances SET sap = '1', saps = '21504'  WHERE name LIKE 'n2-highmem-16'   AND availableCpuPlatform LIKE '%Cascade Lake%';\nUPDATE instances SET sap = '1', saps = '43008'  WHERE name LIKE 'n2-highmem-32'   AND availableCpuPlatform LIKE '%Cascade Lake%';\nUPDATE instances SET sap = '1', saps = '64512'  WHERE name LIKE 'n2-highmem-48'   AND availableCpuPlatform LIKE '%Cascade Lake%';\nUPDATE instances SET sap = '1', saps = '86016'  WHERE name LIKE 'n2-highmem-64'   AND availableCpuPlatform LIKE '%Cascade Lake%';\nUPDATE instances SET sap = '1', saps = '107520' WHERE name LIKE 'n2-highmem-80'   AND availableCpuPlatform LIKE '%Cascade Lake%';\nUPDATE instances SET sap = '1', saps = '160080' WHERE name LIKE 'n2-highmem-96'   AND availableCpuPlatform LIKE '%Cascade Lake%';\nUPDATE instances SET sap = '1', saps = '183350' WHERE name LIKE 'n2-highmem-128'  AND availableCpuPlatform LIKE '%Cascade Lake%';\nUPDATE instances SET sap = '1', saps = '2632'   WHERE name LIKE 'n2-standard-2'   AND availableCpuPlatform LIKE '%Cascade Lake%';\nUPDATE instances SET sap = '1', saps = '5263'   WHERE name LIKE 'n2-standard-4'   AND availableCpuPlatform LIKE '%Cascade Lake%';\nUPDATE instances SET sap = '1', saps = '10525'  WHERE name LIKE 'n2-standard-8'   AND availableCpuPlatform LIKE '%Cascade Lake%';\nUPDATE instances SET sap = '1', saps = '21050'  WHERE name LIKE 'n2-standard-16'  AND availableCpuPlatform LIKE '%Cascade Lake%';\nUPDATE instances SET sap = '1', saps = '42100'  WHERE name LIKE 'n2-standard-32'  AND availableCpuPlatform LIKE '%Cascade Lake%';\nUPDATE instances SET sap = '1', saps = '63150'  WHERE name LIKE 'n2-standard-48'  AND availableCpuPlatform LIKE '%Cascade Lake%';\nUPDATE instances SET sap = '1', saps = '84200'  WHERE name LIKE 'n2-standard-64'  AND availableCpuPlatform LIKE '%Cascade Lake%';\nUPDATE instances SET sap = '1', saps = '105250' WHERE name LIKE 'n2-standard-80'  AND availableCpuPlatform LIKE '%Cascade Lake%';\nUPDATE instances SET sap = '1', saps = '159820' WHERE name LIKE 'n2-standard-96'  AND availableCpuPlatform LIKE '%Cascade Lake%';\nUPDATE instances SET sap = '1', saps = '183900' WHERE name LIKE 'n2-standard-128' AND availableCpuPlatform LIKE '%Cascade Lake%';\n/* Intel Ice Lake */\nUPDATE instances SET sap = '1', saps = '3574'   WHERE name LIKE 'n2-highmem-2'    AND availableCpuPlatform LIKE '%Ice Lake%';\nUPDATE instances SET sap = '1', saps = '7148'   WHERE name LIKE 'n2-highmem-4'    AND availableCpuPlatform LIKE '%Ice Lake%';\nUPDATE instances SET sap = '1', saps = '14296'  WHERE name LIKE 'n2-highmem-8'    AND availableCpuPlatform LIKE '%Ice Lake%';\nUPDATE instances SET sap = '1', saps = '28593'  WHERE name LIKE 'n2-highmem-16'   AND availableCpuPlatform LIKE '%Ice Lake%';\nUPDATE instances SET sap = '1', saps = '57185'  WHERE name LIKE 'n2-highmem-32'   AND availableCpuPlatform LIKE '%Ice Lake%';\nUPDATE instances SET sap = '1', saps = '85778'  WHERE name LIKE 'n2-highmem-48'   AND availableCpuPlatform LIKE '%Ice Lake%';\nUPDATE instances SET sap = '1', saps = '114370' WHERE name LIKE 'n2-highmem-64'   AND availableCpuPlatform LIKE '%Ice Lake%';\nUPDATE instances SET sap = '1', saps = '133400' WHERE name LIKE 'n2-highmem-80'   AND availableCpuPlatform LIKE '%Ice Lake%';\nUPDATE instances SET sap = '1', saps = '160080' WHERE name LIKE 'n2-highmem-96'   AND availableCpuPlatform LIKE '%Ice Lake%';\nUPDATE instances SET sap = '1', saps = '183350' WHERE name LIKE 'n2-highmem-128'  AND availableCpuPlatform LIKE '%Ice Lake%';\nUPDATE instances SET sap = '1', saps = '3576'   WHERE name LIKE 'n2-standard-2'   AND availableCpuPlatform LIKE '%Ice Lake%';\nUPDATE instances SET sap = '1', saps = '7152'   WHERE name LIKE 'n2-standard-4'   AND availableCpuPlatform LIKE '%Ice Lake%';\nUPDATE instances SET sap = '1', saps = '14304'  WHERE name LIKE 'n2-standard-8'   AND availableCpuPlatform LIKE '%Ice Lake%';\nUPDATE instances SET sap = '1', saps = '28608'  WHERE name LIKE 'n2-standard-16'  AND availableCpuPlatform LIKE '%Ice Lake%';\nUPDATE instances SET sap = '1', saps = '57215'  WHERE name LIKE 'n2-standard-32'  AND availableCpuPlatform LIKE '%Ice Lake%';\nUPDATE instances SET sap = '1', saps = '85823'  WHERE name LIKE 'n2-standard-48'  AND availableCpuPlatform LIKE '%Ice Lake%';\nUPDATE instances SET sap = '1', saps = '114430' WHERE name LIKE 'n2-standard-64'  AND availableCpuPlatform LIKE '%Ice Lake%';\nUPDATE instances SET sap = '1', saps = '133183' WHERE name LIKE 'n2-standard-80'  AND availableCpuPlatform LIKE '%Ice Lake%';\nUPDATE instances SET sap = '1', saps = '159820' WHERE name LIKE 'n2-standard-96'  AND availableCpuPlatform LIKE '%Ice Lake%';\nUPDATE instances SET sap = '1', saps = '183900' WHERE name LIKE 'n2-standard-128' AND availableCpuPlatform LIKE '%Ice Lake%';\n\n/* N2D */\n/* AMD EPYC Rome */\nUPDATE instances SET sap = '1', saps = '3111'   WHERE name LIKE 'n2d-highmem-2'    AND availableCpuPlatform LIKE '%Milan%';\nUPDATE instances SET sap = '1', saps = '6223'   WHERE name LIKE 'n2d-highmem-4'    AND availableCpuPlatform LIKE '%Milan%';\nUPDATE instances SET sap = '1', saps = '12445'  WHERE name LIKE 'n2d-highmem-8'    AND availableCpuPlatform LIKE '%Milan%';\nUPDATE instances SET sap = '1', saps = '24890'  WHERE name LIKE 'n2d-highmem-16'   AND availableCpuPlatform LIKE '%Milan%';\nUPDATE instances SET sap = '1', saps = '49780'  WHERE name LIKE 'n2d-highmem-32'   AND availableCpuPlatform LIKE '%Milan%';\nUPDATE instances SET sap = '1', saps = '74438'  WHERE name LIKE 'n2d-highmem-48'   AND availableCpuPlatform LIKE '%Milan%';\nUPDATE instances SET sap = '1', saps = '99250'  WHERE name LIKE 'n2d-highmem-64'   AND availableCpuPlatform LIKE '%Milan%';\nUPDATE instances SET sap = '1', saps = '115025' WHERE name LIKE 'n2d-highmem-80'   AND availableCpuPlatform LIKE '%Milan%';\nUPDATE instances SET sap = '1', saps = '138030' WHERE name LIKE 'n2d-highmem-96'   AND availableCpuPlatform LIKE '%Milan%';\nUPDATE instances SET sap = '1', saps = '3102'   WHERE name LIKE 'n2d-standard-2'   AND availableCpuPlatform LIKE '%Milan%';\nUPDATE instances SET sap = '1', saps = '6203'   WHERE name LIKE 'n2d-standard-4'   AND availableCpuPlatform LIKE '%Milan%';\nUPDATE instances SET sap = '1', saps = '12406'  WHERE name LIKE 'n2d-standard-8'   AND availableCpuPlatform LIKE '%Milan%';\nUPDATE instances SET sap = '1', saps = '24813'  WHERE name LIKE 'n2d-standard-16'  AND availableCpuPlatform LIKE '%Milan%';\nUPDATE instances SET sap = '1', saps = '49625'  WHERE name LIKE 'n2d-standard-32'  AND availableCpuPlatform LIKE '%Milan%';\nUPDATE instances SET sap = '1', saps = '74438'  WHERE name LIKE 'n2d-standard-48'  AND availableCpuPlatform LIKE '%Milan%';\nUPDATE instances SET sap = '1', saps = '99250'  WHERE name LIKE 'n2d-standard-64'  AND availableCpuPlatform LIKE '%Milan%';\nUPDATE instances SET sap = '1', saps = '115025' WHERE name LIKE 'n2d-standard-80'  AND availableCpuPlatform LIKE '%Milan%';\nUPDATE instances SET sap = '1', saps = '138030' WHERE name LIKE 'n2d-standard-96'  AND availableCpuPlatform LIKE '%Milan%';\nUPDATE instances SET sap = '1', saps = '177070' WHERE name LIKE 'n2d-standard-128' AND availableCpuPlatform LIKE '%Milan%';\nUPDATE instances SET sap = '1', saps = '229180' WHERE name LIKE 'n2d-standard-224' AND availableCpuPlatform LIKE '%Milan%';\n/* AMD EPYC Milan */\nUPDATE instances SET sap = '1', saps = '3160'   WHERE name LIKE 'n2d-highmem-2'    AND availableCpuPlatform LIKE '%Milan%';\nUPDATE instances SET sap = '1', saps = '6321'   WHERE name LIKE 'n2d-highmem-4'    AND availableCpuPlatform LIKE '%Milan%';\nUPDATE instances SET sap = '1', saps = '12641'  WHERE name LIKE 'n2d-highmem-8'    AND availableCpuPlatform LIKE '%Milan%';\nUPDATE instances SET sap = '1', saps = '25283'  WHERE name LIKE 'n2d-highmem-16'   AND availableCpuPlatform LIKE '%Milan%';\nUPDATE instances SET sap = '1', saps = '50565'  WHERE name LIKE 'n2d-highmem-32'   AND availableCpuPlatform LIKE '%Milan%';\nUPDATE instances SET sap = '1', saps = '75848'  WHERE name LIKE 'n2d-highmem-48'   AND availableCpuPlatform LIKE '%Milan%';\nUPDATE instances SET sap = '1', saps = '101130' WHERE name LIKE 'n2d-highmem-64'   AND availableCpuPlatform LIKE '%Milan%';\nUPDATE instances SET sap = '1', saps = '121108' WHERE name LIKE 'n2d-highmem-80'   AND availableCpuPlatform LIKE '%Milan%';\nUPDATE instances SET sap = '1', saps = '145330' WHERE name LIKE 'n2d-highmem-96'   AND availableCpuPlatform LIKE '%Milan%';\nUPDATE instances SET sap = '1', saps = '3166'   WHERE name LIKE 'n2d-standard-2'   AND availableCpuPlatform LIKE '%Milan%';\nUPDATE instances SET sap = '1', saps = '6333'   WHERE name LIKE 'n2d-standard-4'   AND availableCpuPlatform LIKE '%Milan%';\nUPDATE instances SET sap = '1', saps = '12665'  WHERE name LIKE 'n2d-standard-8'   AND availableCpuPlatform LIKE '%Milan%';\nUPDATE instances SET sap = '1', saps = '25330'  WHERE name LIKE 'n2d-standard-16'  AND availableCpuPlatform LIKE '%Milan%';\nUPDATE instances SET sap = '1', saps = '50660'  WHERE name LIKE 'n2d-standard-32'  AND availableCpuPlatform LIKE '%Milan%';\nUPDATE instances SET sap = '1', saps = '75990'  WHERE name LIKE 'n2d-standard-48'  AND availableCpuPlatform LIKE '%Milan%';\nUPDATE instances SET sap = '1', saps = '101320' WHERE name LIKE 'n2d-standard-64'  AND availableCpuPlatform LIKE '%Milan%';\nUPDATE instances SET sap = '1', saps = '120833' WHERE name LIKE 'n2d-standard-80'  AND availableCpuPlatform LIKE '%Milan%';\nUPDATE instances SET sap = '1', saps = '145000' WHERE name LIKE 'n2d-standard-96'  AND availableCpuPlatform LIKE '%Milan%';\nUPDATE instances SET sap = '1', saps = '185950' WHERE name LIKE 'n2d-standard-128' AND availableCpuPlatform LIKE '%Milan%';\nUPDATE instances SET sap = '1', saps = '272600' WHERE name LIKE 'n2d-standard-224' AND availableCpuPlatform LIKE '%Milan%';\n\n/* T2D */\n/* AMD EPYC Milan */\nUPDATE instances SET sap = '1', saps = '4325'   WHERE name LIKE 't2d-standard-2'  AND availableCpuPlatform LIKE '%Milan%';\nUPDATE instances SET sap = '1', saps = '8650'   WHERE name LIKE 't2d-standard-4'  AND availableCpuPlatform LIKE '%Milan%';\nUPDATE instances SET sap = '1', saps = '17300'  WHERE name LIKE 't2d-standard-8'  AND availableCpuPlatform LIKE '%Milan%';\nUPDATE instances SET sap = '1', saps = '34600'  WHERE name LIKE 't2d-standard-16' AND availableCpuPlatform LIKE '%Milan%';\nUPDATE instances SET sap = '1', saps = '69200'  WHERE name LIKE 't2d-standard-32' AND availableCpuPlatform LIKE '%Milan%';\nUPDATE instances SET sap = '1', saps = '90064'  WHERE name LIKE 't2d-standard-48' AND availableCpuPlatform LIKE '%Milan%';\nUPDATE instances SET sap = '1', saps = '112580' WHERE name LIKE 't2d-standard-60' AND availableCpuPlatform LIKE '%Milan%';\n\n/* N1 */\n/* Intel Broadwell or Intel Skylake */\nUPDATE instances SET sap = '1', saps = '2090'   WHERE name LIKE 'n1-highmem-2'   AND availableCpuPlatform LIKE '%Broadwell%';\nUPDATE instances SET sap = '1', saps = '4180'   WHERE name LIKE 'n1-highmem-4'   AND availableCpuPlatform LIKE '%Broadwell%';\nUPDATE instances SET sap = '1', saps = '8360'   WHERE name LIKE 'n1-highmem-8'   AND availableCpuPlatform LIKE '%Broadwell%';\nUPDATE instances SET sap = '1', saps = '16720'  WHERE name LIKE 'n1-highmem-16'  AND availableCpuPlatform LIKE '%Broadwell%';\nUPDATE instances SET sap = '1', saps = '33440'  WHERE name LIKE 'n1-highmem-32'  AND availableCpuPlatform LIKE '%Broadwell%';\nUPDATE instances SET sap = '1', saps = '66880'  WHERE name LIKE 'n1-highmem-64'  AND availableCpuPlatform LIKE '%Broadwell%';\nUPDATE instances SET sap = '1', saps = '100320' WHERE name LIKE 'n1-highmem-96'  AND availableCpuPlatform LIKE '%Skylake%';\nUPDATE instances SET sap = '1', saps = '8360'   WHERE name LIKE 'n1-standard-8'  AND availableCpuPlatform LIKE '%Broadwell%';\nUPDATE instances SET sap = '1', saps = '16720'  WHERE name LIKE 'n1-standard-16' AND availableCpuPlatform LIKE '%Broadwell%';\nUPDATE instances SET sap = '1', saps = '33440'  WHERE name LIKE 'n1-standard-32' AND availableCpuPlatform LIKE '%Broadwell%';\nUPDATE instances SET sap = '1', saps = '66880'  WHERE name LIKE 'n1-standard-64' AND availableCpuPlatform LIKE '%Broadwell%';\nUPDATE instances SET sap = '1', saps = '100320' WHERE name LIKE 'n1-standard-96' AND availableCpuPlatform LIKE '%Skylake%';\n\n/* M2 */\n/* Intel Cascade Lake */\nUPDATE instances SET sap = '1', saps = '223325' WHERE name LIKE 'm2-ultramem-208' AND availableCpuPlatform LIKE '%Cascade Lake%';\n/* Same core count. All with 416 cores. All with 446650 SAPS */\nUPDATE instances SET sap = '1', saps = '446650' WHERE name LIKE 'm2-ultramem-416' AND availableCpuPlatform LIKE '%Cascade Lake%';\nUPDATE instances SET sap = '1', saps = '446650' WHERE name LIKE 'm2-megamem-416'  AND availableCpuPlatform LIKE '%Cascade Lake%';\nUPDATE instances SET sap = '1', saps = '446650' WHERE name LIKE 'm2-hypermem-416' AND availableCpuPlatform LIKE '%Cascade Lake%';\n\n\n/* M1 (Intel Broadwell or Intel Skylake) */\nUPDATE instances SET sap = '1', saps = '105050' WHERE name LIKE 'm1-megamem-96'   AND availableCpuPlatform LIKE '%Skylake%';\nUPDATE instances SET sap = '1', saps = '34475'  WHERE name LIKE 'm1-ultramem-40'  AND availableCpuPlatform LIKE '%Broadwell%';\nUPDATE instances SET sap = '1', saps = '68950'  WHERE name LIKE 'm1-ultramem-80'  AND availableCpuPlatform LIKE '%Broadwell%';\nUPDATE instances SET sap = '1', saps = '137900' WHERE name LIKE 'm1-ultramem-160' AND availableCpuPlatform LIKE '%Broadwell%';\n\n/* M3 */\n/* Intel Ice Lake */\nUPDATE instances SET sap = '1', saps = '47835'  WHERE name LIKE 'm3-ultramem-32'  AND availableCpuPlatform LIKE '%Ice Lake%';\nUPDATE instances SET sap = '1', saps = '95670'  WHERE name LIKE 'm3-ultramem-64'  AND availableCpuPlatform LIKE '%Ice Lake%';\nUPDATE instances SET sap = '1', saps = '184800' WHERE name LIKE 'm3-ultramem-128' AND availableCpuPlatform LIKE '%Ice Lake%';\nUPDATE instances SET sap = '1', saps = '99170'  WHERE name LIKE 'm3-megamem-64'   AND availableCpuPlatform LIKE '%Ice Lake%';\nUPDATE instances SET sap = '1', saps = '187620' WHERE name LIKE 'm3-megamem-128'  AND availableCpuPlatform LIKE '%Ice Lake%';\n\n/* M4 */\n/* Intel Emerald Rapids */\n/* TODO: Add SAPS */\nUPDATE instances SET sap = '1' WHERE name LIKE 'm4-megamem-28' AND availableCpuPlatform LIKE '%Emerald Rapids%';\nUPDATE instances SET sap = '1' WHERE name LIKE 'm4-megamem-56' AND availableCpuPlatform LIKE '%Emerald Rapids%';\nUPDATE instances SET sap = '1' WHERE name LIKE 'm4-megamem-112' AND availableCpuPlatform LIKE '%Emerald Rapids%';\nUPDATE instances SET sap = '1' WHERE name LIKE 'm4-megamem-224' AND availableCpuPlatform LIKE '%Emerald Rapids%';\nUPDATE instances SET sap = '1' WHERE name LIKE 'm4-ultramem-56' AND availableCpuPlatform LIKE '%Emerald Rapids%';\nUPDATE instances SET sap = '1' WHERE name LIKE 'm4-ultramem-112' AND availableCpuPlatform LIKE '%Emerald Rapids%';\nUPDATE instances SET sap = '1' WHERE name LIKE 'm4-ultramem-224' AND availableCpuPlatform LIKE '%Emerald Rapids%';\n"
  },
  {
    "path": "instances/series/t2a.sql",
    "content": "/* Tau T2A General-purpose */\n/* https://cloud.google.com/compute/docs/general-purpose-machines#t2a_machines */\nUPDATE instances SET\nseries      = 't2a',\nfamily      = 'General-purpose',\ncpuPlatform = 'Ampere Altra',\nspot        = '1'\nWHERE name LIKE 't2a-%';\nUPDATE instances SET bandwidth = '10' WHERE name LIKE 't2a-%-1';\nUPDATE instances SET bandwidth = '10' WHERE name LIKE 't2a-%-2';\nUPDATE instances SET bandwidth = '10' WHERE name LIKE 't2a-%-4';\nUPDATE instances SET bandwidth = '16' WHERE name LIKE 't2a-%-8';\nUPDATE instances SET bandwidth = '32' WHERE name LIKE 't2a-%-16';\nUPDATE instances SET bandwidth = '32' WHERE name LIKE 't2a-%-32';\nUPDATE instances SET bandwidth = '32' WHERE name LIKE 't2a-%-48';\n"
  },
  {
    "path": "instances/series/t2d.sql",
    "content": "/* Tau T2D General-purpose */\n/* https://cloud.google.com/compute/docs/machine-types#machine_type_comparison */\n/* https://cloud.google.com/compute/docs/general-purpose-machines#t2d_machines */\nUPDATE instances SET\nseries      = 't2d',\nfamily      = 'General-purpose',\ncpuPlatform = 'Milan',\nspot        = '1'\nWHERE name LIKE 't2d-%';\nUPDATE instances SET bandwidth = '10' WHERE name LIKE 't2d-%-1';\nUPDATE instances SET bandwidth = '10' WHERE name LIKE 't2d-%-2';\nUPDATE instances SET bandwidth = '10' WHERE name LIKE 't2d-%-4';\nUPDATE instances SET bandwidth = '16' WHERE name LIKE 't2d-%-8';\nUPDATE instances SET bandwidth = '32' WHERE name LIKE 't2d-%-16';\nUPDATE instances SET bandwidth = '32' WHERE name LIKE 't2d-%-32';\nUPDATE instances SET bandwidth = '32' WHERE name LIKE 't2d-%-48';\nUPDATE instances SET bandwidth = '32' WHERE name LIKE 't2d-%-60';"
  },
  {
    "path": "instances/series/z3.sql",
    "content": "/* Z3 Storage-optimized */\n/* https://cloud.google.com/compute/docs/storage-optimized-machines */\nUPDATE instances SET\nseries      = 'z3',\nfamily      = 'Storage-optimized',\ncpuPlatform = 'Sapphire Rapids',\nlocalSsd    = '1',\nspot        = '1'\nWHERE name LIKE 'z3-%';\n\nUPDATE instances SET bandwidth = '23' WHERE name LIKE 'z3-highmem-8%';\nUPDATE instances SET bandwidth = '23' WHERE name LIKE 'z3-highmem-16%';\nUPDATE instances SET bandwidth = '23' WHERE name LIKE 'z3-highmem-22%';\nUPDATE instances SET bandwidth = '32' WHERE name LIKE 'z3-highmem-32%';\nUPDATE instances SET bandwidth = '32',  tier1 = '50'  WHERE name LIKE 'z3-highmem-44%';\nUPDATE instances SET bandwidth = '62',  tier1 = '100' WHERE name LIKE 'z3-highmem-88%';\nUPDATE instances SET bandwidth = '100', tier1 = '200' WHERE name LIKE 'z3-highmem-176%';\nUPDATE instances SET bandwidth = '100', tier1 = '200' WHERE name LIKE 'z3-highmem-192%';\n\nUPDATE instances SET localSsd = '3000'  WHERE name LIKE 'z3-highmem-14-standardlssd';\nUPDATE instances SET localSsd = '6000'  WHERE name LIKE 'z3-highmem-22-standardlssd';\nUPDATE instances SET localSsd = '9000'  WHERE name LIKE 'z3-highmem-44-standardlssd';\nUPDATE instances SET localSsd = '18000' WHERE name LIKE 'z3-highmem-88-standardlssd';\nUPDATE instances SET localSsd = '36000' WHERE name LIKE 'z3-highmem-176-standardlssd';\n\nUPDATE instances SET localSsd = '3000'  WHERE name LIKE 'z3-highmem-8-highlssd';\nUPDATE instances SET localSsd = '6000'  WHERE name LIKE 'z3-highmem-16-highlssd';\nUPDATE instances SET localSsd = '9000'  WHERE name LIKE 'z3-highmem-22-highlssd';\nUPDATE instances SET localSsd = '12000' WHERE name LIKE 'z3-highmem-32-highlssd';\nUPDATE instances SET localSsd = '18000' WHERE name LIKE 'z3-highmem-44-highlssd';\nUPDATE instances SET localSsd = '36000' WHERE name LIKE 'z3-highmem-88-highlssd';\nUPDATE instances SET localSsd = '72000' WHERE name LIKE 'z3-highmem-192-highlssd-metal';\n\n"
  },
  {
    "path": "regions/README.md",
    "content": "# Google Cloud Regions\n\nHere you can find the SQL files that add the different information from the Google websites.\nThe information is in addition to the data of the Google Cloud Compute API.\n\nFeel free to make changes if something is wrong or you want to expand it.\n\nThe SQL files are read during the [build](../build/) process.\n\n## Carbon Data (`carbon.sql`)\n\nMirror [carbon data across GCP regions](https://cloud.google.com/sustainability/region-carbon#data) from GitHub repo <https://github.com/GoogleCloudPlatform/region-carbon-info>:\n\n```shell\ncurl -o \"carbon.csv\" \\\n  \"https://raw.githubusercontent.com/GoogleCloudPlatform/region-carbon-info/main/data/yearly/2024.csv\"\n```\n\nRun `carbon.pl` to convert CSV to SQL:\n```shell\nperl carbon.pl > carbon.sql\n```\n\n## Region Locations (`regions.sql`)\n\nAdd long region location name, latitude and longitude.\n\nMirror [regions.json](https://github.com/GoogleCloudPlatform/region-picker/blob/main/data/regions.json) from GitHub repo <https://github.com/GoogleCloudPlatform/region-picker>:\n\n```shell\ncurl -O \"https://raw.githubusercontent.com/GoogleCloudPlatform/region-picker/main/data/regions.json\"\n```\n\nRun `regions.pl` to convert CSV to SQL:\n```shell\nperl regions.pl > regions.sql\n```\n\n## Country Codes (`country.sql`)\n\nSource: <https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2>\n\nAdd ISO 3166-1 alpha-2 country code to `country.sql`."
  },
  {
    "path": "regions/carbon.csv",
    "content": "Google Cloud Region,Location,Google CFE,Grid carbon intensity (gCO2eq / kWh)\r\nafrica-south1,Johannesburg,0.15,656.85\r\nasia-east1,Taiwan,0.17,439.29\r\nasia-east2,Hong Kong,0.01,505.02\r\nasia-northeast1,Tokyo,0.17,452.85\r\nasia-northeast2,Osaka,0.46,296.19\r\nasia-northeast3,Seoul,0.37,356.57\r\nasia-south1,Mumbai,0.09,678.76\r\nasia-south2,Delhi,0.29,531.83\r\nasia-southeast1,Singapore,0.04,366.85\r\nasia-southeast2,Jakarta,0.18,560.55\r\naustralia-southeast1,Sydney,0.34,497.50\r\naustralia-southeast2,Melbourne,0.39,454.37\r\neurope-central2,Warsaw,0.40,642.88\r\neurope-north1,Finland,0.98,39.32\r\neurope-north2,Stockholm,1.00,2.73\r\neurope-southwest1,Madrid,0.87,89.04\r\neurope-west1,Belgium,0.84,103.37\r\neurope-west2,London,0.79,105.94\r\neurope-west3,Frankfurt,0.68,275.82\r\neurope-west4,Eemshaven,0.83,208.81\r\neurope-west6,Zürich,0.98,15.05\r\neurope-west8,Milan,0.73,201.69\r\neurope-west9,Paris,0.96,16.30\r\neurope-west10,Berlin,0.68,275.82\r\neurope-west12,Turin,0.73,201.69\r\nme-central1,Doha,0.01,366\r\nme-central2,Dammam,0.01,382.23\r\nme-west1,Tel Aviv,0.07,433.75\r\nnorthamerica-northeast1,Montréal,0.99,5.48\r\nnorthamerica-northeast2,Toronto,0.84,58.56\r\nnorthamerica-south1,Mexico,0.19,305.00\r\nsouthamerica-east1,Sāo Paulo,0.88,67.32\r\nsouthamerica-west1,Santiago,0.92,238.00\r\nus-central1,Iowa,0.87,412.72\r\nus-central2,Oklahoma,0.88,372.23\r\nus-east1,South Carolina,0.31,575.77\r\nus-east2,Georgia,0.42,340.42\r\nus-east4,Northern Virginia,0.62,323.05\r\nus-east5,Columbus,0.62,323.05\r\nus-south1,Dallas,0.94,302.95\r\nus-west1,Oregon,0.87,79.23\r\nus-west2,Los Angeles,0.63,169.28\r\nus-west3,Salt Lake City,0.33,555.17\r\nus-west4,Las Vegas,0.64,357.30\r\n"
  },
  {
    "path": "regions/carbon.pl",
    "content": "#!/usr/bin/env perl\n\n# Copyright 2022-2025 Nils Knieling. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nuse strict;\nuse DBI;\n\nmy $dbh = DBI->connect(\"dbi:CSV:\", undef, undef, {\n\tf_ext        => \".csv/r\",\n\tcsv_sep_char => \",\",\n\tcsv_class    => \"Text::CSV_XS\",\n\tRaiseError   => 1,\n}) or die \"ERROR: Cannot connect $DBI::errstr\\n\";\n\n# CSV col names:\n#   Google Cloud Region,\n#   Location,\n#   Google CFE,\n#   Grid carbon intensity (gCO2eq / kWh)\nmy $sth = $dbh->prepare(\"SELECT * FROM carbon\");\n$sth->execute();\n$sth->bind_columns(\\my ($region, $location, $cfe, $co2_kwh));\nprint \"/*\\n\";\nprint \" * GENERATED WITH carbon.pl\\n\";\nprint \" * Please see: https://github.com/Cyclenerd/google-cloud-compute-machine-types/blob/master/regions/README.md\\n\";\nprint \" */\\n\";\nwhile ($sth->fetch) {\n\tif ($region) {\n\t\t# Google Cloud Region\n\t\t$region  =~ s/\\s//;\n\t\t# Google CFE%\n\t\tif ($cfe =~ /^([0,1]\\.\\d{2}$)/) {\n\t\t\t$cfe = $1 * 100;\n\t\t} else {\n\t\t\t$cfe = \"\";\n\t\t}\n\t\t# Grid carbon intensity (gCO2eq/kWh)\n\t\tif ($co2_kwh =~ /^(\\d+(\\.\\d+)?)$/) {\n\t\t\t$co2_kwh = $1;\n\t\t} else {\n\t\t\t$co2_kwh = \"\";\n\t\t}\n\t\t# https://cloud.google.com/sustainability/region-carbon#region-picker\n\t\t# 18.12.2025: https://archive.is/HKHtV\n\t\t# For a location to be considered \"low carbon\",\n\t\t# it must belong to a region with a Google CFE% of at least 75%,\n\t\tmy $low_co2 = \"0\";\n\t\tif ($cfe >= \"75\") {\n\t\t\t$low_co2 = \"1\";\n\t\t# or, if CFE% information is not available,\n\t\t# a grid carbon intensity of maximum 200 gCO2eq/kWh.\n\t\t} elsif (!$cfe && $co2_kwh <= \"200\") {\n\t\t\t$low_co2 = \"1\";\n\t\t}\n\t\tprint \"UPDATE instances SET regionCfe = '$cfe', regionCo2Kwh = '$co2_kwh', regionLowCo2 = '$low_co2' WHERE region = '$region';\\n\";\n\t}\n}\n$dbh->disconnect;"
  },
  {
    "path": "regions/carbon.sql",
    "content": "/*\n * GENERATED WITH carbon.pl\n * Please see: https://github.com/Cyclenerd/google-cloud-compute-machine-types/blob/master/regions/README.md\n */\nUPDATE instances SET regionCfe = '15', regionCo2Kwh = '656.85', regionLowCo2 = '0' WHERE region = 'africa-south1';\nUPDATE instances SET regionCfe = '17', regionCo2Kwh = '439.29', regionLowCo2 = '0' WHERE region = 'asia-east1';\nUPDATE instances SET regionCfe = '1', regionCo2Kwh = '505.02', regionLowCo2 = '0' WHERE region = 'asia-east2';\nUPDATE instances SET regionCfe = '17', regionCo2Kwh = '452.85', regionLowCo2 = '0' WHERE region = 'asia-northeast1';\nUPDATE instances SET regionCfe = '46', regionCo2Kwh = '296.19', regionLowCo2 = '0' WHERE region = 'asia-northeast2';\nUPDATE instances SET regionCfe = '37', regionCo2Kwh = '356.57', regionLowCo2 = '0' WHERE region = 'asia-northeast3';\nUPDATE instances SET regionCfe = '9', regionCo2Kwh = '678.76', regionLowCo2 = '0' WHERE region = 'asia-south1';\nUPDATE instances SET regionCfe = '29', regionCo2Kwh = '531.83', regionLowCo2 = '0' WHERE region = 'asia-south2';\nUPDATE instances SET regionCfe = '4', regionCo2Kwh = '366.85', regionLowCo2 = '0' WHERE region = 'asia-southeast1';\nUPDATE instances SET regionCfe = '18', regionCo2Kwh = '560.55', regionLowCo2 = '0' WHERE region = 'asia-southeast2';\nUPDATE instances SET regionCfe = '34', regionCo2Kwh = '497.50', regionLowCo2 = '0' WHERE region = 'australia-southeast1';\nUPDATE instances SET regionCfe = '39', regionCo2Kwh = '454.37', regionLowCo2 = '0' WHERE region = 'australia-southeast2';\nUPDATE instances SET regionCfe = '40', regionCo2Kwh = '642.88', regionLowCo2 = '0' WHERE region = 'europe-central2';\nUPDATE instances SET regionCfe = '98', regionCo2Kwh = '39.32', regionLowCo2 = '1' WHERE region = 'europe-north1';\nUPDATE instances SET regionCfe = '100', regionCo2Kwh = '2.73', regionLowCo2 = '1' WHERE region = 'europe-north2';\nUPDATE instances SET regionCfe = '87', regionCo2Kwh = '89.04', regionLowCo2 = '1' WHERE region = 'europe-southwest1';\nUPDATE instances SET regionCfe = '84', regionCo2Kwh = '103.37', regionLowCo2 = '1' WHERE region = 'europe-west1';\nUPDATE instances SET regionCfe = '79', regionCo2Kwh = '105.94', regionLowCo2 = '1' WHERE region = 'europe-west2';\nUPDATE instances SET regionCfe = '68', regionCo2Kwh = '275.82', regionLowCo2 = '0' WHERE region = 'europe-west3';\nUPDATE instances SET regionCfe = '83', regionCo2Kwh = '208.81', regionLowCo2 = '1' WHERE region = 'europe-west4';\nUPDATE instances SET regionCfe = '98', regionCo2Kwh = '15.05', regionLowCo2 = '1' WHERE region = 'europe-west6';\nUPDATE instances SET regionCfe = '73', regionCo2Kwh = '201.69', regionLowCo2 = '0' WHERE region = 'europe-west8';\nUPDATE instances SET regionCfe = '96', regionCo2Kwh = '16.30', regionLowCo2 = '1' WHERE region = 'europe-west9';\nUPDATE instances SET regionCfe = '68', regionCo2Kwh = '275.82', regionLowCo2 = '0' WHERE region = 'europe-west10';\nUPDATE instances SET regionCfe = '73', regionCo2Kwh = '201.69', regionLowCo2 = '0' WHERE region = 'europe-west12';\nUPDATE instances SET regionCfe = '1', regionCo2Kwh = '366', regionLowCo2 = '0' WHERE region = 'me-central1';\nUPDATE instances SET regionCfe = '1', regionCo2Kwh = '382.23', regionLowCo2 = '0' WHERE region = 'me-central2';\nUPDATE instances SET regionCfe = '7', regionCo2Kwh = '433.75', regionLowCo2 = '0' WHERE region = 'me-west1';\nUPDATE instances SET regionCfe = '99', regionCo2Kwh = '5.48', regionLowCo2 = '1' WHERE region = 'northamerica-northeast1';\nUPDATE instances SET regionCfe = '84', regionCo2Kwh = '58.56', regionLowCo2 = '1' WHERE region = 'northamerica-northeast2';\nUPDATE instances SET regionCfe = '19', regionCo2Kwh = '305.00', regionLowCo2 = '0' WHERE region = 'northamerica-south1';\nUPDATE instances SET regionCfe = '88', regionCo2Kwh = '67.32', regionLowCo2 = '1' WHERE region = 'southamerica-east1';\nUPDATE instances SET regionCfe = '92', regionCo2Kwh = '238.00', regionLowCo2 = '1' WHERE region = 'southamerica-west1';\nUPDATE instances SET regionCfe = '87', regionCo2Kwh = '412.72', regionLowCo2 = '1' WHERE region = 'us-central1';\nUPDATE instances SET regionCfe = '88', regionCo2Kwh = '372.23', regionLowCo2 = '1' WHERE region = 'us-central2';\nUPDATE instances SET regionCfe = '31', regionCo2Kwh = '575.77', regionLowCo2 = '0' WHERE region = 'us-east1';\nUPDATE instances SET regionCfe = '42', regionCo2Kwh = '340.42', regionLowCo2 = '0' WHERE region = 'us-east2';\nUPDATE instances SET regionCfe = '62', regionCo2Kwh = '323.05', regionLowCo2 = '0' WHERE region = 'us-east4';\nUPDATE instances SET regionCfe = '62', regionCo2Kwh = '323.05', regionLowCo2 = '0' WHERE region = 'us-east5';\nUPDATE instances SET regionCfe = '94', regionCo2Kwh = '302.95', regionLowCo2 = '1' WHERE region = 'us-south1';\nUPDATE instances SET regionCfe = '87', regionCo2Kwh = '79.23', regionLowCo2 = '1' WHERE region = 'us-west1';\nUPDATE instances SET regionCfe = '63', regionCo2Kwh = '169.28', regionLowCo2 = '0' WHERE region = 'us-west2';\nUPDATE instances SET regionCfe = '33', regionCo2Kwh = '555.17', regionLowCo2 = '0' WHERE region = 'us-west3';\nUPDATE instances SET regionCfe = '64', regionCo2Kwh = '357.30', regionLowCo2 = '0' WHERE region = 'us-west4';\n"
  },
  {
    "path": "regions/country.sql",
    "content": "/* https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2 */\n\nUPDATE instances SET regionLocationCountryCode = 'AU' WHERE regionLocationLong LIKE '%Australia%';\nUPDATE instances SET regionLocationCountryCode = 'BE' WHERE regionLocationLong LIKE '%Belgium%';\nUPDATE instances SET regionLocationCountryCode = 'BR' WHERE regionLocationLong LIKE '%Brazil%';\nUPDATE instances SET regionLocationCountryCode = 'CA' WHERE regionLocationLong LIKE '%Canada%';\nUPDATE instances SET regionLocationCountryCode = 'CH' WHERE regionLocationLong LIKE '%Switzerland%';\nUPDATE instances SET regionLocationCountryCode = 'CL' WHERE regionLocationLong LIKE '%Chile%';\nUPDATE instances SET regionLocationCountryCode = 'DE' WHERE regionLocationLong LIKE '%Germany%';\nUPDATE instances SET regionLocationCountryCode = 'ES' WHERE regionLocationLong LIKE '%Spain%';\nUPDATE instances SET regionLocationCountryCode = 'FI' WHERE regionLocationLong LIKE '%Finland%';\nUPDATE instances SET regionLocationCountryCode = 'FR' WHERE regionLocationLong LIKE '%France%';\nUPDATE instances SET regionLocationCountryCode = 'GB' WHERE regionLocationLong LIKE '%UK%';\nUPDATE instances SET regionLocationCountryCode = 'HK' WHERE regionLocationLong LIKE '%Hong Kong%';\nUPDATE instances SET regionLocationCountryCode = 'ID' WHERE regionLocationLong LIKE '%Indonesia%';\nUPDATE instances SET regionLocationCountryCode = 'IL' WHERE regionLocationLong LIKE '%Israel%';\nUPDATE instances SET regionLocationCountryCode = 'IN' WHERE regionLocationLong LIKE '%India%';\nUPDATE instances SET regionLocationCountryCode = 'IT' WHERE regionLocationLong LIKE '%Italy%';\nUPDATE instances SET regionLocationCountryCode = 'JP' WHERE regionLocationLong LIKE '%Japan%';\nUPDATE instances SET regionLocationCountryCode = 'KR' WHERE regionLocationLong LIKE '%South Korea%';\nUPDATE instances SET regionLocationCountryCode = 'MX' WHERE regionLocationLong LIKE '%Mexico%';\nUPDATE instances SET regionLocationCountryCode = 'NL' WHERE regionLocationLong LIKE '%Netherlands%';\nUPDATE instances SET regionLocationCountryCode = 'PL' WHERE regionLocationLong LIKE '%Poland%';\nUPDATE instances SET regionLocationCountryCode = 'QA' WHERE regionLocationLong LIKE '%Qatar%';\nUPDATE instances SET regionLocationCountryCode = 'SA' WHERE regionLocationLong LIKE '%Saudi Arabia%';\nUPDATE instances SET regionLocationCountryCode = 'SE' WHERE regionLocationLong LIKE '%Sweden%';\nUPDATE instances SET regionLocationCountryCode = 'SG' WHERE regionLocationLong LIKE '%Singapore%';\nUPDATE instances SET regionLocationCountryCode = 'TH' WHERE regionLocationLong LIKE '%Thailand%';\nUPDATE instances SET regionLocationCountryCode = 'TW' WHERE regionLocationLong LIKE '%Taiwan%';\nUPDATE instances SET regionLocationCountryCode = 'US' WHERE regionLocationLong LIKE '%USA%';\nUPDATE instances SET regionLocationCountryCode = 'ZA' WHERE regionLocationLong LIKE '%South Africa%';\n"
  },
  {
    "path": "regions/extra.sql",
    "content": "/* Extra Data for Regions */\n\nUPDATE instances SET regionLocationLong = 'Doha, Qatar',          regionLat = '25.2409741', regionLng = '51.5126395' WHERE region LIKE 'me-central1';\nUPDATE instances SET regionLocationLong = 'Dammam, Saudi Arabia', regionLat = '26.3622236', regionLng = '49.6807149' WHERE region LIKE 'me-central2';\nUPDATE instances SET regionLocationLong = 'Tel Aviv, Israel',     regionLat = '32.0858103', regionLng = '34.7697987' WHERE region LIKE 'me-west1';\nUPDATE instances SET regionLocationLong = 'Bangkok, Thailand',    regionLat = '13.7525',    regionLng = '100.494167' WHERE region LIKE 'asia-southeast3';\n\n/* https://www.domstol.se/mark--och-miljodomstolen-vid-nacka-tingsratt/nyheter/2021/06/mark--och-miljodomstolen-lamnar-tillstand-till-datacenter-i-horndal-avesta-kommun/ */\nUPDATE instances SET regionLocationLong = 'Stockholm, Sweden', regionLat = '60.2936275', regionLng = '16.3941995' WHERE region LIKE 'europe-north2';\n\n/* Source: On-site inspection ;) */\nUPDATE instances SET regionLocationLong = 'Berlin, Germany', regionLat = '52.2630', regionLng = '13.5727' WHERE region LIKE 'europe-west10';\n\n/* https://cloud.google.com/blog/products/infrastructure/heita-south-africa-new-cloud-region */\nUPDATE instances SET regionLocationLong = 'Johannesburg, South Africa', regionLat = '-26.1714376', regionLng = '27.8841339' WHERE region LIKE 'africa-south1';\n\n/* Source: Google Maps search 'Google Data Center' and 2021-carbon-free-energy-data-centers.pdf */\nUPDATE instances SET regionLocationLong = 'St. Ghislain, Belgium',     regionLat = '50.4690', regionLng = '3.8658'    WHERE region LIKE 'europe-west1';\nUPDATE instances SET regionLocationLong = 'Eemshaven, Netherlands',    regionLat = '53.4259', regionLng = '6.8642'    WHERE region LIKE 'europe-west4';\nUPDATE instances SET regionLocationLong = 'Hamina, Finland',           regionLat = '60.5376', regionLng = '27.1163'   WHERE region LIKE 'europe-north1';\nUPDATE instances SET regionLocationLong = 'The Dalles, Oregon, USA',   regionLat = '45.6407', regionLng = '-121.1991' WHERE region LIKE 'us-west1';\nUPDATE instances SET regionLocationLong = 'Las Vegas, Nevada, USA',    regionLat = '36.0563', regionLng = '-115.0090' WHERE region LIKE 'us-west4';\nUPDATE instances SET regionLocationLong = 'Council Bluffs, Iowa, USA', regionLat = '41.2210', regionLng = '-95.8639'  WHERE region LIKE 'us-central1';\n\n/*\nSource: https://cloud.google.com/blog/products/infrastructure/new-google-cloud-region-in-turin-italy-now-open\n*/\nUPDATE instances SET regionLocationLong = 'Turin, Italy', regionLat = '45.146729', regionLng = '7.742147' WHERE region LIKE 'europe-west12';\n\n/*\nSource: https://cloud.google.com/blog/products/infrastructure/new-google-cloud-region-in-madrid-spain-now-open\n[...] Built in partnership with Telefónica [...]\n*/\nUPDATE instances SET regionLat = '40.5195333', regionLng = '-3.3409366' WHERE region LIKE 'europe-southwest1';\n\n/* https://cloud.google.com/blog/products/infrastructure/expanding-cloud-infrastructure-around-the-world */\nUPDATE instances SET regionLat = '20.583333', regionLng = '-100.383333', regionLocationLong = 'Querétaro, Mexico' WHERE region LIKE 'northamerica-south1';\n\n\n/* https://cloud.google.com/compute/docs/regions-zones/ */\nUPDATE instances SET regionLocationLong = 'Ashburn, Northern Virginia, USA'            WHERE region LIKE 'us-east4';\nUPDATE instances SET regionLocationLong = 'Changhua County, Taiwan, Republic of China' WHERE region LIKE 'asia-east1';\nUPDATE instances SET regionLocationLong = 'Jurong West, Singapore'                     WHERE region LIKE 'asia-southeast1';\nUPDATE instances SET regionLocationLong = 'Moncks Corner, South Carolina, USA'         WHERE region LIKE 'us-east1';\nUPDATE instances SET regionLocationLong = 'Montréal, Québec, Canada'                   WHERE region LIKE 'northamerica-northeast1';\nUPDATE instances SET regionLocationLong = 'Osasco, São Paulo, Brazil'                  WHERE region LIKE 'southamerica-east1';\nUPDATE instances SET regionLocationLong = 'Toronto, Ontario, Canada'                   WHERE region LIKE 'northamerica-northeast2';\n\n/*\n * europe-west9 (Paris, France) is Global Switch data center in Clichy\n * Source: https://lafibre.info/datacenter/incendie-maitrise-globalswitch-clichy/\n */\nUPDATE instances SET regionLat = '48.8996', regionLng = '2.2961' WHERE region LIKE 'europe-west9';\n"
  },
  {
    "path": "regions/regions.json",
    "content": "{\n   \"africa-south1\":{\n      \"name\":\"Johannesburg, South Africa\",\n      \"flag\": \"https://upload.wikimedia.org/wikipedia/commons/a/af/Flag_of_South_Africa.svg\",\n      \"latitude\": 26.2056,\n      \"longitude\": 28.0337\n   },\n   \"asia-east1\":{\n      \"name\":\"Taiwan, Republic of China\",\n      \"flag\": \"https://upload.wikimedia.org/wikipedia/commons/7/72/Flag_of_the_Republic_of_China.svg\",\n      \"latitude\": 23.69781,\n      \"longitude\": 120.960515\n   },\n   \"asia-east2\":{\n      \"name\":\"Hong Kong, People's Republic of China\",\n      \"flag\": \"https://upload.wikimedia.org/wikipedia/commons/5/5b/Flag_of_Hong_Kong.svg\",\n      \"latitude\": 22.396428,\n      \"longitude\": 114.109497\n   },\n   \"asia-northeast1\":{\n      \"name\":\"Tokyo, Japan\",\n      \"flag\": \"https://upload.wikimedia.org/wikipedia/en/9/9e/Flag_of_Japan.svg\",\n      \"latitude\": 35.6762,\n      \"longitude\": 139.6503\n   },\n   \"asia-northeast2\":{\n      \"name\":\"Osaka, Japan\",\n      \"flag\": \"https://upload.wikimedia.org/wikipedia/en/9/9e/Flag_of_Japan.svg\",\n      \"latitude\": 34.6937,\n      \"longitude\": 135.5023\n   },\n   \"asia-northeast3\":{\n      \"name\":\"Seoul, South Korea\",\n      \"flag\": \"https://upload.wikimedia.org/wikipedia/commons/0/09/Flag_of_South_Korea.svg\",\n      \"latitude\": 37.5665,\n      \"longitude\": 126.9780\n   },\n   \"asia-south1\":{\n      \"name\":\"Mumbai, India\",\n      \"flag\": \"https://upload.wikimedia.org/wikipedia/en/4/41/Flag_of_India.svg\",\n      \"latitude\": 19.0760,\n      \"longitude\": 72.8777\n   },\n   \"asia-south2\":{\n      \"name\":\"Delhi, India\",\n      \"flag\": \"https://upload.wikimedia.org/wikipedia/en/4/41/Flag_of_India.svg\",\n      \"latitude\": 28.7041,\n      \"longitude\": 77.1025\n   },\n   \"asia-southeast1\":{\n      \"name\":\"Singapore\",\n      \"flag\": \"https://upload.wikimedia.org/wikipedia/commons/4/48/Flag_of_Singapore.svg\",\n      \"latitude\": 1.3521,\n      \"longitude\": 103.8198\n   },\n   \"asia-southeast2\":{\n      \"name\":\"Jakarta, Indonesia\",\n      \"flag\": \"https://upload.wikimedia.org/wikipedia/commons/9/9f/Flag_of_Indonesia.svg\",\n      \"latitude\": -6.2088,\n      \"longitude\": 106.8456\n   },\n   \"australia-southeast1\":{\n      \"name\":\"Sydney, Australia\",\n      \"flag\": \"https://upload.wikimedia.org/wikipedia/commons/8/88/Flag_of_Australia_%28converted%29.svg\",\n      \"latitude\": -33.8688,\n      \"longitude\": 151.2093\n   },\n   \"australia-southeast2\":{\n      \"name\":\"Melbourne, Australia\",\n      \"flag\": \"https://upload.wikimedia.org/wikipedia/commons/8/88/Flag_of_Australia_%28converted%29.svg\",\n      \"latitude\": -37.8136,\n      \"longitude\": 144.9631\n   },\n   \"europe-central2\":{\n      \"name\":\"Warsaw, Poland\",\n      \"flag\": \"https://upload.wikimedia.org/wikipedia/en/1/12/Flag_of_Poland.svg\",\n      \"latitude\": 52.2297,\n      \"longitude\": 21.0122\n   },\n   \"europe-north1\":{\n      \"name\":\"Hamina, Finland\",\n      \"flag\": \"https://upload.wikimedia.org/wikipedia/commons/b/bc/Flag_of_Finland.svg\",\n      \"latitude\": 60.5693,\n      \"longitude\": 27.1878\n   },\n   \"europe-southwest1\":{\n      \"name\":\"Madrid, Spain\",\n      \"flag\": \"https://upload.wikimedia.org/wikipedia/en/9/9a/Flag_of_Spain.svg\",\n      \"latitude\": 40.4167,\n      \"longitude\": -3.7025\n   },\n   \"europe-west1\":{\n      \"name\":\"Belgium\",\n      \"flag\": \"https://upload.wikimedia.org/wikipedia/commons/9/92/Flag_of_Belgium_%28civil%29.svg\",\n      \"latitude\": 50.5039,\n      \"longitude\": 4.4699\n   },\n   \"europe-west2\":{\n      \"name\":\"London, UK\",\n      \"flag\": \"https://upload.wikimedia.org/wikipedia/en/a/ae/Flag_of_the_United_Kingdom.svg\",\n      \"latitude\": 51.5074,\n      \"longitude\": -0.1278\n   },\n   \"europe-west3\":{\n      \"name\":\"Frankfurt, Germany\",\n      \"flag\": \"https://upload.wikimedia.org/wikipedia/en/b/ba/Flag_of_Germany.svg\",\n      \"latitude\": 50.1109,\n      \"longitude\": 8.6821\n   },\n   \"europe-west4\":{\n      \"name\":\"Netherlands\",\n      \"flag\": \"https://upload.wikimedia.org/wikipedia/commons/2/20/Flag_of_the_Netherlands.svg\",\n      \"latitude\": 52.1326,\n      \"longitude\": 5.2913\n   },\n   \"europe-west6\":{\n      \"name\":\"Zurich, Switzerland\",\n      \"flag\": \"https://upload.wikimedia.org/wikipedia/commons/f/f3/Flag_of_Switzerland.svg\",\n      \"latitude\": 47.3769,\n      \"longitude\": 8.5417\n   },\n   \"europe-west8\":{\n      \"name\":\"Milan, Italy\",\n      \"flag\": \"https://upload.wikimedia.org/wikipedia/en/0/03/Flag_of_Italy.svg\",\n      \"latitude\": 45.4669,\n      \"longitude\": 9.19\n   },\n   \"europe-west9\":{\n      \"name\":\"Paris, France\",\n      \"flag\": \"https://upload.wikimedia.org/wikipedia/en/c/c3/Flag_of_France.svg\",\n      \"latitude\": 48.8566,\n      \"longitude\": 2.3522\n   },\n   \"europe-west10\":{\n      \"name\":\"Berlin, Germany\",\n      \"flag\": \"https://upload.wikimedia.org/wikipedia/en/b/ba/Flag_of_Germany.svg\",\n      \"latitude\": 52.5200,\n      \"longitude\": 13.4050\n   },\n   \"europe-west12\":{\n      \"name\":\"Turin, Italy\",\n      \"flag\": \"https://upload.wikimedia.org/wikipedia/en/0/03/Flag_of_Italy.svg\",\n      \"latitude\": 45.0703,\n      \"longitude\": 7.6869\n   },\n   \"me-west1\":{\n      \"name\":\"Tel Aviv, Israel\",\n      \"flag\": \"https://upload.wikimedia.org/wikipedia/commons/d/d4/Flag_of_Israel.svg\",\n      \"latitude\": 32.0853,\n      \"longitude\": 34.7818\n   },\n   \"me-central1\":{\n      \"name\":\"Doha, Qatar\",\n      \"flag\": \"https://upload.wikimedia.org/wikipedia/commons/6/65/Flag_of_Qatar.svg\",\n      \"latitude\": 25.2854,\n      \"longitude\": 51.5310,\n      \"gCO2_kWh\": 471\n   },\n   \"me-central2\":{\n      \"name\":\"Dammam, Kingdom of Saudi Arabia\",\n      \"flag\": \"https://upload.wikimedia.org/wikipedia/commons/0/0d/Flag_of_Saudi_Arabia.svg\",\n      \"latitude\": 26.4207,\n      \"longitude\": 50.0888\n   },\n   \"northamerica-northeast1\":{\n      \"name\":\"Montréal, Canada\",\n      \"flag\": \"https://upload.wikimedia.org/wikipedia/commons/d/d9/Flag_of_Canada_%28Pantone%29.svg\",\n      \"latitude\": 45.5017,\n      \"longitude\": -73.5673\n   },\n   \"northamerica-northeast2\":{\n      \"name\":\"Toronto, Canada\",\n      \"flag\": \"https://upload.wikimedia.org/wikipedia/commons/d/d9/Flag_of_Canada_%28Pantone%29.svg\",\n      \"latitude\": 43.7417,\n      \"longitude\": -79.3733\n   },\n   \"southamerica-east1\":{\n      \"name\":\"São Paulo, Brazil\",\n      \"flag\": \"https://upload.wikimedia.org/wikipedia/en/0/05/Flag_of_Brazil.svg\",\n      \"latitude\": -23.5505,\n      \"longitude\": -46.6333\n   },\n   \"southamerica-west1\":{\n      \"name\":\"Santiago, Chile\",\n      \"flag\": \"https://upload.wikimedia.org/wikipedia/commons/7/78/Flag_of_Chile.svg\",\n      \"latitude\": -33.45,\n      \"longitude\": -70.6667\n   },\n   \"us-central1\":{\n      \"name\":\"Iowa, USA\",\n      \"flag\": \"https://upload.wikimedia.org/wikipedia/en/a/a4/Flag_of_the_United_States.svg\",\n      \"latitude\": 41.8780,\n      \"longitude\": -93.0977\n   },\n   \"us-east1\":{\n      \"name\":\"South Carolina, USA\",\n      \"flag\": \"https://upload.wikimedia.org/wikipedia/en/a/a4/Flag_of_the_United_States.svg\",\n      \"latitude\": 33.8361,\n      \"longitude\": -81.1637\n   },\n   \"us-east4\":{\n      \"name\":\"Northern Virginia, USA\",\n      \"flag\": \"https://upload.wikimedia.org/wikipedia/en/a/a4/Flag_of_the_United_States.svg\",\n      \"latitude\": 38.8334,\n      \"longitude\": -77.2365\n   },\n   \"us-east5\":{\n      \"name\":\"Columbus, Ohio, USA\",\n      \"flag\": \"https://upload.wikimedia.org/wikipedia/en/a/a4/Flag_of_the_United_States.svg\",\n      \"latitude\": 39.9622,\n      \"longitude\": -83.0006\n   },\n   \"us-south1\":{\n      \"name\":\"Dallas, Texas, USA\",\n      \"flag\": \"https://upload.wikimedia.org/wikipedia/en/a/a4/Flag_of_the_United_States.svg\",\n      \"latitude\": 32.7792,\n      \"longitude\": -96.8089\n   },\n   \"us-west1\":{\n      \"name\":\"Oregon, USA\",\n      \"flag\": \"https://upload.wikimedia.org/wikipedia/en/a/a4/Flag_of_the_United_States.svg\",\n      \"latitude\": 43.8041,\n      \"longitude\": -120.5542\n   },\n   \"us-west2\":{\n      \"name\":\"Los Angeles, California, USA\",\n      \"flag\": \"https://upload.wikimedia.org/wikipedia/en/a/a4/Flag_of_the_United_States.svg\",\n      \"latitude\": 34.0522,\n      \"longitude\": -118.2437\n   },\n   \"us-west3\":{\n      \"name\":\"Salt Lake City, Utah, USA\",\n      \"flag\": \"https://upload.wikimedia.org/wikipedia/en/a/a4/Flag_of_the_United_States.svg\",\n      \"latitude\": 40.7608,\n      \"longitude\": -111.8910\n   },\n   \"us-west4\":{\n      \"name\":\"Las Vegas, Nevada, USA\",\n      \"flag\": \"https://upload.wikimedia.org/wikipedia/en/a/a4/Flag_of_the_United_States.svg\",\n      \"latitude\": 36.1699,\n      \"longitude\": -115.1398\n   }\n}\n"
  },
  {
    "path": "regions/regions.pl",
    "content": "#!/usr/bin/env perl\n\n# Copyright 2022-2025 Nils Knieling. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nuse utf8;\nbinmode(STDOUT, ':encoding(utf8)');\nuse strict;\nuse JSON::XS;\n\nopen(FH, \"regions.json\") or die \"JSON file 'regions.json' can't be opened\";\nmy $json = \"\";\nwhile(<FH>){\n   $json .= $_;\n}\nclose(FH);\nmy $regions = JSON::XS->new->utf8->decode($json);\n\nprint \"/*\\n\";\nprint \" * GENERATED WITH regions.pl\\n\";\nprint \" * Please see: https://github.com/Cyclenerd/google-cloud-compute-machine-types/blob/master/regions/README.md\\n\";\nprint \" */\\n\";\n\nmy @names = keys %$regions;\nforeach my $name (sort @names) {\n\tmy $location_name = $regions->{$name}->{'name'};\n\t$location_name =~ s/'/''/g; # Escape single quotes for SQL\n\tprint \"UPDATE instances SET regionLocationLong = '\". $location_name .\"', regionLat = '\". $regions->{$name}->{'latitude'} .\"', regionLng = '\". $regions->{$name}->{'longitude'} .\"' WHERE region = '\". $name .\"';\\n\";\n}\n"
  },
  {
    "path": "regions/regions.sql",
    "content": "/*\n * GENERATED WITH regions.pl\n * Please see: https://github.com/Cyclenerd/google-cloud-compute-machine-types/blob/master/regions/README.md\n */\nUPDATE instances SET regionLocationLong = 'Johannesburg, South Africa', regionLat = '26.2056', regionLng = '28.0337' WHERE region = 'africa-south1';\nUPDATE instances SET regionLocationLong = 'Taiwan, Republic of China', regionLat = '23.69781', regionLng = '120.960515' WHERE region = 'asia-east1';\nUPDATE instances SET regionLocationLong = 'Hong Kong, People''s Republic of China', regionLat = '22.396428', regionLng = '114.109497' WHERE region = 'asia-east2';\nUPDATE instances SET regionLocationLong = 'Tokyo, Japan', regionLat = '35.6762', regionLng = '139.6503' WHERE region = 'asia-northeast1';\nUPDATE instances SET regionLocationLong = 'Osaka, Japan', regionLat = '34.6937', regionLng = '135.5023' WHERE region = 'asia-northeast2';\nUPDATE instances SET regionLocationLong = 'Seoul, South Korea', regionLat = '37.5665', regionLng = '126.978' WHERE region = 'asia-northeast3';\nUPDATE instances SET regionLocationLong = 'Mumbai, India', regionLat = '19.076', regionLng = '72.8777' WHERE region = 'asia-south1';\nUPDATE instances SET regionLocationLong = 'Delhi, India', regionLat = '28.7041', regionLng = '77.1025' WHERE region = 'asia-south2';\nUPDATE instances SET regionLocationLong = 'Singapore', regionLat = '1.3521', regionLng = '103.8198' WHERE region = 'asia-southeast1';\nUPDATE instances SET regionLocationLong = 'Jakarta, Indonesia', regionLat = '-6.2088', regionLng = '106.8456' WHERE region = 'asia-southeast2';\nUPDATE instances SET regionLocationLong = 'Sydney, Australia', regionLat = '-33.8688', regionLng = '151.2093' WHERE region = 'australia-southeast1';\nUPDATE instances SET regionLocationLong = 'Melbourne, Australia', regionLat = '-37.8136', regionLng = '144.9631' WHERE region = 'australia-southeast2';\nUPDATE instances SET regionLocationLong = 'Warsaw, Poland', regionLat = '52.2297', regionLng = '21.0122' WHERE region = 'europe-central2';\nUPDATE instances SET regionLocationLong = 'Hamina, Finland', regionLat = '60.5693', regionLng = '27.1878' WHERE region = 'europe-north1';\nUPDATE instances SET regionLocationLong = 'Madrid, Spain', regionLat = '40.4167', regionLng = '-3.7025' WHERE region = 'europe-southwest1';\nUPDATE instances SET regionLocationLong = 'Belgium', regionLat = '50.5039', regionLng = '4.4699' WHERE region = 'europe-west1';\nUPDATE instances SET regionLocationLong = 'Berlin, Germany', regionLat = '52.52', regionLng = '13.405' WHERE region = 'europe-west10';\nUPDATE instances SET regionLocationLong = 'Turin, Italy', regionLat = '45.0703', regionLng = '7.6869' WHERE region = 'europe-west12';\nUPDATE instances SET regionLocationLong = 'London, UK', regionLat = '51.5074', regionLng = '-0.1278' WHERE region = 'europe-west2';\nUPDATE instances SET regionLocationLong = 'Frankfurt, Germany', regionLat = '50.1109', regionLng = '8.6821' WHERE region = 'europe-west3';\nUPDATE instances SET regionLocationLong = 'Netherlands', regionLat = '52.1326', regionLng = '5.2913' WHERE region = 'europe-west4';\nUPDATE instances SET regionLocationLong = 'Zurich, Switzerland', regionLat = '47.3769', regionLng = '8.5417' WHERE region = 'europe-west6';\nUPDATE instances SET regionLocationLong = 'Milan, Italy', regionLat = '45.4669', regionLng = '9.19' WHERE region = 'europe-west8';\nUPDATE instances SET regionLocationLong = 'Paris, France', regionLat = '48.8566', regionLng = '2.3522' WHERE region = 'europe-west9';\nUPDATE instances SET regionLocationLong = 'Doha, Qatar', regionLat = '25.2854', regionLng = '51.531' WHERE region = 'me-central1';\nUPDATE instances SET regionLocationLong = 'Dammam, Kingdom of Saudi Arabia', regionLat = '26.4207', regionLng = '50.0888' WHERE region = 'me-central2';\nUPDATE instances SET regionLocationLong = 'Tel Aviv, Israel', regionLat = '32.0853', regionLng = '34.7818' WHERE region = 'me-west1';\nUPDATE instances SET regionLocationLong = 'Montréal, Canada', regionLat = '45.5017', regionLng = '-73.5673' WHERE region = 'northamerica-northeast1';\nUPDATE instances SET regionLocationLong = 'Toronto, Canada', regionLat = '43.7417', regionLng = '-79.3733' WHERE region = 'northamerica-northeast2';\nUPDATE instances SET regionLocationLong = 'São Paulo, Brazil', regionLat = '-23.5505', regionLng = '-46.6333' WHERE region = 'southamerica-east1';\nUPDATE instances SET regionLocationLong = 'Santiago, Chile', regionLat = '-33.45', regionLng = '-70.6667' WHERE region = 'southamerica-west1';\nUPDATE instances SET regionLocationLong = 'Iowa, USA', regionLat = '41.878', regionLng = '-93.0977' WHERE region = 'us-central1';\nUPDATE instances SET regionLocationLong = 'South Carolina, USA', regionLat = '33.8361', regionLng = '-81.1637' WHERE region = 'us-east1';\nUPDATE instances SET regionLocationLong = 'Northern Virginia, USA', regionLat = '38.8334', regionLng = '-77.2365' WHERE region = 'us-east4';\nUPDATE instances SET regionLocationLong = 'Columbus, Ohio, USA', regionLat = '39.9622', regionLng = '-83.0006' WHERE region = 'us-east5';\nUPDATE instances SET regionLocationLong = 'Dallas, Texas, USA', regionLat = '32.7792', regionLng = '-96.8089' WHERE region = 'us-south1';\nUPDATE instances SET regionLocationLong = 'Oregon, USA', regionLat = '43.8041', regionLng = '-120.5542' WHERE region = 'us-west1';\nUPDATE instances SET regionLocationLong = 'Los Angeles, California, USA', regionLat = '34.0522', regionLng = '-118.2437' WHERE region = 'us-west2';\nUPDATE instances SET regionLocationLong = 'Salt Lake City, Utah, USA', regionLat = '40.7608', regionLng = '-111.891' WHERE region = 'us-west3';\nUPDATE instances SET regionLocationLong = 'Las Vegas, Nevada, USA', regionLat = '36.1699', regionLng = '-115.1398' WHERE region = 'us-west4';\n"
  }
]