From 20b507d71d130a3acac23f841bed606fa9194c13 Mon Sep 17 00:00:00 2001 From: adrian-velonis1 <85172912+adrian-velonis1@users.noreply.github.com> Date: Wed, 4 Dec 2024 22:35:41 -0500 Subject: [PATCH] PD-5436 removing Databricks - ported to docs.liquibase.com --- .../database-tutorials/databricks.md | 312 ------------------ .../example/change/SetPasswordChange.class | Bin 0 -> 1988 bytes .../configuration/ExampleConfiguration.class | Bin 0 -> 1414 bytes .../configuration/ExampleValueModifier.class | Bin 0 -> 1850 bytes .../configuration/ExampleValueProvider.class | Bin 0 -> 1269 bytes .../example/database/ExampleDatabase.class | Bin 0 -> 1667 bytes .../database/ExamplePostgresDatabase.class | Bin 0 -> 1154 bytes .../example/executor/ExampleExecutor.class | Bin 0 -> 6242 bytes .../example/includeall/NoBakFilesFilter.class | Bin 0 -> 626 bytes .../example/includeall/NumberComparator.class | Bin 0 -> 1165 bytes .../com/example/parser/ExampleParser.class | Bin 0 -> 2183 bytes .../PasswordIsSetPrecondition.class | Bin 0 -> 3679 bytes .../resource/ExamplePathHandler$1.class | Bin 0 -> 1106 bytes .../example/resource/ExamplePathHandler.class | Bin 0 -> 1533 bytes .../example/resource/ExampleResource.class | Bin 0 -> 1869 bytes .../resource/ExampleResourceAccessor.class | Bin 0 -> 2291 bytes .../ExampleChangeLogSerializer.class | Bin 0 -> 2691 bytes .../ColumnSnapshotGeneratorExample.class | Bin 0 -> 1930 bytes .../RenameColumnGeneratorExample.class | Bin 0 -> 3419 bytes 19 files changed, 312 deletions(-) delete mode 100644 docs/extensions-integrations/directory/database-tutorials/databricks.md create mode 100644 snippets/target/classes/com/example/change/SetPasswordChange.class create mode 100644 snippets/target/classes/com/example/configuration/ExampleConfiguration.class create mode 100644 snippets/target/classes/com/example/configuration/ExampleValueModifier.class create mode 100644 snippets/target/classes/com/example/configuration/ExampleValueProvider.class create mode 100644 snippets/target/classes/com/example/database/ExampleDatabase.class create mode 100644 snippets/target/classes/com/example/database/ExamplePostgresDatabase.class create mode 100644 snippets/target/classes/com/example/executor/ExampleExecutor.class create mode 100644 snippets/target/classes/com/example/includeall/NoBakFilesFilter.class create mode 100644 snippets/target/classes/com/example/includeall/NumberComparator.class create mode 100644 snippets/target/classes/com/example/parser/ExampleParser.class create mode 100644 snippets/target/classes/com/example/precondition/PasswordIsSetPrecondition.class create mode 100644 snippets/target/classes/com/example/resource/ExamplePathHandler$1.class create mode 100644 snippets/target/classes/com/example/resource/ExamplePathHandler.class create mode 100644 snippets/target/classes/com/example/resource/ExampleResource.class create mode 100644 snippets/target/classes/com/example/resource/ExampleResourceAccessor.class create mode 100644 snippets/target/classes/com/example/serializer/ExampleChangeLogSerializer.class create mode 100644 snippets/target/classes/com/example/snapshot/ColumnSnapshotGeneratorExample.class create mode 100644 snippets/target/classes/com/example/sqlgenerator/RenameColumnGeneratorExample.class diff --git a/docs/extensions-integrations/directory/database-tutorials/databricks.md b/docs/extensions-integrations/directory/database-tutorials/databricks.md deleted file mode 100644 index 897e4cb..0000000 --- a/docs/extensions-integrations/directory/database-tutorials/databricks.md +++ /dev/null @@ -1,312 +0,0 @@ ---- -title: Databricks -description: Learn how to use Liquibase with Databricks SQL Warehouses to automate database schema migration. ---- - -# Using Liquibase with Databricks Data Lakehouses - -<small>Verified on: February 29, 2024</small> - -A data lakehouse is a new, open data management architecture that combines the flexibility, cost-efficiency, and scale of data lakes with the data management and ACID transactions of data warehouses, enabling business intelligence (BI) and machine learning (ML) on all data. - -The lakehouse architecture and [Databricks SQL](https://docs.databricks.com/en/sql/index.html) bring cloud data warehousing capabilities to your data lakes. Using familiar data structures, relations, and management tools, you can model a highly-performant, cost-effective data warehouse that runs directly on your data lake. - -For more information on Databricks, see the [Databricks](https://www.databricks.com) website. - -## Prerequisites - ---8<-- "database-tutorial-prerequisites.md" - -### Setup Databricks - -1. Create a Databricks account and workspace - - If you don't already have a Databricks account and workspace, follow the [Databricks Getting Started](https://docs.databricks.com/en/getting-started/index.html) instructions. - -1. Navigate to your Workspaces tab and click the Open Workspace button in the upper right of the page. - - ![Databricks Open Workspace](../../../images/extensions-integrations/databricks-open-workspace.jpg) - -1. Create a SQL Warehouse - - If you don't have a SQL Warehouse set up, follow the Databricks instructions on [Creating a SQL Warehouse](https://docs.databricks.com/en/compute/sql-warehouse/create-sql-warehouse.html) - -1. Create a catalog - - If you don't already have a catalog setup, follow the Databricks instructions on [Create and Manage Catalogs](https://docs.databricks.com/en/data-governance/unity-catalog/create-catalogs.html) - -1. Click the SQL Editor option in the left navigation, enter your SQL to create your database (also called a schema), and click the Run button - - `CREATE DATABASE IF NOT EXISTS <catalog_name>.<database_name>;` - - ![Databricks Create Database](../../../images/extensions-integrations/databricks-create-database.jpg) - -1. Your database is configured and ready to use. - -## Install drivers - -### All users - -To use Databricks with Liquibase, you need to install two additional JAR file. - -1. Download the jar files - * Download the [Databricks JDBC driver](https://www.databricks.com/spark/jdbc-drivers-download) (`DatabricksJDBC42-<version>.zip`) from driver download site and unzip the folder to locate the `DatabricksJDBC42.jar` file. - * Download the [Liquibase Databricks extension](https://github.com/liquibase/liquibase-databricks) (`liquibase-databricks-<version>.jar`) from the GitHub Assets listed at the end of the release notes. - -1. [Place your JAR file(s)](https://docs.liquibase.com/workflows/liquibase-community/adding-and-updating-liquibase-drivers.html) in the `<liquibase_install_dir>/lib` directory. - * `DatabricksJDBC42.jar` - * `liquibase-databricks-<version>.jar` - - !!! Note - If you are running your project on MacOS or Linux, you might need to run the following command in your terminal - (you can add it to your bash profile as well) to allow the dependencies to work properly: - - `export JAVA_OPTS=--add-opens=java.base/java.nio=ALL-UNNAMED` - -### Maven users (additional step) - -If you use Maven, note that this database does not provide its driver JAR on a public Maven repository, so you must install a local copy and [add it as a dependency](https://docs.liquibase.com/tools-integrations/maven/using-liquibase-and-maven-pom-file.html) to your `pom.xml` file. - -``` -<dependency> - <groupId>com.databricks</groupId> - <artifactId>databricks-jdbc</artifactId> - <version>[2.6.36,)</version> -</dependency> -<dependency> - <groupId>org.liquibase.ext</groupId> - <artifactId>liquibase-databricks</artifactId> - <version>[1.1.3,)</version> -</dependency> -``` - -### Verify installation - -Run the following command to confirm you have successfully installed everything: - -``` -liquibase --version -``` - -Review the libaries listing output for the two newly installed jar files: `DatabricksJDBC42-<version>.zip` and `liquibase-databricks-<version>.jar`. - -![Databricks Install Verification](../../../images/extensions-integrations/databricks-install-verification.jpg) - -## Database connection - -### Configure connection - -1. Specify the database JDBC URL in the [`liquibase.properties`](https://docs.liquibase.com/concepts/connections/creating-config-properties.html) file (defaults file), along with other properties you want to set a default value for. Liquibase does not parse the URL. - - ``` - liquibase.command.url: jdbc:databricks://<your_workspace_host_name>:443/default;transportMode=http;ssl=1;AuthMech=3;httpPath=/sql/1.0/warehouses/<your_warehouse_id>;ConnCatalog=<your_catalog>;ConnSchema=<your_schema>; - ``` - - !!! Note - Your base JDBC connection string can be found on the **SQL Warehouses -> *your_warehouse* -> Connection details** tab. - - !!! Note - Additional information on specifying the Databricks JDBC connection can be found in the [Databricks JDBC Driver](https://docs.databricks.com/en/integrations/jdbc/index.html) documentation. - -1. Specify your username and password in the [`liquibase.properties`](https://docs.liquibase.com/concepts/connections/creating-config-properties.html) file (defaults file) - - 1. The username, in our case is just “token” for the User or Service Principal you want to manage Liquibase. - - ``` - # Enter the username for your Target database. - liquibase.command.username: token - ``` - - 1. This is the token for the User or Service Principal we want to authenticate. This is usually passed in dynamically using frameworks like GitActions + Secrets. - - ``` - # Enter the password for your Target database. - liquibase.command.password: <your_token_here> - ``` - - !!! tip - To find or setup your Databricks user token: - - 1. **Log into your Databricks workspace**. - 2. **Access the User Settings**. Click on your profile at the bottom left corner of the workspace, then select "User Settings" from the menu. - 3. **Navigate to the Access Tokens tab**. In the User Settings window, you will find a tab for "Access Tokens." - 4. **Generate a New Token**. If you haven't already created a token, you can generate a new one by clicking on the "Generate New Token" button. You'll be asked to provide a description for the token and, optionally, set an expiration time for it. - 5. **Copy the Token**. Once the token is generated, make sure to copy and save it securely. This token will not be shown again, and you'll need it to establish connections to your Databricks SQL Warehouse. - -### Test connection - - -1. Create a text file called [changelog](https://docs.liquibase.com/concepts/changelogs/home.html) (`.xml`, `.sql`, `.json`, or `.yaml`) in your project directory and add a [changeset](https://docs.liquibase.com/concepts/changelogs/changeset.htmlhttps://docs.liquibase.com/concepts/changelogs/changeset.html). - - If you already created a changelog using the [`init project`](https://docs.liquibase.com/commands/init/project.html) command, you can use that instead of creating a new file. When adding onto an existing changelog, be sure to only add the changeset and to not duplicate the changelog header. - - === "SQL example" - ``` sql - --liquibase formatted sql - - --changeset my_name:1 - CREATE TABLE test_table - ( - test_id INT, - test_column INT, - PRIMARY KEY (test_id) - ) - ``` - --- - - === "XML example" - ``` xml - <?xml version="1.0" encoding="UTF-8"?> - <databaseChangeLog - xmlns="http://www.liquibase.org/xml/ns/dbchangelog" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" - xmlns:pro="http://www.liquibase.org/xml/ns/pro" - xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog - http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-latest.xsd - http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd - http://www.liquibase.org/xml/ns/pro http://www.liquibase.org/xml/ns/pro/liquibase-pro-latest.xsd"> - - <changeSet id="1" author="my_name"> - <createTable tableName="test_table"> - <column name="test_id" type="int"> - <constraints primaryKey="true"/> - </column> - <column name="test_column" type="INT"/> - </createTable> - </changeSet> - - </databaseChangeLog> - ``` - --- - - === "YAML example" - ``` yaml - databaseChangeLog: - - changeSet: - id: 1 - author: my_name - changes: - - createTable: - tableName: test_table - columns: - - column: - name: test_column - type: INT - constraints: - primaryKey: true - nullable: false - ``` - --- - - === "JSON example" - ``` json - { - "databaseChangeLog": [ - { - "changeSet": { - "id": "1", - "author": "my_name", - "changes": [ - { - "createTable": { - "tableName": "test_table", - "columns": [ - { - "column": { - "name": "test_column", - "type": "INT", - "constraints": { - "primaryKey": true, - "nullable": false - } - } - } - ] - } - } - ] - } - } - ] - } - ``` - --- - -1. Navigate to your project folder in the CLI and run the Liquibase [`status`](https://docs.liquibase.com/commands/change-tracking/status.html) command to see whether the connection is successful: - - ``` - liquibase status --changelog-file=<changelog.xml> - ``` - - If your connection is successful, you'll see a message like this: - - ``` - 1 changeset has not been applied to <your_jdbc_url> - Liquibase command 'status' was executed successfully. - ``` - - !!! Tip - - **If you see this error message:** - - ``` - Connection could not be created to jdbc:databricks://...; with driver - com.databricks.client.jdbc.Driver. - - [Databricks][JDBCDriver](500593) Communication link failure. Failed to connect to server. - Reason: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: - PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: - unable to find valid certification path to requested target. - ``` - - **This is the likely problem:** - - This issue was seen with Java 1.8. The SSL certificate is not available in that version of Java. - - **This is the suggested resolution:** - - Upgrade Java to a more recent version. - - -1. Inspect the SQL with the [`update-sql`](https://docs.liquibase.com/commands/update/update-sql.html) command. Then, make changes to your database with the [`update`](https://docs.liquibase.com/commands/update/update.html) command. - - ``` - liquibase update-sql --changelog-file=<changelog.xml> - liquibase update --changelog-file=<changelog.xml> - ``` - - If your `update` is successful, Liquibase runs each changeset and displays a summary message ending with: - - ``` - Liquibase: Update has been successful. - Liquibase command 'update' was executed successfully. - ``` - -1. From a database UI tool, ensure that your database contains the `test_table` you added along with the [DATABASECHANGELOG table](https://docs.liquibase.com/concepts/tracking-tables/databasechangelog-table.html) and [DATABASECHANGELOGLOCK table](https://docs.liquibase.com/concepts/tracking-tables/databasechangeloglock-table.html). - -Now you're ready to start making deployments with Liquibase! - -## Troubleshooting - -If you use v1.1.3 of the Liquibase Databricks extension, you may receive this error running Liquibase: - -``` -Unexpected error running Liquibase: -Error executing SQL SELECT MD5SUM FROM main.default.DATABASECHANGELOG WHERE MD5SUM IS NOT NULL: [Databricks][JDBCDriver](500540) Error caught in BackgroundFetcher. Foreground thread ID: 1. Background thread ID: 20. -Error caught: Could not initialize class com.databricks.client.jdbc42.internal.apache.arrow.memory.util.MemoryUtil. -``` - -To resolve this, append `;UserAgentEntry=Liquibase;EnableArrow=0;` to your JDBC URL. For example: - -``` -jdbc:databricks://<host>:<port>/<schema>;transportMode=http;ssl=1;AuthMech=3;httpPath=/sql/1.0/warehouses/<warehouse>;ConnCatalog=<catalog>;UserAgentEntry=Liquibase;EnableArrow=0; -``` - -## Related links - -* [Read the Data Warehousing Blog on Databricks](https://medium.com/dbsql-sme-engineering) - * [Database Change Management on Lakehouse with Databricks SQL and Liquibase](https://medium.com/dbsql-sme-engineering/database-change-management-on-lakehouse-with-databricks-sql-and-liquibase-c3c238781616) - * [Advanced Schema Management on Databricks with Liquibase](https://medium.com/dbsql-sme-engineering/advanced-schema-management-on-databricks-with-liquibase-1900e9f7b9c0) -* [Databricks GitHub Demo repo](http://github.com/CodyAustinDavis/liquibase_demo) -* [GitHub extension repo](https://github.com/liquibase/liquibase-databricks) diff --git a/snippets/target/classes/com/example/change/SetPasswordChange.class b/snippets/target/classes/com/example/change/SetPasswordChange.class new file mode 100644 index 0000000000000000000000000000000000000000..e5a274947a674ae150bd632e9eb0aa033887278d GIT binary patch literal 1988 zcma)6YjfK~6g}%WwquKin%L=swCaPzc4)*KijzR<lD6Qcp{8asd|=kr*4d6MxmuaR zNB$AaKr+yQAHa`dxGPzfClQ^D$J*Vyd+$Bx?A`m%zkmJ>-~&9)Bg1gB?+q>SBOi_& zVf7EWI}lb!1p8d67oKmoLQ5W5hO3TzK9)VMrssBgD)4zfhz>Cn#!C1u9}0$Y`x*a% zTMosuI)N|UL6i1Jlc)^2P3g*Dn_;e2?=oato-K-)gJGb61%}18bj99y*c1LYyyt`w zy*_uk+?RSiF=m59sTfw<XJJ7I$^+pFp9i87&}S&zfV}V2+6gtA2R!6>cQR?#znj@s zv7gm>?o5L;^H^dqlPKxO@~AS@(oXd~Usz8@lsrLJzy*c{J{o<mWmQE~a7n9knc;Tr zw7h4r)Vl@b7r=1EKpr_A(ll@l*BQ=p+ujo|TAni=x?S#!N%H+yr+L(SCi+3Mo+?io zBa-PR!}7_>xHFcHE&Kvj8H#ZUZLJk?12s*!&QM7~QtxUe>jvhLE8!NbJT@3EC-R=U zN(1lUT>>CfpN~jrU6#9^AKx_9QCgbQ!fIsi8}x)eq(Y_(60Xf~>rB2AuFV2IW?&)5 z+Xg;`ejR}qL1I{{)zh+8uw`HypD~<MBKY=D_@d=-QjB3cHG85(Qjn<^L)l}s7*=L3 zG`3o?NCdPx5JAgxpGtqo1L?UBg;IPV3b;#!6*ms^kSnt%glk4k#WtUMzR6G`=O@!P zQ6e5QE82_w=_KtXt769+`+c!1buXx%>QEcHs2DCj9=m}Yimp_Wy2Os_dh}okBR%tL zGqfg+E+!Q<Frt=?x>w1j67l6odq&xm$xU6FYsyTTSYhN#&zHeZbJS2N0sZwXLqDp? za7M3;#yss%TcdB0Ru+wn#`(rEO23B3UZZa=G%n&C&5h^)7V$c*=yjq@U+w%e1<KI4 zmHi8E9L&8$<$$sB@-Z%!-)#Jbl_Okzi5myyw~n#4PKL%Gcsqk5yjT8+K1cZE2%DW> zC_n}}X_b(I+CYwG=dp}SxPVPsYY^2a(F6pg#OK%{7}PP*oWR*8#+u7gn6yPnb<QYL zk|m;cWro_)l-d{5Scxta;-vHS8Rz+_^DgRBAX;`(v9bO;8i}gK(7H-A*JeoNrlfM= zRcTW9Qh}_T1ky+aaz7o&%1Iy_l+OAeAi7o<!F@n9GWZf-(O4l%n>2o?a36aLkFfs$ GU;hVnIoHMj literal 0 HcmV?d00001 diff --git a/snippets/target/classes/com/example/configuration/ExampleConfiguration.class b/snippets/target/classes/com/example/configuration/ExampleConfiguration.class new file mode 100644 index 0000000000000000000000000000000000000000..3e88b01d71b291c7defcb597d6e3986092fa7fb1 GIT binary patch literal 1414 zcmbtUZBG+H5Pp`IUV9uZ9wLH*2cov99Eb{7LV|#XSn)%fCL|_gdtJ)n^$zdF=+81H zkZ9r$@JAVEuT6OoK2$&K&feV4Gc(W3?62S7e*$=lqJ|!ZImd6>;xlg^xx#jQZ(laz zfJf5z?5&n|<E&CcAH&cg|HN&Vdky<t?NB(8h7`lRD?i4v#>0y^>v80}KCg@VIjE39 zf4jR^-l|l#cV06rl&%6eXSON!r6*N@MTSgSHas51fneC`)_%2gnnyVbq}M2}5oUVT zag~QPhTeRk%Fwsr*M){0!%~+K&b*AJTNgnZ*C^JGv5qW;4P3_vLu$3{Yb5`7IE88& zqh#6qQWjA}0csdKM}I49g?G!qZA=heUGYP7>|KI)#>0lo!?0NBma|qyimEj3Fifvo zkq9FzY=vh<2RyPO{y~Hmx59)|9aFfgVVYsNL%@YbyQ01wUj}Ayk0DE5Hbv+J@<^4R zVds(*|05$6=>r3K6d3wzs&WjA`K|$r88AFFpdrnWD^W3a;$}?*6<%|xE@sJhxLf6c zRNrl-mbeoE!^*!^L<B`0y;x9PWl+mT2a@J%zSP}xQ}^p-KMox6N~&1LE_(vz)YLE- z+ny(aq>V(VVVS}1vc3#jdp>CBk`wh6)qv)XRzIyVMIy-zJy<=^X{9j$gEWJrd7s<^ zCVwEiYYv^jd^2m_FmE1X+?+gyb&UJpF#9#JeMI{>QnU{c&LB)0nNj3OH;4%g;W7PD zxH^V02b;c_VzTYYCdo+GKYN1tQ@~WBOm&Ru0-j)zF80v-s`h7iPST`P7E4&6M5ai- GK;{pbaFz1_ literal 0 HcmV?d00001 diff --git a/snippets/target/classes/com/example/configuration/ExampleValueModifier.class b/snippets/target/classes/com/example/configuration/ExampleValueModifier.class new file mode 100644 index 0000000000000000000000000000000000000000..89ff099cc990fb9e636d7bbda7fb351e0bb29298 GIT binary patch literal 1850 zcmb7ET~iZR7=8|kYzV7B6a?!BTG0d|OBJyuKt<Hn8pM$f9ldcjn`2zM$%c~+Q?B|y z`Wt%VO`Opg$15*7(|^=)`kdWmO!%<zV)vZ$em?K#-=E&T2QZJ4fj)s*$FEuPce~c` zq~-Yamu|JC?7;Qw*8PaOX?rcX=2zU8u2cq+0>fMOj%|5%y=twOx1<vo=ohd&ce~}5 z?dE<vtFcvC=`tnIzv$N8U|ArM&20)KSN)1iBY{B^22uh;CATggw`ygnezD7*6v&i( z$M!aD<?44#Oa`yqrode3>q03Cq^dGlR~4y32oFi{ccfBog|711QjY-@HTZ!Iw_3M@ zmZIvNo>do1pHsOJD7RiMF4J5Zr!iq*T;OVt7)+eOH&H-gk_Ap>a~;N`Iu#9^>ndO5 zGmW#jU}6#%X(8|<;(iM;ycE8rP-%U2rS#(7U9CA~;tH;^nsU2kdo09g_Mqe3a|1bn zsiVSqqWm4EJ?ao0{)~w{t`RIt)WsCYF|wZQ6w}DUGBKwE8=|47geaSVtUQvtns?pA z4b3yjTX6!yCnJTM1iDozJB5bd45~^tx4nX8dAjvpky5xhf8)AU+pUySxWzPuJ;`KD zD%tRCN7iIL(AIC8D1coy_&EeN+QJvm?@dZLe_<Wt&{Y`9lAa5W%O9Nyj_cBq@`IGP z`iICImB%k2iQ4myi40Z*rjPFRuCj$g((i}sf+ak%fP0SPR$%%}r==8A8uxYPU=#vl z-FsoTv9}wRdUbT@Bnlkg2yExKHM<e-n)HU>QjUD!>TNV}*oK_d6D{y-2h6?n|6j8A zEyzP5;Uc)K_#NXC*C#h6{{wtkJO$5V({GS|%}XCl{`*6sf#bZJkpNC$h%ZhTM)=pt z*LZ5>#BlmA9-XR#9jb{~b%fPFNvTtz>}Y7>A0kQcy*$&#*aw_l%YVdBzK!#lOKn{K z6Uo;z?~r{)?sOZo(eYhoKC=*Azkh?pHh$2+lOgbh(C;v<j$oYrCg|-9MsXfvnBt1a zlR8W49I3ZRFOa{4bD`E`gd|2wOt_0x2AIME?%_U>KcJr|9h&zec|VadfWCh*Zg8zp N<RJ-t_&E;p(SOeL`EdXM literal 0 HcmV?d00001 diff --git a/snippets/target/classes/com/example/configuration/ExampleValueProvider.class b/snippets/target/classes/com/example/configuration/ExampleValueProvider.class new file mode 100644 index 0000000000000000000000000000000000000000..926bb9b3043013cdf39fbcace4516711cf275c96 GIT binary patch literal 1269 zcmb7ET~pIQ6g}G(l9pm2K=}|6{4A|BsDMa;83%P_rV3*n93QvoQWo2!rW=O-2Y-qW z`XVYbK0E#>$D1_8fWG*$clYi&_v7qMe*XIQ9l#PcG{hK+meVxFF>kgS!n7QFU)DXB zE9uzgldgA<H$1WHI!Cf5Tn!0^jfQ;Z$trJOWIU?2mCG&loVT{3q0WV1=wFw%RGSR( z-25IxV#}$C6yivx(T9G9Oj+9Eh1aYK_Z6=;1cOm_EZ*4TuJq5LGocP-n_;p1e=U?4 z2J1rYy227QVOtcQ>eyx&C2z&?TuVF_ZOfG{Uj=gK=F5lth?@;=*UgG@rCl%S7@;ts zLbFG{MAR1rpw=0NdlXN}hDk2UnXJgV&6Vd8aO~p!dOp8d(lANXAXUJ7#@h$PO<@8_ z9n+NWO!uPaHgwF8Fo(6OwbtycnP!bE?!U<ZW^ql!9O3`OqBv<>#|`SW<tc{MT%@O+ z>Y=by>2FW8@erir7Q-b+9SFDhR&<JFg^nD9-t2UB(2-{t`ctaQ?V8inaED<kD5xzg z&y}iUR{V{48QiB(K+<2#G!~Iz&}?z6wr!QdJuGRs-;*YI1@eo!aMM`E3PA(?clH^w zx$S7pA&k`T4<IxxnQoVnhsmCwtxl^qU(4sA>k)mzDTsJNc{V9msyjqar9Zio|N4rG zz7CiJy#{@XK!SEO`Lt?uGRZQsefbmUpJ)?9idO#`NMeB2bQeH&kWTa<$k6JOi)4LV zVi-R@kd1N&BiuyDO<)MaA$K9<#tq}+1*#FD#?Ppu7^4K)06QL}e^0%{=)7`@i8m*h zDi@5)#+9$Q8prE`anrcn+s>b&K!AnMD1O1+(CcT72hC<l4`3WR4gUxxF@q`kWlaZF eWV;!{Ds*c30amH>hs5xO>3Y_JW=iCXVf{BUC@EzC literal 0 HcmV?d00001 diff --git a/snippets/target/classes/com/example/database/ExampleDatabase.class b/snippets/target/classes/com/example/database/ExampleDatabase.class new file mode 100644 index 0000000000000000000000000000000000000000..37e6653dd58e538d634ce51b80f2c5b3478ec321 GIT binary patch literal 1667 zcma)6TT|0O7(Lq-0;LL+i;5r@xwL={UQs~>3(nN(05do|__j?KSSC%%CSkze<b%F= zd+-PN5BxKZU(%$FrQ`6jo83L<`_6a1-TeCV<0pVe*wm0<m^JL0F3x$aZVJ81U0&gi z(6<{KTj5$miebT&r=ARso4C!2<0@{rZ>tp}0yA{4OG~;h8IrmD0Yj>2S4A30^k&e7 zZifD{w8V~As|fXuS4_c>E!ze+54e*4I^0aT$I@Y#FJDFC8bjZaaQBq7m2@wH+$9Zz z3`;HDj!<XP5GEyaZKa1``9W0o8z&5t(ka?X3B!%*Df!magynKq+7`oNuH1^)bRt3* zZObAuA=mQn8PeP5hN$~XN5d$?T#G8A6FuTKv3<CSF%7r=!T%>!2DdTJFiHkQvG$Z* z^$d51*T~-CT)uq5&$w=K>qy^sm9&o5dT@uKH|q53G^Q}4VVYr}9h$*i%u-v$smD#~ z$Ve_0ZMSkl^#;XeBZ(~&=-OP-Ertxq-#@lhAi4*61}(gp3=@87;*fi0rwV(pOtQmL zrXmYyE5=gtOenfdaqXcK9nD#xI_csSLJ5UxrLYyoVB|qIW<eN+;d(3I9@XJH6^~uA zTyZ4SS`zr3Ok)+#G(2S(Z227`GI$QU(ApU{J+XU8oz0ax1!9<Syn3BdIVE~=lAGoQ zxg?bGpHa~^y_!W@=^4^h9Eza9^K$Ck5OkK_w>@QuH`0HG!_jRB-+jSXhG|d;`egvU z^hGb2MvYcF&5Y)*#joi3OdkoPY4ndlfIb>C4FJv8XhjC0pGKd&OtX(mq(1s%jM*1s zCYsDFh6puG*c9<bf*2dLlc1f<(s$gTmP~xXWP7xMAlhgH7e@1S&0#)Juz+!zeMR?z zHIU5aKD9|2iAhR^K~h-kKwWC5j&-0i%2f!nuF~w+kj(1s)XA9iC@TSR9}fbl59ue~ ykiHVE$@=W$Z+OxkXEr9GyJ_e;UWDvsE0XQz<zviND_&k^UTR{YBlA_@>&9OUFlc%J literal 0 HcmV?d00001 diff --git a/snippets/target/classes/com/example/database/ExamplePostgresDatabase.class b/snippets/target/classes/com/example/database/ExamplePostgresDatabase.class new file mode 100644 index 0000000000000000000000000000000000000000..480eac6c9fef9fda632269c9ca25171e405bc911 GIT binary patch literal 1154 zcmb7DQBM;=5dNmETxqLdg{oKtRHOyuUVOtCW5I-^L6Q<4eA`~vvgCRTdsl+~CLi=g zqYwT7f0S|dde_#b8hx3$nf<=mZ)WFy{QUMEz*D#mGK6hU_gr};dgs1$J0cQo5lVM| zkT}v|)HO2POY#nKgqp7|`YMJE@t!u)okSC6o~b}Z&k5OD{e+Nf=#DHPi`f#cVTLf* zRDnF~_uA4Ni?%Nb<)-$8e<F;sagxkMrz#}uH2+8IE}__!(UDQwsOVj+;lRO7!q%vP zP?}5SNuMu`v~d%#dM`Vz!3kkSg$-?t^rCbM2X<CH8AKvdIv{M;nxl%tk)-H`4gw}K za<~45P}sln<hcz)2NlBlh$_<)H{}koMcl!XgS)@s|8i9c_fRENcmQdwBcnTgFFF)G z9`i!2-aHeR!u3Vabz6~9L3cNg`-Iu#>Gxh1u!;u`)(G>H&=MZv5kIfI=nJ1;X0bL_ z?REQ%`;D6|rxHg)AZ+~Ov<M}Z-#XPM7M(|(;3S($ShlUnx1#S)>oAXPmYuY+nvQ^{ z-_m{K$ydtmTJ;ZGzGK_P8hB;+M**)Y*>z>>aOAQlo8A0^{3rg%pupB1g8@ahr2&Bb zb&d!(Fvr%Cx7k}<CjY_OF=la$nHe(6xW%Xi#^#u}7}t2gnG9!2TVHXT|Cr^^SedLg zA6Kgka7i_*YaNec1skZcw~C&`F_10SK2Atl9FvqyisZ04g}OCKU7A8AzRUK!^9$%p B4=Dfu literal 0 HcmV?d00001 diff --git a/snippets/target/classes/com/example/executor/ExampleExecutor.class b/snippets/target/classes/com/example/executor/ExampleExecutor.class new file mode 100644 index 0000000000000000000000000000000000000000..2ad252013e83cd230deef6d708bd62e302a5c24c GIT binary patch literal 6242 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 F{{t(S?IHjG literal 0 HcmV?d00001 diff --git a/snippets/target/classes/com/example/includeall/NoBakFilesFilter.class b/snippets/target/classes/com/example/includeall/NoBakFilesFilter.class new file mode 100644 index 0000000000000000000000000000000000000000..a39d878e6f205695f54af966dd07154ce86f6f90 GIT binary patch literal 626 zcma)(%}T>S5Xb+UrcJG_)%yL7AlNE27jKHF1wn{asCe+U*)Hw2+eFhud=;O-ix)2n z9(({FN}Mzmzb+m!vokyM%lv2G-d|n;Y-81e!LT9xo-J>A?@CKsc|u1`$+foY{vq!k zDJ}bCLK#>v8OA&OhTEEZE&J5%ND*4dFsy5J9VwUhr7hZYC$-<Qj}z2^)=57@W><MC z++#?UD;ErA&2P#aQW(v{LYATEC{Na-o-2cM?rO<Ua(uz{1rJml50hrtR(*zw^UuL| z7_6Z#hUv2NC7}@p%4_XZF0+_qNLO9nt>!R|Sqn2iv?hgl%we7(D||2H%A*+;ztd`M z9yH{2Bt0RC$xuj^;rOjH9=2mOe|}9xjgX7(3BMYu%QgHc5HemoP5b*1sxbj;pdHee zre`$B)Aq=YP-K&5<kOqa$UP3O^JFtg5(PTvhvzXADI%GeAR9N=31*NlZk0+;n7V_N ox`$~#P%1@jpO}#WW+o{`f}tiXV39yeRF{TP*pCNUroh0;2WH=n8UO$Q literal 0 HcmV?d00001 diff --git a/snippets/target/classes/com/example/includeall/NumberComparator.class b/snippets/target/classes/com/example/includeall/NumberComparator.class new file mode 100644 index 0000000000000000000000000000000000000000..37884293ee903893b9381ebf0cdc0af17da8770a GIT binary patch literal 1165 zcma)5%Wm306g>k56UQV#32pjLUtnHtXj)YzidsdAgoKg>QT79w5=X{Hj*0S7U9=lg zby0QQkE(iyae_lzsf!ukxpU^6Gk30k{`&SEz!u)<NHCNK{>T;=d^C22?RW!saxA#( z+WV7HUj)1UXv_m1`hgCOA$Q8px$SaqXdm=X#URv?W+=|GlhASPIi4ZC?RZYO!;q|4 zM-1Aoe=H0nv1~#|hGDhqctXh>^1dq=3SED|-6I}2avdeL@WeS|u)6<gw9TLslx!1Y zxze3m?uCKl4cmWatd0SOTPBKFW5|n(FyMo5&v7Grf9J7cL>(^_LlLwM+{U_&JH#^A zjW$i(#XW|l$lRgNP>S2T;;=dlsWA^vHf2TTG?D#iv&FDH1E~s<{TTF$D#ElBCWEK+ z7>#B%gXat|P==+Wa^qQ*h>0p{3}zt4E+2?JCpZfk-p1YjyO=Q_5lB|0VWKIktDkds zA`U(-)Ks-o{B5F)dYerXIpi6Po<9ksA=xf#i#^(u#i9!LoT10ViEM!Fn423K3+)=m zMXq<+*r2vZ(n!${qtTc8mgXf|+4Q9vB2~SF@r8l}Oq$awi7drt6t7^FR#au=X_kjQ zLQBeGwRVZZezi{XJFT&<O;P$pdBwFt(ja`AUMfp$l5<O)gW@Cx+{c5NP7x0&N)UPl zkMNkzX36dbMH*$Pu_NvGw38qvvsQRgcs9k0uc&{%)>Qs;Gp&-sU2B<2EBAqJBCjuR k(jYeJGFz?vK)Ft1ikI^%C^|NylcEW<X7ek$h+Mt?4gCQGj{pDw literal 0 HcmV?d00001 diff --git a/snippets/target/classes/com/example/parser/ExampleParser.class b/snippets/target/classes/com/example/parser/ExampleParser.class new file mode 100644 index 0000000000000000000000000000000000000000..dacd0324bd78406848f916c32286f2935e0df88d GIT binary patch literal 2183 zcma)7TXWk)6#mwcy{;^i^b%4vC8RASaok3Pd+nCexCse3ZK#7w+RzzA-mz6|%SdvY z@DKPQOka3_mt;z3=o`%NkKloFR<dOo2k1D_YIo21&h0x#zyI~~F96=fR~!k3S<7h| zV$W=Kn!@Oqt|we$CERWXI}U|m;-UG-G@53+Zrt8|C@h~NMY>J<o36cUdXZ+SK_a5; z)I(i{)K$A}`yVlk&F88NO3A4S6=TR~;7Bu!m+iK=)otwxcgx&u3WgJ9$1<B$)3xQk zcc}Oc+haIi{y%Sv44Jy{H(lFtZGS(oyUuZvAwO`IVtiy<qDh8)$2EGw_P3%|32zwE zUboY6T%U{<=F5ZVE52*D>&5Z_%oU!~buD4s>Al>rEa7>MTg=^4F$JCD^iTpr2n}a2 zP0spG*?BD75+#x0)O>E#RvNES7>liaiT1jNS)3#PM7!qQwfzRe<PrYm?lEMoelb?< zFtH<HkY9cG`(86#e5v3Vk^x&7zB|Hx3?lTR>C}xlIn0*uh3ma!B9DZ-Y5Jz*UIa_E zS6B8d(eZ7k?Qtv&6<zdihWzkEq``5Cf*%xi;P{9o6?rU51{?p9{%QtGc!%R{h6@A4 zey&HTqES1(7czHc&-Q$x7{k&LdCkQ#F@jdi-~(LY_>f`xKa6T9fKoN?bVPf--Rb&7 zNMW`Zruyu&9V2#8RB;X0IjD(G1`Ha$*6^`x<fPSfJZkM_+~g?rMT3d4)o`81vY9ok zV3mkz)@l`MFABgDHHOpiKqKK|uBu`UpK`1Zp+)u5@R{r&mD+uSkjy$+&tXHB<rc$2 z9JJrHg9eD3VbD8`eb1(`6LConAxR@L9r7TYX+7F9#0xPXN~BKXug`FXW03&ET&#f6 zu`xn0s!zs_*Jd)D3&W`=DMnMHcNgS3$`0LSE52!cy<v8OA<98BVQ#>Sf%PN2rnFXq zsn#1ELtlhNnMRxgO(ptI(#J%hmBu+ekI~McmC>49IE4BWy(FN~GZh?a$kMwO3g8ut z(~iavj?+^rU!qkiCzK!LGp0Ea(@aE~r!d*mTqEf*(oypVc=g2D1I+vrVKP9N4W)Vr zB#-mB5ZF}l1}+i`!<(3+b)L{<XgTQ_E75zJPFl~9-_9T6azSB*BrBvY=bz%O1fJr3 z`dDzC|B5R*Kfu)|SSlptHXUsB<nuyGPyPl~PZg3+a9mI7sqbk=%K>iCwXXbFP@W;T ztt$ukL{|<`eok&oP{S6;FmN9`)DmMsQqE99foXF8EN1ApO&^9Gs>%ZjN2Yj<Dniai zVYYC)7iJ5a_?&R%tqgdKFz(Q=LIKV|#}>XI-3L^fD(=$Rmn69g{(^>HnuBpnacpxe lapXCcgTHI?c==Cc<TjiA1Bn-8K#5CBi8V^*eL_oM=WnD-GYbF! literal 0 HcmV?d00001 diff --git a/snippets/target/classes/com/example/precondition/PasswordIsSetPrecondition.class b/snippets/target/classes/com/example/precondition/PasswordIsSetPrecondition.class new file mode 100644 index 0000000000000000000000000000000000000000..222bcaa9fc0223729a1f5cda3e44c7e07adaa8ae GIT binary patch literal 3679 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 H!FPWHY<vDZ literal 0 HcmV?d00001 diff --git a/snippets/target/classes/com/example/resource/ExamplePathHandler$1.class b/snippets/target/classes/com/example/resource/ExamplePathHandler$1.class new file mode 100644 index 0000000000000000000000000000000000000000..ace3c9f96cd1e077274854d89f7f3ce918657720 GIT binary patch literal 1106 zcma)6+iuf95Iviubz)2!(i=3S4J9SFwr;r7R7kWcqEbpLih_9DIIG5$V@LJ|wVwqN ztppMuz(*lwodhi9C6;W>?#`S!duGPJ|NQs`;3@Vr#26};*E7W>@AVyF`XcZKz9r1V z;l?SK-FMvWIKnU1H6$4F7yJu1ZO`1llH!f;^Q)7A><{Fb^abxR%*w7E6n6->IVEs| zg7$3JmaiE$%Tq^HS`3K;uOm`mxMg4lvpV9qZ9qesAzoGvb4}Y7?+3lM@IUglBN(zx z&*Dyt`?gw-HWP|8Lv7mR#X6Cmu^cZTME&s65`AfVZlGa_VScR8(aFD)6z*b0!###f zc<ONX+&sGqr05yQ;Xd*829ja1ISxMcZFeMUL&GY=awJgF;raf+b~?gOqQJ2F$@iov zNUtzixZQ%TBad|@%tK019_AQQ2$33<mh#vz@CYTU2JiQU+hN#>x}LNzge4o5iRclJ zhJvUVsG`P@lpZw%kz`mXPlk~17EBG>5w#*0Hn5|ZYJH`F<EpYgHZZTss-K1Z`PNpo zT%Nq_wo-}ee(0*|5P@SMyIx1b3x?8^4Qb#Nb{WzZb+i;8MkB#cjmj~+-dGNrhv*nk zcNj;mEBph82Z0DspdO9W(6LNLH7Z##dNm|zKNSvREZotnweQfYH!!}2K6CV)B_CiN z8TuNbt>X@|v?BG8rnm*N6SP_kv5rF<$bG}|Pvk#m*KY8jdX3^W%GcN=@cMu7bVzFh jOH}$5lp;xTqa<-WA@~^mFP?>Ip5rANWa*Sp5u@iXdYBb$ literal 0 HcmV?d00001 diff --git a/snippets/target/classes/com/example/resource/ExamplePathHandler.class b/snippets/target/classes/com/example/resource/ExamplePathHandler.class new file mode 100644 index 0000000000000000000000000000000000000000..8f0ecb1731d67157309fe0942feab154ce0c3700 GIT binary patch literal 1533 zcmb7EZBNrs6n^d)D=R|=6YvcMoUk#ZqWA(s6M_&)CJ-<f{B~Dv#?`K!?VZ7&;(y?S zesPH;{s4cJ@wDqkGho3cy{GrybDr~@xBmJ2>o<T!tZ0Za%$QEq5XZb)vxMOa&#Akn zFxHy~J6s*T;r5{=Tn%xCX-j^t%QE*Os;gyBx!hC{U53Ppw558*(38vWGsM@NL!qMw z$rO5#U>Gb(TWr;<W#PW#WlJy&mmHH@``nfOK0J)8Bk3{ZOIIXWWazI5wc|?1mFg?Q zNUrpef8mD3?TWFdTxnN|`OQ8IG4zE&FYCx)M8kE4bf<0#qZnh*J;hz+y_f3f637o4 zZZeFWrKe`qE7CT00znCI9Y^^=c6uPj1AB^_pWgCX7<7gr*bNJ@YMR3H9G79~qDV?- z4%?;cG$jxE`mrf$N;<ZuVUi&eu#k?ix!u0eaGznkb+I8WvE`@@r*0ocR30$Qbt^@u zZyj08_$AL>k~iuNzhEsphK2tPv#4Q?A$t{8KAWVD0t}zhBZjpLoONxr7SC2$ia~SN zXi6BanXceUv{V>oFF?;X8-P;3U01cbqLviAN-;d8F7FmYWV*5oI!*6$KZX}nk6c&A z5xan_z84I*Utj9i^J6~mcK}0b)3$}XW^vCG9wtG9O#cj!OGa;kR*iNBN#>u<HqiHj zK4Q>m^{;^x`hzu4pxprNC`%Zm)i>TH?HI{{!f^U0hQFaVeiA#OgPs87THrB_B!&nm z6M&624MH$7#Vy<>xI2Lr>!;6g+$E)ZbdVr9fvLdPO9JzKB~Ot(C^Rtroi<UjHzN4S zHhwb1r`ljPgpHGvi2(F9Wx@wdpQ3P3@R1vM*uZ=z_ILz4-NsI1A>hvN7*Eb&M+h$- eP<Eenf=)$1qlBBFF)RfEE~7|NC(4T?>G=m{0&bE3 literal 0 HcmV?d00001 diff --git a/snippets/target/classes/com/example/resource/ExampleResource.class b/snippets/target/classes/com/example/resource/ExampleResource.class new file mode 100644 index 0000000000000000000000000000000000000000..a325e91a13cde678073ab730affd656a54bd6ba6 GIT binary patch literal 1869 zcmbtUU3U{z6x}yXJ0VP4D6J`4FqVo*nsz`wREi%>El^DXn>J8+noKV3U@{XXH(36Y z54e`5F1r@K`=ea$JDI5=#I-<QX70zid+)Q)x%bb%et!wzDjph02rM{$(~<{vv(=DR zAlrT?aHO@~TiA-`29g378t&7MTeI7JajUhq3T#KkfdZ#uj8(^x?Y18XESKMeBaUAY z7`y3uuKGe?EmwYGKeMfd?d@3=6}aBs%G-hEs{+Y2zb*}&6vzysl{#*tE`t=t1yYd< zH_}LB(u9Fi0y9Gt<f}Sj%ETE=Q>@);Nv|%jG%WNr{So7ehIq$B2D4;VelIzJ>0JJ` zBaD3)a|YfMFvA2qsjQu?4HM^Zo&uae+DZz{|GR+b1d&FN)v0~JdJYNiamUg5>IpE; z#3;rDCd;lT?{=Cs8Eo6N1_`IizGFA4cHruHw3t-;Zd>5u8`X)$PPS~dudxPe!@WtL z)^2#Mj-o%(ZnA>0Kdx`}Z7?>ye&EQKa(%CDU|HZyh^NEu9q$;pBrq3ml%6ZO8U*(9 zKA;pnX3?Ye&pN)Rq^Giv1HYL~(~GMnuIY*yds5w}?leBZX9hlH-w(<+aRZc<Vx%Ub zCCOa=Q7H`zpX&;+y+?D8O1eSE<bm5(j2Ow~zbCl9LXBrM`0|hv<;z3vVSN8sV1chq ztmBrz$p}XaWkH5w4XP%<9eiV8L!kIJx7NhBC@}$MYhY90(mx_)To-G{lLsy7C|NJZ zPswp<(kSDe_T|37Y`@g){lNcG_t%QHYSdTzl5dKjJ2SnOd9}o}e7vG;=Z8(Z6?No9 z<U_@+HTZ(CRVv{tcgxjHJU#H%Eo)1VrH><gCfS&}`#Bor*g%Tk6P(pK*Zb!Si$_TB zPML?8SnT3-7c;-%>>=JS6o1A1&x}Z5f!~QR`ZQ*Vca9Iohg{3{5O5J6aYiiUkSD$# zY0d=41uXJk<XV!mrI7nhsD)8Suy#ZC%VaNfaiu4qi|dED`GRM9++!hTCge0D{2r&k zm-vb+I-?^0nmdvFY2f5s-^oOzR$vvS=;Tx8p}oiye!+Z!F06HN`^DxF%Dcrw-2Eej zH8D>4BYkGfbL9e!S?Dt(b8JQi--TvOP}~+OOl6xCOl8v`j=;|UrC%g{k@QRdiM|?o G^x$td@V#jO literal 0 HcmV?d00001 diff --git a/snippets/target/classes/com/example/resource/ExampleResourceAccessor.class b/snippets/target/classes/com/example/resource/ExampleResourceAccessor.class new file mode 100644 index 0000000000000000000000000000000000000000..c6f866087091a346babd075a93ca318d2d3d3071 GIT binary patch literal 2291 zcmb7FT~`xV6x}z(Ob7uH0b9k-DgpsUkbZ_@BSN)}(1OK6KW`>i96My<%!H*ceRBC9 z`Y+lC!Iri91Nxh~y1MVoBqkxP_(0a&bI;j#pL6y({PoWte*&0;G>{OOwA>w2J&`+A zN12}T-I`}9b15>c#pi-$Dc^TJ14)6LV?VChCFwW$7fOEMNh@d%5J-Bi8wd;(AIV*5 zI<m5Dt_Pl7+0F~3=Ix3dEC_Usjc?F((JiYCy3mt_fpj+ndb2o&l)&+#T~RBwos#nI z$&#ZqpleBILwdG8$Hrvv(DntUi*J$?i42V$rl%RDd?h{Wp}>_64qM|<P%W?>vuOJP zfig=^EL9C`x8fT(C2%s#+IG!5tBo6h?sa>+B7>U8JZ>EYdA``8=Ji_V7xD(q)ZYr( z6g*Ep)s!+gjUEH%1WvWr|7Oj0%F4^&0xlW2DA3>Tk;OZ>EMV+Pr>0gP2#hv!T`fIQ zR*;X2(A?Mz&SF%za3GB_7SWuU_8&XiI*~;VlQhX{RaMFYQ_YC6E)FBcRP!2QItvrm z1k!;U`3nq=9S)(dz-$)RF-LiAD@t&t<6Hk%*dDxx4-C97&==OG(djHc#7D%HW#-T# zo_bZb(wNt&&+63EpvKdtG_OaePxPr|&gm0nUzGtR*6k^)=K1z6MIp8*B~MWy72QSl z=CIU;TL<82wLS!9oA2wy!zo)2r1jHXS&hdi#d;MSQoG!-WUaNJ>KBjT_Bs{@?()5( z%xwlmtZI3E(fQ>!8~*W)4AyYZz&bnmDzin`aVT#+$XR>^?t)&QOUqG#8@HsTHubi* zm7cXZQC7a?*(Igh72<Js)dkxS6dgwo8RsLk=FwWnr|}JmuE|Q--MLU-0T(v(hzcCD z9M@L{zOQeCFt%y)WY)v|zHI9iI`SV|ep;6S7db#({6|5$dI$3>#c%Fq{&w>;j|9Jf z%)~zb#0zA9<0*kY{`Q5D{Yc^jeFt!ywru2$e%drD*F%i7%%}uy5mK%L(jbwBh%_7` z4M*NF65~RCoEn_OAYUFLR+6V-yv45s-qw6Yie5>cpC91#<~~MNrX~(>b~E=9=l5}C z;OZX6_b|1Gncwkl0{2^Q^KG{yzu-oz$H#3Rt+zMYZ+{Ir>RO#+CBQYE#u<!a1h=^4 zZqxbz=kW}e!i*;(=8cS>qY!q3+2AG?nPVD1GjfU9FB47II<kC9%WYcNwZHMq;6f9) zgU>ot>GQCw1-_(v(R+a6W{$00d5JGI*{HEv0>IU#HuN?~^~R(G?&E9vN5$U^VXrYx vN2Uh0I^az<2_)4J$hRb&Xf*S?5GO|rjU!%ZEuu8r1i^I~YwQQQCh+6G+HWS% literal 0 HcmV?d00001 diff --git a/snippets/target/classes/com/example/serializer/ExampleChangeLogSerializer.class b/snippets/target/classes/com/example/serializer/ExampleChangeLogSerializer.class new file mode 100644 index 0000000000000000000000000000000000000000..cf0dd6facf773a067c39ea919eb8c2d9bf3a2ac5 GIT binary patch literal 2691 zcmb7F+j<jK7+t$fJLxch23iCK8bC?f(iEwurdDZ4u^Lh|p$JiNnoQGyNhVAt(BkPi z^aZ@}0=)<y`ss(azJWJBin#WkG?|q4Q!kp`+5c(%>p$#2{{Hzl0JHc;!+^l~vRg}8 zn`W)ySgEGv*`{MZu)I_@xXNsp^{SO~tA(yeLqy=Y+vYtp<xrSfS-WkOeGS6`3CF(M zve(RJpQ~Mb2n^5Lb=zMM7)&Hr1tJ-@V(A#fJ_8z}0ta(;-O9IWYnE3u*BnbAmUGLd zvuY9|zdM%^f5UDHT*&?JG|~cNRm)#xzLh20v9g=KRd3pEo$f{x$x^PDVZrz8dNr-# zP+#J~brhpaV!E~^u#f((dbaD?KEIgQvWBAqlYOk*v&)vlOnlc%b(BeXh5Sm1z|eh~ z^GqfJ1TEioQaQWnr-N_XO|7*2M$2b-%dDj(dwO=WY&CodUc(82Lkc@Jmsh$Hfsuk; zt($(!qxb9c#ksj$4_H~%*>S6>ZnZKSwo^$j?1V92ET$Ls#4>_YIHTdT!112*%Z|Hd zIvKaVZdY5LDRCNj8LtQ&Ub$AhdaZbCX*rj@mCa{XE-mLTvnj*K!e*&HCzq^s*+g`g z){(%3hNM8M7q|RhObtw8iv7mgWm=wR)n!YxNYUX$GSmY>m#6n(8Z#PF0tXbw-Rc-P zk5>hvtQ|9SJ$Bc&z0z6k+|$D>Uf1v%8@lIVTWa792_{mvHaSsm37iULvqy<^2&4_n z<879>JHY}M6CoD6_a1wxGo#xhEypQ+Gn{Ov;dR9Dj)8Y^k%^I?#Vz0Bbc}UcLQQ{1 zHCbBJkwI3&B{H|&e&I$na12Xq??h=axhhF`&%iR?7tl7$W}f+~iMh#0W!ZQv1cz<s z2vEmuQFCnfSzuKt=4@o^Ww*kam0LrB31cM)6++-lh@m|vKt}7^JX?+J?K8RqUoaa4 z$r%yYU+~THohxQT?J5l)_YK9)cm>Okg6WUdw#L_8uV(tbRT&Sonijj^6M-W;b6ISW zD$9%FGluIk)KS9ca+jKNojprJa#e2IvVjWN>$18T$855?hql{RQKl|AT~*i`HaI3d z1WIJ!Htw*7w9lKhXQrmxNF~$^)ZudRn~jE5uLzvm4b?M1I~fu}33m;6GFsGk1IP5{ zs@F$gDpbmUZFbr<Jj<6`T9ERY@TBZgm)^FM4~5#eBY_%=CU7zodN*s9Cb;G^Djl#( zgEYCIl|wG@E@Tp;7u=RtwgT0Ydq2d}vKEMQ{0I3r#7BLYCtpwgj_@nRQ}7&`cm(}N z{xblhqXZnle*SL+3j8|AFAf}@=dU!LMMTN;$ghaq7>pe*JmhWILoDP$?|K-+k&cHc zo-+JE<cA%WFN7=yx|YZAA`^Lux-#-{oK#lh3eBIq8|HWVC&b%0`vkH4<YSx@m>c>Y zCyow1#sz^Vcylf?HE}c&X=CnO8w+hLN)aEF@1Fi835X~H#uQg4pktiu#WBNk4yP5U zStUz%KrtXbKu)ER#uemAfX+p~f~$lYCutwzBYG{+_ZVe?ev$ft>>6dOygi12rx?Ys z2BBeELq_9f)yOd=LT+yUO41wjI><9V`8%$Ei{aRfhrgh7BlhVd+?s4-t&R0IoHiP= z7K1981Ipkmy(I{3LM1UCIO!%4M-#qEB90dB5vT;krjbua9rt<Bqg~=CQW)VGotTtd r=6lVft1M?2?t%(65$JV8MX`x36)K7c_=4KZ8DA>C1iqrr0et-rqlKm% literal 0 HcmV?d00001 diff --git a/snippets/target/classes/com/example/snapshot/ColumnSnapshotGeneratorExample.class b/snippets/target/classes/com/example/snapshot/ColumnSnapshotGeneratorExample.class new file mode 100644 index 0000000000000000000000000000000000000000..de4a884881a678d1e1124f880cde193d53d94274 GIT binary patch literal 1930 zcmbVM*>2N76g`s!oSM*vK+B%CtVy@9Zz*faQWO>uRIxl%Q)imGICko#z^CvJJitpU zA%VmzABDJMJI=HLfl#D)Jag}vd(OGOKYo7s2H*l7YDh7hH=K4wyyNYTB`TiHJKl=p zS89$GwCzUxdSBSW<-X(Ijp8(97-lSUEijk3r=+c}xBryNuyfY5P5%Z%x>R0Z$kd#s z(2>SK4m+@uVW@7};&ISk67F-pWC?~s-7&bez+F?m$D0{{#q=01*8ijMD#Nap@SnP- z<C^|^hO?#mDqrUni`%VA&ElR{t@n5}xz9s_bMc~Do@W?nm@S+8flC#>=*yp-Q~*5R z4GbAs=^{K?S`~(0z45neH0)(Kp;AnWiB0GtN(qN^7{ri<{gl%yKXJ3qM+V&q3wi#& zLoD|6iNKKU-p6oMVbtAC2$7^CTWuo9*s3erasO2uhTRRH8*d)*P7IZGMaSZXAm{g$ z%CENrQx(^Lv%U4cZgcm^L3U_3P93<d7Z~!c;LSO)%md3`;8s9lbxMjHiNrN-tcd0_ z=dEgN&wj(99*90FHK1S3vcfFx6&<Hh)=**?RlH3)OM%W|0+S3HwRmLg$x>M@c59Ao zAQ@KGF^!6b8HVvcUeFEB;SA13Uy;mx%-bXhIii%^@LkhxRkJuxANi{1*g7uavW80} zXHVcLDu*k$O8a6h;FdSvvPq{JjTDAq^~;JO%dfH^rwh%<ki~WB$YONGb==fI!{vxV zp=)?zP7b$ln+6aG#Bl0&Hz+(3`O~Q7Z~`Y8_8Z|`d?b7>t$QXs>WhX1E2=v8-AhI5 zQR=+C?2yiC^j25mCZU9e6S#)BXUa)<JlgK-+;|quNL?`wqDG?~$k2*rD*bEpR-q@O z=Z=X@WIxj)1)cuoF|dn%KrRZP=Wcpqa+*+7p4KVs2|?BfT7u`NzN7E~`o!eaCiZ<y zeWblih&LFX4^ecU@(UsESd<gvQZ^3YV0c#^hj5tCk5GPeyF5EeXGPjcgALMh6k|yl z<6#-IAvZwJe8sVs=|Z~kiNYg7Q2_^t*g*^sSdW+<7m$%Q60TI`Eg@y-S)AIysSQjO z&TZfV5t}Sr+raE6;y1mCI}$yu&>JOT#xR0oA^JpwkkBh)4tGO(Mcl)Es*CVLqUkQJ M5juWA+bPWd0$NK0n*aa+ literal 0 HcmV?d00001 diff --git a/snippets/target/classes/com/example/sqlgenerator/RenameColumnGeneratorExample.class b/snippets/target/classes/com/example/sqlgenerator/RenameColumnGeneratorExample.class new file mode 100644 index 0000000000000000000000000000000000000000..33aeee0cdc474dab1f9a3e4a5cfb6337a6cf8b22 GIT binary patch literal 3419 zcmc&$ZC4XV6n+MR8{(pviWXl=P{bq>Laml+Pzq73HbrU_%S&ID%`_}-cEe_a_EUdB zKeT_Kf4~pz7dX~qk3FZK`lEV!XLqxiKtgHlIsK5?$;`cXo_p^zckUm5{_-n;D|o7) zi{YwnSF-$>R;ijiTiZ0t+~SVr+D`TXx3mh++h)CD-D#}e_9YcW7$!_(vu><uwOxw3 z?eOf(TFrGd-7RjKp)$jvDZ?_{n+)B_)FMM9Z<lxs-RM=(gF_5Q3x>t#>y<U`Jk-`q z&JZuyx@InFjv@XBixGF-s4+|y{uTHf!{IV_7aYTO4EGxk%v}Y?7|wU_sMU#RtzNC# zj!Os@k_Ab{)m&cTmYek=AjhxR*vd)rCC$~m=-mn?xzw_P0frITtxzfmeM6X`x7M&q zxsdFJ%lqMAh&C)UoRzd2tJ%gu6t3u&W*W3X`S|g_^;kN%g?w_v^Xr;n<x-L;f2Q-Q zYuHwH(FaD;+m2&9wVZ;p6u@RuI*Z0|2E9=vD3Fu~lg|^|V>pKq1?L&Yn<fqtPZbw1 z%AgXjJdO%u49AnH!iKh`Wlha0XN#_5Smm5JH>o0pG_hM>=lYWeobHjsOLGP{OALkN zUL|Se{@MoD-Gjy>iZO;h+bsDPx#8rvimU+KPk`^sn^C+=@)m#ED*v8J6(f+Jmp2)X zQR2cY?&XRhEhX!3@=8U4d#Pg>m9#qN&A+~0mEuGbhVTA2O0GzN$;~XmAp%ZOOeFUB z>k6pq4Yn>nvZ|U><0Vp4@FBy=-CUWi8)k_+QOpvxG}Gly!lP;;hH2aqHS;#ZKpVQG z76p^<sQ5@E?Fc0~Pc_E0%Z>csQ}MCb>Z7e9k+7nPox}J9_Z7@DoNglBQxH@v;8UvA zyryeaza;x~zt;wdMBIS?dso_Cl4%rGJj5g7hgPj}i!Mf{js3m4LC|thJSLC{$9u*S zy7!JH6f7|eHJzhJs;;|rda%5j?UP=FVMWC%KBo)fd+A>~-_6N3FeIn)rdF%b_1v9I z0`w(4c?s9{(x<6d6B&rQwjUS;<l?z@&>EH42NA;!d@XWcX1Lx4N((7N_gZb_#OwQg z`+GxdJm7QH%Km2OKo(jH!a<9bf(?eG6au*)*<&>Z22;f;oMxDPQ(scc!kn!lj<*=T zeN%J)AT%xc3W|up;;6WW>kP4?U3YXoXNY!aSnevqAP23%xS$+8XGNoIX@b-YrA|OP zHfd9`Mx(*luamf$!!W_^rlt~z(u_Je8WsANr7xpzPkIN@pJ~#C7>!~Z=)++eRbPO< zee{oN6^_y<l*i~R<hr8I#VBd^OPXDwCM7P=%+puE=^6VC$9F3ac*+T1AW$YzoWM!% zxE{QXK{}2JVg&|&An6`5IPnr^mUi&Y^~hi(K6Ggt!`ry{nC6#go(bj?G{5Z6e+q%0 z@bpiimuwDD12BxU$Y99Ba>chDVwniBOaxfyWL(AjgrXN0F^LZlA!Njk0N?KvoCuw@ z8hM4>Quj;TSbB-+rTEMa@?!*Nj(&IPH~a#H2)6MczDR@E$;3Z<f#q&*?TcXTa&v7P zUv<BNz5`xt`Z7u=fDuaL1q%5nl7uNk;}rEYGf1OI>npS`(wp{ig}$wZzO9D7t@^(8 z&rrnI1CPc@Pk3}Bed#sMjb&cL*v6A42A@LI$dgPLK)P{M0^KylNu)pK>u$r^%>h~O W8mjx9x!LhdI=AMX?xOB}xBdd_(!QAh literal 0 HcmV?d00001