diff --git a/pkg/content_manager.go b/pkg/content_manager.go
index 3b7ef2e5..37c5fd86 100644
--- a/pkg/content_manager.go
+++ b/pkg/content_manager.go
@@ -87,7 +87,7 @@ func (cm *ContentManager) PullFile(instance *Instance, file string, clean bool,
if err := cm.pullContent(instance, workDir, opts); err != nil {
return err
}
- syncFile := DetermineSyncFile(file)
+ syncFile := DetermineSyncFile(workDir, file)
if file != syncFile || replace {
if err := cm.contentManager.DeleteFile(file, nil); err != nil {
return err
@@ -139,9 +139,13 @@ func (cm *ContentManager) Copy(srcInstance *Instance, destInstances []Instance,
return nil
}
-func DetermineSyncFile(file string) string {
+func DetermineSyncFile(workDir string, file string) string {
if regexp.MustCompile(FlattenFilePattern).MatchString(file) {
- return filepath.Join(strings.ReplaceAll(file, content.XmlFileSuffix, ""), content.JCRContentFile)
+ syncFile := filepath.Join(strings.ReplaceAll(file, content.XmlFileSuffix, ""), content.JCRContentFile)
+ _, jcrPath, _ := strings.Cut(syncFile, content.JCRRoot)
+ if pathx.Exists(filepath.Join(workDir, content.JCRRoot, jcrPath)) {
+ return syncFile
+ }
}
return file
}
diff --git a/pkg/content_manager_int_test.go b/pkg/content_manager_int_test.go
new file mode 100644
index 00000000..ed8932ea
--- /dev/null
+++ b/pkg/content_manager_int_test.go
@@ -0,0 +1,506 @@
+//go:build int_test
+
+package pkg_test
+
+import (
+ "crypto/sha256"
+ "embed"
+ "fmt"
+ "github.com/wttech/aemc/pkg"
+ "github.com/wttech/aemc/pkg/common/filex"
+ "github.com/wttech/aemc/pkg/common/pathx"
+ "github.com/wttech/aemc/pkg/common/timex"
+ "github.com/wttech/aemc/pkg/content"
+ "io/fs"
+ "os"
+ "path/filepath"
+ "strings"
+ "testing"
+)
+
+//go:embed int_test_content
+var VaultFS embed.FS
+
+func TestPullDir(t *testing.T) {
+ testPullContent(t, "/content/mysite", "", nil, "", []string{
+ "/content/mysite/.content.xml",
+ "/content/mysite/us/.content.xml",
+ "/content/mysite/us/en/.content.xml",
+ })
+}
+
+func TestPullDirWithNamespace(t *testing.T) {
+ testPullContent(t, "/conf/mysite/_sling_configs", "", nil, "", []string{
+ "/conf/mysite/_sling_configs/.content.xml",
+ "/conf/mysite/_sling_configs/com.mysite.pdfviewer.PdfViewerCaConfig/.content.xml",
+ })
+}
+
+func TestPullOnePage(t *testing.T) {
+ testPullContent(t, "", "/content/mysite/us/.content.xml", nil, "", []string{
+ "/content/mysite/us/.content.xml",
+ })
+}
+
+func TestPullOneTemplate(t *testing.T) {
+ testPullContent(t, "", "/conf/mysite/settings/wcm/template-types/page/.content.xml", nil, "", []string{
+ "/conf/mysite/settings/wcm/template-types/page/.content.xml",
+ })
+}
+
+func TestPullCqTemplate(t *testing.T) {
+ testPullContent(t, "", "/apps/mysite/components/helloworld/_cq_template/.content.xml", nil, "", []string{
+ "/apps/mysite/components/helloworld/_cq_template.xml",
+ })
+}
+
+func TestPullCqDialogFlatten(t *testing.T) {
+ testPullContent(t, "", "/apps/mysite/components/helloworld/_cq_dialog.xml", nil, "", []string{
+ "/apps/mysite/components/helloworld/_cq_dialog.xml",
+ })
+}
+
+func TestPullOnlyContentXml(t *testing.T) {
+ testPullContent(t, "", "/apps/mysite/components/helloworld/.content.xml", nil, "", []string{
+ "/apps/mysite/components/helloworld/.content.xml",
+ })
+}
+
+func TestPullRepPolicy(t *testing.T) {
+ testPullContent(t, "", "/conf/mysite/settings/wcm/policies/_rep_policy.xml", nil, "", []string{
+ "/conf/mysite/settings/wcm/policies/_rep_policy.xml",
+ })
+}
+
+func TestPullXmlFile(t *testing.T) {
+ testPullContent(t, "", "/var/workflow/models/mysite/asset_processing.xml", nil, "", []string{
+ "/var/workflow/models/mysite/asset_processing.xml",
+ })
+}
+
+func TestPullTextFile(t *testing.T) {
+ testPullContent(t, "", "/apps/mysite/components/helloworld/helloworld.html", nil, "", []string{
+ "/apps/mysite/components/helloworld/helloworld.html",
+ })
+}
+
+func TestPullFilterRoots(t *testing.T) {
+ testPullContent(t, "/", "", []string{"/content/mysite"}, "", []string{
+ "/content/mysite/.content.xml",
+ "/content/mysite/us/.content.xml",
+ "/content/mysite/us/en/.content.xml",
+ })
+
+}
+func TestPullFilterFile(t *testing.T) {
+ workDir := pathx.RandomDir(os.TempDir(), "filter")
+ defer func() { _ = pathx.DeleteIfExists(workDir) }()
+ if err := copyFile("int_test_content", workDir, "int_test_content/filter.xml"); err != nil {
+ t.Fatal(err)
+ }
+ filterFile := filepath.Join(workDir, pkg.FilterXML)
+ testPullContent(t, "/", "", nil, filterFile, []string{
+ "/content/mysite/.content.xml",
+ "/content/mysite/us/.content.xml",
+ "/content/mysite/us/en/.content.xml",
+ })
+}
+
+func TestPushDir(t *testing.T) {
+ testPushContent(t, "/content/mysite", []string{
+ "/content/mysite/.content.xml",
+ "/content/mysite/us/.content.xml",
+ "/content/mysite/us/en/.content.xml",
+ })
+}
+
+func TestPushDirWithNamespace(t *testing.T) {
+ testPushContent(t, "/conf/mysite/_sling_configs", []string{
+ "/conf/mysite/_sling_configs/.content.xml",
+ "/conf/mysite/_sling_configs/com.mysite.pdfviewer.PdfViewerCaConfig/.content.xml",
+ })
+}
+
+func TestPushOnePage(t *testing.T) {
+ testPushContent(t, "/content/mysite/us/.content.xml", []string{
+ "/content/mysite/us/.content.xml",
+ })
+}
+
+func TestPushOneTemplate(t *testing.T) {
+ testPushContent(t, "/conf/mysite/settings/wcm/template-types/page/.content.xml", []string{
+ "/conf/mysite/settings/wcm/template-types/page/.content.xml",
+ })
+}
+
+func TestPushCqTemplate(t *testing.T) {
+ testPushContent(t, "/apps/mysite/components/helloworld/_cq_template/.content.xml", []string{
+ "/apps/mysite/components/helloworld/_cq_template.xml",
+ })
+}
+
+func TestPushCqDialogFlatten(t *testing.T) {
+ testPushContent(t, "/apps/mysite/components/helloworld/_cq_dialog.xml", []string{
+ "/apps/mysite/components/helloworld/_cq_dialog.xml",
+ })
+}
+
+func TestPushOnlyContentXml(t *testing.T) {
+ testPushContent(t, "/apps/mysite/components/helloworld/.content.xml", []string{
+ "/apps/mysite/components/helloworld/.content.xml",
+ })
+}
+
+func TestPushRepPolicy(t *testing.T) {
+ testPushContent(t, "/conf/mysite/settings/wcm/policies/_rep_policy.xml", []string{
+ "/conf/mysite/settings/wcm/policies/_rep_policy.xml",
+ })
+}
+
+func TestPushXmlFile(t *testing.T) {
+ testPushContent(t, "/var/workflow/models/mysite/asset_processing.xml", []string{
+ "/var/workflow/models/mysite/asset_processing.xml",
+ })
+}
+
+func TestPushTextFile(t *testing.T) {
+ testPushContent(t, "/apps/mysite/components/helloworld/helloworld.html", []string{
+ "/apps/mysite/components/helloworld/helloworld.html",
+ })
+}
+
+func testPullContent(t *testing.T, relDir string, relFile string, filterRoots []string, filterFile string, expectedFiles []string) {
+ aem := pkg.DefaultAEM()
+ contentManager := pkg.NewContentManager(aem)
+ instance := aem.InstanceManager().NewLocalAuthor()
+ packageManager := instance.PackageManager()
+
+ remotePath, err := installMainContent(packageManager)
+ defer uninstallMainContent(packageManager, instance, remotePath)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ resultDir, err := pullContent(contentManager, instance, relDir, relFile, filterRoots, filterFile)
+ defer func() { _ = pathx.DeleteIfExists(resultDir) }()
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ diffs, err := checkPullResult(resultDir, expectedFiles)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if diffs != nil {
+ t.Errorf("testPullContent(%s, %s, %v, %s) -> %v", relDir, relFile, filterRoots, filterFile, diffs)
+ }
+}
+
+func testPushContent(t *testing.T, relPath string, expectedFiles []string) {
+ aem := pkg.DefaultAEM()
+ contentManager := pkg.NewContentManager(aem)
+ instance := aem.InstanceManager().NewLocalAuthor()
+ packageManager := instance.PackageManager()
+
+ remotePath, err := installMainContent(packageManager)
+ defer uninstallMainContent(packageManager, instance, remotePath)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ workDir := pathx.RandomDir(os.TempDir(), "content_push")
+ defer func() { _ = pathx.DeleteIfExists(workDir) }()
+ if err := copyFiles("int_test_content/new_content", workDir); err != nil {
+ t.Fatal(err)
+ }
+
+ path := filepath.Join(workDir, content.JCRRoot, relPath)
+ if err := pushContent(contentManager, instance, path); err != nil {
+ t.Fatal(err)
+ }
+
+ resultDir, err := pullContent(contentManager, instance, "/", "", []string{
+ "/apps/mysite",
+ "/conf/mysite",
+ "/content/mysite",
+ "/var/workflow/models/mysite",
+ }, "")
+ defer func() { _ = pathx.DeleteIfExists(resultDir) }()
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ diffs, err := checkPushResult(resultDir, expectedFiles)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if diffs != nil {
+ t.Errorf("testPushContent(%s) -> %v", relPath, diffs)
+ }
+}
+
+func pullContent(contentManager *pkg.ContentManager, instance pkg.Instance, relDir string, relFile string, filterRoots []string, filterFile string) (string, error) {
+ resultDir := pathx.RandomDir(os.TempDir(), "content_pull")
+ var dir string
+ if relDir != "" {
+ dir = filepath.Join(resultDir, content.JCRRoot, relDir)
+ }
+ var file string
+ if relFile != "" {
+ file = filepath.Join(resultDir, content.JCRRoot, relFile)
+ }
+ if dir != "" {
+ if err := contentManager.PullDir(&instance, dir, true, false, pkg.PackageCreateOpts{
+ PID: fmt.Sprintf("aemc:content-pull:%s-SNAPSHOT", timex.FileTimestampForNow()),
+ FilterRoots: determineFilterRoots(dir, file, filterRoots, filterFile),
+ FilterFile: filterFile,
+ }); err != nil {
+ return resultDir, err
+ }
+ } else if file != "" {
+ if err := contentManager.PullFile(&instance, file, true, false, pkg.PackageCreateOpts{
+ PID: fmt.Sprintf("aemc:content-pull:%s-SNAPSHOT", timex.FileTimestampForNow()),
+ FilterRoots: determineFilterRoots(dir, file, filterRoots, filterFile),
+ FilterFile: filterFile,
+ }); err != nil {
+ return resultDir, err
+ }
+ }
+ return resultDir, nil
+}
+
+func pushContent(contentManager *pkg.ContentManager, instance pkg.Instance, path string) error {
+ if err := contentManager.Push([]pkg.Instance{instance}, true, pkg.PackageCreateOpts{
+ PID: fmt.Sprintf("aemc:content-push:%s-SNAPSHOT", timex.FileTimestampForNow()),
+ FilterRoots: determineFilterRoots(path, path, nil, ""),
+ ExcludePatterns: determineExcludePatterns(path),
+ ContentPath: path,
+ }); err != nil {
+ return nil
+ }
+ return nil
+}
+
+func installMainContent(packageManager *pkg.PackageManager) (string, error) {
+ workDir := pathx.RandomDir(os.TempDir(), "content_pull")
+ defer func() { _ = pathx.DeleteIfExists(workDir) }()
+ if err := copyFiles("int_test_content/main_content", workDir); err != nil {
+ return "", err
+ }
+ pkgFile := pathx.RandomFileName(os.TempDir(), "content_pull", ".zip")
+ defer func() { _ = pathx.DeleteIfExists(pkgFile) }()
+ if err := content.Zip(workDir, pkgFile); err != nil {
+ return "", err
+ }
+ remotePath, err := packageManager.Upload(pkgFile)
+ if err != nil {
+ return "", err
+ }
+ if err = packageManager.Install(remotePath); err != nil {
+ return remotePath, err
+ }
+ return remotePath, nil
+}
+
+func uninstallMainContent(packageManager *pkg.PackageManager, instance pkg.Instance, remotePath string) {
+ _ = packageManager.Delete(remotePath)
+ _ = instance.Repo().Delete("/apps/mysite")
+ _ = instance.Repo().Delete("/conf/mysite")
+ _ = instance.Repo().Delete("/content/mysite")
+ _ = instance.Repo().Delete("/var/workflow/models/mysite")
+}
+
+func copyFiles(fsSrcDir string, osDestDir string) error {
+ if err := fs.WalkDir(VaultFS, fsSrcDir, func(path string, entry fs.DirEntry, err error) error {
+ if err != nil {
+ return err
+ }
+ if entry.IsDir() {
+ return nil
+ }
+ if err = copyFile(fsSrcDir, osDestDir, path); err != nil {
+ return err
+ }
+ return nil
+ }); err != nil {
+ return err
+ }
+ return nil
+}
+
+func copyFile(fsSrcDir string, osDestDir string, path string) error {
+ relPath, err := filepath.Rel(fsSrcDir, path)
+ if err != nil {
+ return err
+ }
+ relPath = strings.ReplaceAll(relPath, "$", "")
+ newPath := filepath.Join(osDestDir, relPath)
+ data, err := VaultFS.ReadFile(path)
+ if err != nil {
+ return err
+ }
+ if err = filex.Write(newPath, data); err != nil {
+ return err
+ }
+ return nil
+}
+
+func determineFilterRoots(dir string, file string, filterRoots []string, filterFile string) []string {
+ if len(filterRoots) > 0 {
+ return filterRoots
+ }
+ if filterFile != "" {
+ return nil
+ }
+ if dir != "" {
+ return []string{pkg.DetermineFilterRoot(dir)}
+ }
+ if file != "" {
+ return []string{pkg.DetermineFilterRoot(file)}
+ }
+ return nil
+}
+
+func determineExcludePatterns(file string) []string {
+ if !pathx.IsFile(file) || !strings.HasSuffix(file, content.JCRContentFile) || content.IsPageContentFile(file) {
+ return nil
+ }
+ dir := filepath.Dir(file)
+ entries, err := os.ReadDir(dir)
+ if err != nil {
+ return nil
+ }
+ var excludePatterns []string
+ for _, entry := range entries {
+ if entry.Name() != content.JCRContentFile {
+ jcrPath := pkg.DetermineFilterRoot(filepath.Join(dir, entry.Name()))
+ excludePattern := fmt.Sprintf("%s(/.*)?", jcrPath)
+ excludePatterns = append(excludePatterns, excludePattern)
+ }
+ }
+ return excludePatterns
+}
+
+func determineResultFiles(workDir string) (map[string]string, error) {
+ files := map[string]string{}
+ if err := filepath.Walk(workDir, func(path string, info os.FileInfo, err error) error {
+ if err != nil {
+ return err
+ }
+ if info.IsDir() || !strings.Contains(path, "/mysite/") {
+ return nil
+ }
+ _, relPath, _ := strings.Cut(path, content.JCRRoot)
+ data, err := os.ReadFile(path)
+ if err != nil {
+ return err
+ }
+ files[relPath] = calculateHashCode(data)
+ return nil
+ }); err != nil {
+ return nil, err
+ }
+ return files, nil
+}
+
+func determineTestFiles(workDir string) (map[string]string, error) {
+ files := map[string]string{}
+ if err := fs.WalkDir(VaultFS, workDir, func(path string, entry fs.DirEntry, err error) error {
+ if err != nil {
+ return err
+ }
+ if entry.IsDir() || !strings.Contains(path, "/mysite/") {
+ return nil
+ }
+ _, relPath, _ := strings.Cut(path, content.JCRRoot)
+ relPath = strings.ReplaceAll(relPath, "$", "")
+ data, err := VaultFS.ReadFile(path)
+ if err != nil {
+ return err
+ }
+ files[relPath] = calculateHashCode(data)
+ return nil
+ }); err != nil {
+ return nil, err
+ }
+ return files, nil
+}
+
+func determineExpectedFiles(workDir string, expectedFiles []string) (map[string]string, error) {
+ files := map[string]string{}
+ for _, expectedFile := range expectedFiles {
+ path := filepath.Join(workDir, expectedFile)
+ path = strings.ReplaceAll(path, "/.", "/$.")
+ path = strings.ReplaceAll(path, "/_", "/$_")
+ data, err := VaultFS.ReadFile(path)
+ if err != nil {
+ return nil, err
+ }
+ files[expectedFile] = calculateHashCode(data)
+ }
+ return files, nil
+}
+
+func determineDifferenceFiles(actualFiles map[string]string, expectedFiles map[string]string) map[string]string {
+ diffFiles := map[string]string{}
+ for relPath, hashCode := range actualFiles {
+ hashCode2, exists := expectedFiles[relPath]
+ if !exists {
+ diffFiles[relPath] = ""
+ }
+ if hashCode != hashCode2 {
+ diffFiles[relPath] = hashCode
+ }
+ }
+ for relPath := range expectedFiles {
+ if _, exists := actualFiles[relPath]; !exists {
+ diffFiles[relPath] = ""
+ }
+ }
+ return diffFiles
+}
+
+func determineKeySet(filesMap map[string]string) []string {
+ var filesList []string
+ for relPath := range filesMap {
+ filesList = append(filesList, relPath)
+ }
+ return filesList
+}
+
+func checkPullResult(resultDir string, expectedFiles []string) ([]string, error) {
+ files1, err := determineResultFiles(resultDir)
+ if err != nil {
+ return nil, err
+ }
+ files2, err := determineExpectedFiles("int_test_content/main_content/jcr_root", expectedFiles)
+ if err != nil {
+ return nil, err
+ }
+ diffFiles := determineDifferenceFiles(files1, files2)
+ return determineKeySet(diffFiles), nil
+}
+
+func checkPushResult(resultDir string, expectedFiles []string) ([]string, error) {
+ files1, err := determineResultFiles(resultDir)
+ if err != nil {
+ return nil, err
+ }
+ files2, err := determineTestFiles("int_test_content/main_content/jcr_root")
+ if err != nil {
+ return nil, err
+ }
+ diffFiles := determineDifferenceFiles(files1, files2)
+ files3, err := determineExpectedFiles("int_test_content/new_content/jcr_root", expectedFiles)
+ if err != nil {
+ return nil, err
+ }
+ diffFiles2 := determineDifferenceFiles(diffFiles, files3)
+ return determineKeySet(diffFiles2), nil
+}
+
+func calculateHashCode(data []byte) string {
+ hash := sha256.New()
+ hash.Write(data)
+ return fmt.Sprintf("%x", hash.Sum(nil))
+}
diff --git a/pkg/int_test_content/filter.xml b/pkg/int_test_content/filter.xml
new file mode 100644
index 00000000..fb438729
--- /dev/null
+++ b/pkg/int_test_content/filter.xml
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/pkg/int_test_content/main_content/META-INF/MANIFEST.MF b/pkg/int_test_content/main_content/META-INF/MANIFEST.MF
new file mode 100644
index 00000000..002441b0
--- /dev/null
+++ b/pkg/int_test_content/main_content/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Content-Package-Id: my_packages:test-content:1.0.0-SNAPSHOT
+Content-Package-Type: mixed
diff --git a/pkg/int_test_content/main_content/META-INF/vault/config.xml b/pkg/int_test_content/main_content/META-INF/vault/config.xml
new file mode 100644
index 00000000..f1b081a1
--- /dev/null
+++ b/pkg/int_test_content/main_content/META-INF/vault/config.xml
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pkg/int_test_content/main_content/META-INF/vault/definition/$.content.xml b/pkg/int_test_content/main_content/META-INF/vault/definition/$.content.xml
new file mode 100644
index 00000000..935962c3
--- /dev/null
+++ b/pkg/int_test_content/main_content/META-INF/vault/definition/$.content.xml
@@ -0,0 +1,7 @@
+
+
diff --git a/pkg/int_test_content/main_content/META-INF/vault/filter.xml b/pkg/int_test_content/main_content/META-INF/vault/filter.xml
new file mode 100644
index 00000000..e0c2d68a
--- /dev/null
+++ b/pkg/int_test_content/main_content/META-INF/vault/filter.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/pkg/int_test_content/main_content/META-INF/vault/nodetypes.cnd b/pkg/int_test_content/main_content/META-INF/vault/nodetypes.cnd
new file mode 100644
index 00000000..fd926604
--- /dev/null
+++ b/pkg/int_test_content/main_content/META-INF/vault/nodetypes.cnd
@@ -0,0 +1,5 @@
+<'rep'='internal'>
+
+[rep:RepoAccessControllable]
+ mixin
+ + rep:repoPolicy (rep:Policy) protected ignore
diff --git a/pkg/int_test_content/main_content/META-INF/vault/properties.xml b/pkg/int_test_content/main_content/META-INF/vault/properties.xml
new file mode 100644
index 00000000..d2be1f16
--- /dev/null
+++ b/pkg/int_test_content/main_content/META-INF/vault/properties.xml
@@ -0,0 +1,9 @@
+
+
+
+ my_packages
+ test-content
+ 1.0.0-SNAPSHOT
+ AEM Compose
+ merge
+
diff --git a/pkg/int_test_content/main_content/jcr_root/apps/mysite/clientlibs/clientlib-site/$.content.xml b/pkg/int_test_content/main_content/jcr_root/apps/mysite/clientlibs/clientlib-site/$.content.xml
new file mode 100644
index 00000000..cbb48e78
--- /dev/null
+++ b/pkg/int_test_content/main_content/jcr_root/apps/mysite/clientlibs/clientlib-site/$.content.xml
@@ -0,0 +1,8 @@
+
+
diff --git a/pkg/int_test_content/main_content/jcr_root/apps/mysite/clientlibs/clientlib-site/css.txt b/pkg/int_test_content/main_content/jcr_root/apps/mysite/clientlibs/clientlib-site/css.txt
new file mode 100644
index 00000000..f852363a
--- /dev/null
+++ b/pkg/int_test_content/main_content/jcr_root/apps/mysite/clientlibs/clientlib-site/css.txt
@@ -0,0 +1,3 @@
+#base=css
+
+site.css
\ No newline at end of file
diff --git a/pkg/int_test_content/main_content/jcr_root/apps/mysite/clientlibs/clientlib-site/css/site.css b/pkg/int_test_content/main_content/jcr_root/apps/mysite/clientlibs/clientlib-site/css/site.css
new file mode 100644
index 00000000..3a86ca3b
--- /dev/null
+++ b/pkg/int_test_content/main_content/jcr_root/apps/mysite/clientlibs/clientlib-site/css/site.css
@@ -0,0 +1 @@
+body,html{background:#ececec;color:#202020;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:1pc;line-height:1.5;margin:0}@media(prefers-color-scheme:dark){body,html{background:#131313;color:#dfdfdf}}a{color:#2020e0}@media(prefers-color-scheme:dark){a{color:#dfdf1f}}button,input,optgroup,select,textarea{font:inherit}.cmp-helloworld__item-label{margin-bottom:0}.cmp-helloworld__item-output{margin-top:0}.cmp-navigation__item--level-0:hover>.cmp-navigation__group{background:#ececec}main.container{padding:.5em 1em}footer.experiencefragment{border-top:1px solid #202020;padding:.5em 1em}@media(prefers-color-scheme:dark){footer.experiencefragment{border-color:#dfdfdf}}footer.experiencefragment .cmp-separator__horizontal-rule{border:0;margin:0}header.experiencefragment{border-bottom:1px solid #202020;padding:.5em 1em}@media(prefers-color-scheme:dark){header.experiencefragment{border-bottom-color:#dfdfdf}}header.experiencefragment a{color:#202020;text-decoration:none}@media(prefers-color-scheme:dark){header.experiencefragment a{color:#dfdfdf}}header.experiencefragment a:focus,header.experiencefragment a:hover{color:#2020e0;text-decoration:underline}@media(prefers-color-scheme:dark){header.experiencefragment a:focus,header.experiencefragment a:hover{color:#dfdf1f}}header.experiencefragment .cmp-container{display:grid;grid-template-columns:4fr 1fr 1fr}header.experiencefragment .cmp-navigation__group{list-style:none;margin:0;padding:0}header.experiencefragment .cmp-navigation__item--level-0{display:grid;grid-template-columns:1fr 3fr}header.experiencefragment .cmp-navigation__item--level-0>.cmp-navigation__group{display:grid;grid-template-columns:repeat(3,1fr)}header.experiencefragment .cmp-navigation__item-link{display:block}header.experiencefragment .cmp-navigation__item--active>.cmp-navigation__item-link{font-weight:700}header.experiencefragment .cmp-languagenavigation{position:relative}header.experiencefragment .cmp-languagenavigation:before{background-image:url('data:image/svg+xml;utf8,');background-repeat:no-repeat;content:" ";display:block;height:1.5em}@media(prefers-color-scheme:dark){header.experiencefragment .cmp-languagenavigation:before{background-image:url('data:image/svg+xml;utf8,')}}header.experiencefragment .cmp-languagenavigation>.cmp-languagenavigation__group{background:#ececec;border:1px solid #202020;border-top:0;padding:0 8px;position:absolute;top:34px;-webkit-transition-delay:.5s;transition-delay:.5s;visibility:hidden;width:20em}@media(prefers-color-scheme:dark){header.experiencefragment .cmp-languagenavigation>.cmp-languagenavigation__group{background:#131313;border-color:#dfdfdf}}header.experiencefragment .cmp-languagenavigation:hover>.cmp-languagenavigation__group{-webkit-transition-delay:0s;transition-delay:0s;visibility:visible}header.experiencefragment .cmp-languagenavigation__group{list-style:none;margin:0;padding:0}header.experiencefragment .cmp-languagenavigation__item-title{font-size:x-small;text-transform:uppercase}header.experiencefragment .cmp-languagenavigation__item--level-0{margin-bottom:.5em}header.experiencefragment .cmp-languagenavigation__item--level-1{display:inline}header.experiencefragment .cmp-languagenavigation__item--level-1:not(:first-child):before{content:" | "}header.experiencefragment .cmp-languagenavigation__item--active>.cmp-languagenavigation__item-link{font-weight:700}header.experiencefragment .cmp-search__field{display:-webkit-box;display:-ms-flexbox;display:flex;margin:-3px 0}header.experiencefragment .cmp-search__input{height:26px}
\ No newline at end of file
diff --git a/pkg/int_test_content/main_content/jcr_root/apps/mysite/clientlibs/clientlib-site/js.txt b/pkg/int_test_content/main_content/jcr_root/apps/mysite/clientlibs/clientlib-site/js.txt
new file mode 100644
index 00000000..ffaf1afa
--- /dev/null
+++ b/pkg/int_test_content/main_content/jcr_root/apps/mysite/clientlibs/clientlib-site/js.txt
@@ -0,0 +1,3 @@
+#base=js
+
+site.js
\ No newline at end of file
diff --git a/pkg/int_test_content/main_content/jcr_root/apps/mysite/clientlibs/clientlib-site/js/site.js b/pkg/int_test_content/main_content/jcr_root/apps/mysite/clientlibs/clientlib-site/js/site.js
new file mode 100644
index 00000000..1ca7fa6c
--- /dev/null
+++ b/pkg/int_test_content/main_content/jcr_root/apps/mysite/clientlibs/clientlib-site/js/site.js
@@ -0,0 +1 @@
+!function(){var e={356:function(){!function(){"use strict";var e='[data-cmp-is="helloworld"]',t='[data-cmp-hook-helloworld="property"]',n='[data-cmp-hook-helloworld="model"]';function o(e){e&&e.element&&function(e){e.element.removeAttribute("data-cmp-is");var o=e.element.querySelectorAll(t);o=1==o.length?o[0].textContent:null;var r=e.element.querySelectorAll(n);r=1==r.length?r[0].textContent:null,console&&console.log&&console.log("HelloWorld component JavaScript example","\nText property:\n",o,"\nModel message:\n",r)}(e)}function r(){for(var t=document.querySelectorAll(e),n=0;n0&&n.forEach((function(t){t.querySelectorAll&&[].slice.call(t.querySelectorAll(e)).forEach((function(e){new o({element:e})}))}))}))})).observe(l,{subtree:!0,childList:!0,characterData:!0})}"loading"!==document.readyState?r():document.addEventListener("DOMContentLoaded",r)}()}},t={};function n(o){var r=t[o];if(void 0!==r)return r.exports;var l=t[o]={exports:{}};return e[o](l,l.exports,n),l.exports}n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,{a:t}),t},n.d=function(e,t){for(var o in t)n.o(t,o)&&!n.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:t[o]})},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},function(){"use strict";n(356)}()}();
\ No newline at end of file
diff --git a/pkg/int_test_content/main_content/jcr_root/apps/mysite/components/helloworld/$.content.xml b/pkg/int_test_content/main_content/jcr_root/apps/mysite/components/helloworld/$.content.xml
new file mode 100644
index 00000000..3fad3550
--- /dev/null
+++ b/pkg/int_test_content/main_content/jcr_root/apps/mysite/components/helloworld/$.content.xml
@@ -0,0 +1,5 @@
+
+
diff --git a/pkg/int_test_content/main_content/jcr_root/apps/mysite/components/helloworld/$_cq_dialog.xml b/pkg/int_test_content/main_content/jcr_root/apps/mysite/components/helloworld/$_cq_dialog.xml
new file mode 100644
index 00000000..16d39076
--- /dev/null
+++ b/pkg/int_test_content/main_content/jcr_root/apps/mysite/components/helloworld/$_cq_dialog.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pkg/int_test_content/main_content/jcr_root/apps/mysite/components/helloworld/$_cq_editConfig.xml b/pkg/int_test_content/main_content/jcr_root/apps/mysite/components/helloworld/$_cq_editConfig.xml
new file mode 100644
index 00000000..e6cda673
--- /dev/null
+++ b/pkg/int_test_content/main_content/jcr_root/apps/mysite/components/helloworld/$_cq_editConfig.xml
@@ -0,0 +1,12 @@
+
+
+
+
diff --git a/pkg/int_test_content/main_content/jcr_root/apps/mysite/components/helloworld/$_cq_template.xml b/pkg/int_test_content/main_content/jcr_root/apps/mysite/components/helloworld/$_cq_template.xml
new file mode 100644
index 00000000..15b0b8db
--- /dev/null
+++ b/pkg/int_test_content/main_content/jcr_root/apps/mysite/components/helloworld/$_cq_template.xml
@@ -0,0 +1,4 @@
+
+
diff --git a/pkg/int_test_content/main_content/jcr_root/apps/mysite/components/helloworld/helloworld.html b/pkg/int_test_content/main_content/jcr_root/apps/mysite/components/helloworld/helloworld.html
new file mode 100644
index 00000000..50bdd9e4
--- /dev/null
+++ b/pkg/int_test_content/main_content/jcr_root/apps/mysite/components/helloworld/helloworld.html
@@ -0,0 +1,11 @@
+
+
Hello World Component
+
+
Text property:
+
${properties.text}
+
+
+
Model message:
+
${model.message}
+
+
diff --git a/pkg/int_test_content/main_content/jcr_root/conf/mysite/$.content.xml b/pkg/int_test_content/main_content/jcr_root/conf/mysite/$.content.xml
new file mode 100644
index 00000000..c079c59d
--- /dev/null
+++ b/pkg/int_test_content/main_content/jcr_root/conf/mysite/$.content.xml
@@ -0,0 +1,4 @@
+
+
diff --git a/pkg/int_test_content/main_content/jcr_root/conf/mysite/$_sling_configs/$.content.xml b/pkg/int_test_content/main_content/jcr_root/conf/mysite/$_sling_configs/$.content.xml
new file mode 100644
index 00000000..90209c72
--- /dev/null
+++ b/pkg/int_test_content/main_content/jcr_root/conf/mysite/$_sling_configs/$.content.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
diff --git a/pkg/int_test_content/main_content/jcr_root/conf/mysite/$_sling_configs/com.mysite.pdfviewer.PdfViewerCaConfig/$.content.xml b/pkg/int_test_content/main_content/jcr_root/conf/mysite/$_sling_configs/com.mysite.pdfviewer.PdfViewerCaConfig/$.content.xml
new file mode 100644
index 00000000..39eb2fb3
--- /dev/null
+++ b/pkg/int_test_content/main_content/jcr_root/conf/mysite/$_sling_configs/com.mysite.pdfviewer.PdfViewerCaConfig/$.content.xml
@@ -0,0 +1,8 @@
+
+
+
+
diff --git a/pkg/int_test_content/main_content/jcr_root/conf/mysite/settings/$.content.xml b/pkg/int_test_content/main_content/jcr_root/conf/mysite/settings/$.content.xml
new file mode 100644
index 00000000..491392d5
--- /dev/null
+++ b/pkg/int_test_content/main_content/jcr_root/conf/mysite/settings/$.content.xml
@@ -0,0 +1,3 @@
+
+
diff --git a/pkg/int_test_content/main_content/jcr_root/conf/mysite/settings/wcm/$.content.xml b/pkg/int_test_content/main_content/jcr_root/conf/mysite/settings/wcm/$.content.xml
new file mode 100644
index 00000000..c55e733a
--- /dev/null
+++ b/pkg/int_test_content/main_content/jcr_root/conf/mysite/settings/wcm/$.content.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
diff --git a/pkg/int_test_content/main_content/jcr_root/conf/mysite/settings/wcm/policies/$.content.xml b/pkg/int_test_content/main_content/jcr_root/conf/mysite/settings/wcm/policies/$.content.xml
new file mode 100644
index 00000000..ea668802
--- /dev/null
+++ b/pkg/int_test_content/main_content/jcr_root/conf/mysite/settings/wcm/policies/$.content.xml
@@ -0,0 +1,181 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pkg/int_test_content/main_content/jcr_root/conf/mysite/settings/wcm/policies/$_rep_policy.xml b/pkg/int_test_content/main_content/jcr_root/conf/mysite/settings/wcm/policies/$_rep_policy.xml
new file mode 100644
index 00000000..ad26bd52
--- /dev/null
+++ b/pkg/int_test_content/main_content/jcr_root/conf/mysite/settings/wcm/policies/$_rep_policy.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
diff --git a/pkg/int_test_content/main_content/jcr_root/conf/mysite/settings/wcm/template-types/$.content.xml b/pkg/int_test_content/main_content/jcr_root/conf/mysite/settings/wcm/template-types/$.content.xml
new file mode 100644
index 00000000..724da713
--- /dev/null
+++ b/pkg/int_test_content/main_content/jcr_root/conf/mysite/settings/wcm/template-types/$.content.xml
@@ -0,0 +1,5 @@
+
+
+
+
diff --git a/pkg/int_test_content/main_content/jcr_root/conf/mysite/settings/wcm/template-types/page/$.content.xml b/pkg/int_test_content/main_content/jcr_root/conf/mysite/settings/wcm/template-types/page/$.content.xml
new file mode 100644
index 00000000..db0d9ec0
--- /dev/null
+++ b/pkg/int_test_content/main_content/jcr_root/conf/mysite/settings/wcm/template-types/page/$.content.xml
@@ -0,0 +1,8 @@
+
+
+
+
diff --git a/pkg/int_test_content/main_content/jcr_root/conf/mysite/settings/wcm/template-types/page/initial/$.content.xml b/pkg/int_test_content/main_content/jcr_root/conf/mysite/settings/wcm/template-types/page/initial/$.content.xml
new file mode 100644
index 00000000..20a1550d
--- /dev/null
+++ b/pkg/int_test_content/main_content/jcr_root/conf/mysite/settings/wcm/template-types/page/initial/$.content.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
diff --git a/pkg/int_test_content/main_content/jcr_root/conf/mysite/settings/wcm/template-types/page/policies/$.content.xml b/pkg/int_test_content/main_content/jcr_root/conf/mysite/settings/wcm/template-types/page/policies/$.content.xml
new file mode 100644
index 00000000..20096f30
--- /dev/null
+++ b/pkg/int_test_content/main_content/jcr_root/conf/mysite/settings/wcm/template-types/page/policies/$.content.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
diff --git a/pkg/int_test_content/main_content/jcr_root/conf/mysite/settings/wcm/template-types/page/structure/$.content.xml b/pkg/int_test_content/main_content/jcr_root/conf/mysite/settings/wcm/template-types/page/structure/$.content.xml
new file mode 100644
index 00000000..911a61a3
--- /dev/null
+++ b/pkg/int_test_content/main_content/jcr_root/conf/mysite/settings/wcm/template-types/page/structure/$.content.xml
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pkg/int_test_content/main_content/jcr_root/conf/mysite/workflow/$.content.xml b/pkg/int_test_content/main_content/jcr_root/conf/mysite/workflow/$.content.xml
new file mode 100644
index 00000000..ee2e45c7
--- /dev/null
+++ b/pkg/int_test_content/main_content/jcr_root/conf/mysite/workflow/$.content.xml
@@ -0,0 +1,4 @@
+
+
diff --git a/pkg/int_test_content/main_content/jcr_root/conf/mysite/workflow/launcher/$.content.xml b/pkg/int_test_content/main_content/jcr_root/conf/mysite/workflow/launcher/$.content.xml
new file mode 100644
index 00000000..32703c6c
--- /dev/null
+++ b/pkg/int_test_content/main_content/jcr_root/conf/mysite/workflow/launcher/$.content.xml
@@ -0,0 +1,4 @@
+
+
diff --git a/pkg/int_test_content/main_content/jcr_root/conf/mysite/workflow/launcher/config/$.content.xml b/pkg/int_test_content/main_content/jcr_root/conf/mysite/workflow/launcher/config/$.content.xml
new file mode 100644
index 00000000..5b1063ab
--- /dev/null
+++ b/pkg/int_test_content/main_content/jcr_root/conf/mysite/workflow/launcher/config/$.content.xml
@@ -0,0 +1,4 @@
+
+
diff --git a/pkg/int_test_content/main_content/jcr_root/conf/mysite/workflow/launcher/config/asset_processing/$.content.xml b/pkg/int_test_content/main_content/jcr_root/conf/mysite/workflow/launcher/config/asset_processing/$.content.xml
new file mode 100644
index 00000000..5dfea319
--- /dev/null
+++ b/pkg/int_test_content/main_content/jcr_root/conf/mysite/workflow/launcher/config/asset_processing/$.content.xml
@@ -0,0 +1,12 @@
+
+
diff --git a/pkg/int_test_content/main_content/jcr_root/conf/mysite/workflow/models/$.content.xml b/pkg/int_test_content/main_content/jcr_root/conf/mysite/workflow/models/$.content.xml
new file mode 100644
index 00000000..9f576d29
--- /dev/null
+++ b/pkg/int_test_content/main_content/jcr_root/conf/mysite/workflow/models/$.content.xml
@@ -0,0 +1,4 @@
+
+
diff --git a/pkg/int_test_content/main_content/jcr_root/conf/mysite/workflow/models/archive_page/$.content.xml b/pkg/int_test_content/main_content/jcr_root/conf/mysite/workflow/models/archive_page/$.content.xml
new file mode 100644
index 00000000..41aa947b
--- /dev/null
+++ b/pkg/int_test_content/main_content/jcr_root/conf/mysite/workflow/models/archive_page/$.content.xml
@@ -0,0 +1,131 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <_x0031_
+ jcr:primaryType="nt:unstructured"
+ sling:resourceType="cq/flow/components/parsys">
+
+
+
+
+ <_x0032_
+ jcr:primaryType="nt:unstructured"
+ sling:resourceType="cq/flow/components/parsys">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pkg/int_test_content/main_content/jcr_root/content/mysite/$.content.xml b/pkg/int_test_content/main_content/jcr_root/content/mysite/$.content.xml
new file mode 100644
index 00000000..43c05ae5
--- /dev/null
+++ b/pkg/int_test_content/main_content/jcr_root/content/mysite/$.content.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/pkg/int_test_content/main_content/jcr_root/content/mysite/us/$.content.xml b/pkg/int_test_content/main_content/jcr_root/content/mysite/us/$.content.xml
new file mode 100644
index 00000000..d88a60e8
--- /dev/null
+++ b/pkg/int_test_content/main_content/jcr_root/content/mysite/us/$.content.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
diff --git a/pkg/int_test_content/main_content/jcr_root/content/mysite/us/en/$.content.xml b/pkg/int_test_content/main_content/jcr_root/content/mysite/us/en/$.content.xml
new file mode 100644
index 00000000..99c0329d
--- /dev/null
+++ b/pkg/int_test_content/main_content/jcr_root/content/mysite/us/en/$.content.xml
@@ -0,0 +1,82 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pkg/int_test_content/main_content/jcr_root/var/workflow/models/mysite/$.content.xml b/pkg/int_test_content/main_content/jcr_root/var/workflow/models/mysite/$.content.xml
new file mode 100644
index 00000000..491392d5
--- /dev/null
+++ b/pkg/int_test_content/main_content/jcr_root/var/workflow/models/mysite/$.content.xml
@@ -0,0 +1,3 @@
+
+
diff --git a/pkg/int_test_content/main_content/jcr_root/var/workflow/models/mysite/asset_processing.xml b/pkg/int_test_content/main_content/jcr_root/var/workflow/models/mysite/asset_processing.xml
new file mode 100644
index 00000000..61864281
--- /dev/null
+++ b/pkg/int_test_content/main_content/jcr_root/var/workflow/models/mysite/asset_processing.xml
@@ -0,0 +1,246 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pkg/int_test_content/new_content/jcr_root/apps/mysite/clientlibs/clientlib-site/$.content.xml b/pkg/int_test_content/new_content/jcr_root/apps/mysite/clientlibs/clientlib-site/$.content.xml
new file mode 100644
index 00000000..cbb48e78
--- /dev/null
+++ b/pkg/int_test_content/new_content/jcr_root/apps/mysite/clientlibs/clientlib-site/$.content.xml
@@ -0,0 +1,8 @@
+
+
diff --git a/pkg/int_test_content/new_content/jcr_root/apps/mysite/clientlibs/clientlib-site/css.txt b/pkg/int_test_content/new_content/jcr_root/apps/mysite/clientlibs/clientlib-site/css.txt
new file mode 100644
index 00000000..f852363a
--- /dev/null
+++ b/pkg/int_test_content/new_content/jcr_root/apps/mysite/clientlibs/clientlib-site/css.txt
@@ -0,0 +1,3 @@
+#base=css
+
+site.css
\ No newline at end of file
diff --git a/pkg/int_test_content/new_content/jcr_root/apps/mysite/clientlibs/clientlib-site/css/site.css b/pkg/int_test_content/new_content/jcr_root/apps/mysite/clientlibs/clientlib-site/css/site.css
new file mode 100644
index 00000000..3a86ca3b
--- /dev/null
+++ b/pkg/int_test_content/new_content/jcr_root/apps/mysite/clientlibs/clientlib-site/css/site.css
@@ -0,0 +1 @@
+body,html{background:#ececec;color:#202020;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:1pc;line-height:1.5;margin:0}@media(prefers-color-scheme:dark){body,html{background:#131313;color:#dfdfdf}}a{color:#2020e0}@media(prefers-color-scheme:dark){a{color:#dfdf1f}}button,input,optgroup,select,textarea{font:inherit}.cmp-helloworld__item-label{margin-bottom:0}.cmp-helloworld__item-output{margin-top:0}.cmp-navigation__item--level-0:hover>.cmp-navigation__group{background:#ececec}main.container{padding:.5em 1em}footer.experiencefragment{border-top:1px solid #202020;padding:.5em 1em}@media(prefers-color-scheme:dark){footer.experiencefragment{border-color:#dfdfdf}}footer.experiencefragment .cmp-separator__horizontal-rule{border:0;margin:0}header.experiencefragment{border-bottom:1px solid #202020;padding:.5em 1em}@media(prefers-color-scheme:dark){header.experiencefragment{border-bottom-color:#dfdfdf}}header.experiencefragment a{color:#202020;text-decoration:none}@media(prefers-color-scheme:dark){header.experiencefragment a{color:#dfdfdf}}header.experiencefragment a:focus,header.experiencefragment a:hover{color:#2020e0;text-decoration:underline}@media(prefers-color-scheme:dark){header.experiencefragment a:focus,header.experiencefragment a:hover{color:#dfdf1f}}header.experiencefragment .cmp-container{display:grid;grid-template-columns:4fr 1fr 1fr}header.experiencefragment .cmp-navigation__group{list-style:none;margin:0;padding:0}header.experiencefragment .cmp-navigation__item--level-0{display:grid;grid-template-columns:1fr 3fr}header.experiencefragment .cmp-navigation__item--level-0>.cmp-navigation__group{display:grid;grid-template-columns:repeat(3,1fr)}header.experiencefragment .cmp-navigation__item-link{display:block}header.experiencefragment .cmp-navigation__item--active>.cmp-navigation__item-link{font-weight:700}header.experiencefragment .cmp-languagenavigation{position:relative}header.experiencefragment .cmp-languagenavigation:before{background-image:url('data:image/svg+xml;utf8,');background-repeat:no-repeat;content:" ";display:block;height:1.5em}@media(prefers-color-scheme:dark){header.experiencefragment .cmp-languagenavigation:before{background-image:url('data:image/svg+xml;utf8,')}}header.experiencefragment .cmp-languagenavigation>.cmp-languagenavigation__group{background:#ececec;border:1px solid #202020;border-top:0;padding:0 8px;position:absolute;top:34px;-webkit-transition-delay:.5s;transition-delay:.5s;visibility:hidden;width:20em}@media(prefers-color-scheme:dark){header.experiencefragment .cmp-languagenavigation>.cmp-languagenavigation__group{background:#131313;border-color:#dfdfdf}}header.experiencefragment .cmp-languagenavigation:hover>.cmp-languagenavigation__group{-webkit-transition-delay:0s;transition-delay:0s;visibility:visible}header.experiencefragment .cmp-languagenavigation__group{list-style:none;margin:0;padding:0}header.experiencefragment .cmp-languagenavigation__item-title{font-size:x-small;text-transform:uppercase}header.experiencefragment .cmp-languagenavigation__item--level-0{margin-bottom:.5em}header.experiencefragment .cmp-languagenavigation__item--level-1{display:inline}header.experiencefragment .cmp-languagenavigation__item--level-1:not(:first-child):before{content:" | "}header.experiencefragment .cmp-languagenavigation__item--active>.cmp-languagenavigation__item-link{font-weight:700}header.experiencefragment .cmp-search__field{display:-webkit-box;display:-ms-flexbox;display:flex;margin:-3px 0}header.experiencefragment .cmp-search__input{height:26px}
\ No newline at end of file
diff --git a/pkg/int_test_content/new_content/jcr_root/apps/mysite/clientlibs/clientlib-site/js.txt b/pkg/int_test_content/new_content/jcr_root/apps/mysite/clientlibs/clientlib-site/js.txt
new file mode 100644
index 00000000..ffaf1afa
--- /dev/null
+++ b/pkg/int_test_content/new_content/jcr_root/apps/mysite/clientlibs/clientlib-site/js.txt
@@ -0,0 +1,3 @@
+#base=js
+
+site.js
\ No newline at end of file
diff --git a/pkg/int_test_content/new_content/jcr_root/apps/mysite/clientlibs/clientlib-site/js/site.js b/pkg/int_test_content/new_content/jcr_root/apps/mysite/clientlibs/clientlib-site/js/site.js
new file mode 100644
index 00000000..1ca7fa6c
--- /dev/null
+++ b/pkg/int_test_content/new_content/jcr_root/apps/mysite/clientlibs/clientlib-site/js/site.js
@@ -0,0 +1 @@
+!function(){var e={356:function(){!function(){"use strict";var e='[data-cmp-is="helloworld"]',t='[data-cmp-hook-helloworld="property"]',n='[data-cmp-hook-helloworld="model"]';function o(e){e&&e.element&&function(e){e.element.removeAttribute("data-cmp-is");var o=e.element.querySelectorAll(t);o=1==o.length?o[0].textContent:null;var r=e.element.querySelectorAll(n);r=1==r.length?r[0].textContent:null,console&&console.log&&console.log("HelloWorld component JavaScript example","\nText property:\n",o,"\nModel message:\n",r)}(e)}function r(){for(var t=document.querySelectorAll(e),n=0;n0&&n.forEach((function(t){t.querySelectorAll&&[].slice.call(t.querySelectorAll(e)).forEach((function(e){new o({element:e})}))}))}))})).observe(l,{subtree:!0,childList:!0,characterData:!0})}"loading"!==document.readyState?r():document.addEventListener("DOMContentLoaded",r)}()}},t={};function n(o){var r=t[o];if(void 0!==r)return r.exports;var l=t[o]={exports:{}};return e[o](l,l.exports,n),l.exports}n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,{a:t}),t},n.d=function(e,t){for(var o in t)n.o(t,o)&&!n.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:t[o]})},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},function(){"use strict";n(356)}()}();
\ No newline at end of file
diff --git a/pkg/int_test_content/new_content/jcr_root/apps/mysite/components/helloworld/$.content.xml b/pkg/int_test_content/new_content/jcr_root/apps/mysite/components/helloworld/$.content.xml
new file mode 100644
index 00000000..64af2940
--- /dev/null
+++ b/pkg/int_test_content/new_content/jcr_root/apps/mysite/components/helloworld/$.content.xml
@@ -0,0 +1,6 @@
+
+
diff --git a/pkg/int_test_content/new_content/jcr_root/apps/mysite/components/helloworld/$_cq_dialog.xml b/pkg/int_test_content/new_content/jcr_root/apps/mysite/components/helloworld/$_cq_dialog.xml
new file mode 100644
index 00000000..3d816e82
--- /dev/null
+++ b/pkg/int_test_content/new_content/jcr_root/apps/mysite/components/helloworld/$_cq_dialog.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pkg/int_test_content/new_content/jcr_root/apps/mysite/components/helloworld/$_cq_editConfig.xml b/pkg/int_test_content/new_content/jcr_root/apps/mysite/components/helloworld/$_cq_editConfig.xml
new file mode 100644
index 00000000..e6cda673
--- /dev/null
+++ b/pkg/int_test_content/new_content/jcr_root/apps/mysite/components/helloworld/$_cq_editConfig.xml
@@ -0,0 +1,12 @@
+
+
+
+
diff --git a/pkg/int_test_content/new_content/jcr_root/apps/mysite/components/helloworld/$_cq_template.xml b/pkg/int_test_content/new_content/jcr_root/apps/mysite/components/helloworld/$_cq_template.xml
new file mode 100644
index 00000000..d42a4753
--- /dev/null
+++ b/pkg/int_test_content/new_content/jcr_root/apps/mysite/components/helloworld/$_cq_template.xml
@@ -0,0 +1,4 @@
+
+
diff --git a/pkg/int_test_content/new_content/jcr_root/apps/mysite/components/helloworld/$_cq_template/$.content.xml b/pkg/int_test_content/new_content/jcr_root/apps/mysite/components/helloworld/$_cq_template/$.content.xml
new file mode 100644
index 00000000..d42a4753
--- /dev/null
+++ b/pkg/int_test_content/new_content/jcr_root/apps/mysite/components/helloworld/$_cq_template/$.content.xml
@@ -0,0 +1,4 @@
+
+
diff --git a/pkg/int_test_content/new_content/jcr_root/apps/mysite/components/helloworld/helloworld.html b/pkg/int_test_content/new_content/jcr_root/apps/mysite/components/helloworld/helloworld.html
new file mode 100644
index 00000000..c036fb3e
--- /dev/null
+++ b/pkg/int_test_content/new_content/jcr_root/apps/mysite/components/helloworld/helloworld.html
@@ -0,0 +1,11 @@
+
+
Hello World Component
+
+
Text property:
+
${properties.text}
+
+
+
Model message:
+
${model.message}
+
+
diff --git a/pkg/int_test_content/new_content/jcr_root/conf/mysite/$.content.xml b/pkg/int_test_content/new_content/jcr_root/conf/mysite/$.content.xml
new file mode 100644
index 00000000..c079c59d
--- /dev/null
+++ b/pkg/int_test_content/new_content/jcr_root/conf/mysite/$.content.xml
@@ -0,0 +1,4 @@
+
+
diff --git a/pkg/int_test_content/new_content/jcr_root/conf/mysite/$_sling_configs/$.content.xml b/pkg/int_test_content/new_content/jcr_root/conf/mysite/$_sling_configs/$.content.xml
new file mode 100644
index 00000000..a9759f5f
--- /dev/null
+++ b/pkg/int_test_content/new_content/jcr_root/conf/mysite/$_sling_configs/$.content.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
diff --git a/pkg/int_test_content/new_content/jcr_root/conf/mysite/$_sling_configs/com.mysite.pdfviewer.PdfViewerCaConfig/$.content.xml b/pkg/int_test_content/new_content/jcr_root/conf/mysite/$_sling_configs/com.mysite.pdfviewer.PdfViewerCaConfig/$.content.xml
new file mode 100644
index 00000000..725d21ea
--- /dev/null
+++ b/pkg/int_test_content/new_content/jcr_root/conf/mysite/$_sling_configs/com.mysite.pdfviewer.PdfViewerCaConfig/$.content.xml
@@ -0,0 +1,9 @@
+
+
+
+
diff --git a/pkg/int_test_content/new_content/jcr_root/conf/mysite/settings/$.content.xml b/pkg/int_test_content/new_content/jcr_root/conf/mysite/settings/$.content.xml
new file mode 100644
index 00000000..491392d5
--- /dev/null
+++ b/pkg/int_test_content/new_content/jcr_root/conf/mysite/settings/$.content.xml
@@ -0,0 +1,3 @@
+
+
diff --git a/pkg/int_test_content/new_content/jcr_root/conf/mysite/settings/wcm/$.content.xml b/pkg/int_test_content/new_content/jcr_root/conf/mysite/settings/wcm/$.content.xml
new file mode 100644
index 00000000..c55e733a
--- /dev/null
+++ b/pkg/int_test_content/new_content/jcr_root/conf/mysite/settings/wcm/$.content.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
diff --git a/pkg/int_test_content/new_content/jcr_root/conf/mysite/settings/wcm/policies/$.content.xml b/pkg/int_test_content/new_content/jcr_root/conf/mysite/settings/wcm/policies/$.content.xml
new file mode 100644
index 00000000..ea668802
--- /dev/null
+++ b/pkg/int_test_content/new_content/jcr_root/conf/mysite/settings/wcm/policies/$.content.xml
@@ -0,0 +1,181 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pkg/int_test_content/new_content/jcr_root/conf/mysite/settings/wcm/policies/$_rep_policy.xml b/pkg/int_test_content/new_content/jcr_root/conf/mysite/settings/wcm/policies/$_rep_policy.xml
new file mode 100644
index 00000000..cfe50fa7
--- /dev/null
+++ b/pkg/int_test_content/new_content/jcr_root/conf/mysite/settings/wcm/policies/$_rep_policy.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
diff --git a/pkg/int_test_content/new_content/jcr_root/conf/mysite/settings/wcm/template-types/$.content.xml b/pkg/int_test_content/new_content/jcr_root/conf/mysite/settings/wcm/template-types/$.content.xml
new file mode 100644
index 00000000..724da713
--- /dev/null
+++ b/pkg/int_test_content/new_content/jcr_root/conf/mysite/settings/wcm/template-types/$.content.xml
@@ -0,0 +1,5 @@
+
+
+
+
diff --git a/pkg/int_test_content/new_content/jcr_root/conf/mysite/settings/wcm/template-types/page/$.content.xml b/pkg/int_test_content/new_content/jcr_root/conf/mysite/settings/wcm/template-types/page/$.content.xml
new file mode 100644
index 00000000..9c3ef9c0
--- /dev/null
+++ b/pkg/int_test_content/new_content/jcr_root/conf/mysite/settings/wcm/template-types/page/$.content.xml
@@ -0,0 +1,9 @@
+
+
+
+
diff --git a/pkg/int_test_content/new_content/jcr_root/conf/mysite/settings/wcm/template-types/page/initial/$.content.xml b/pkg/int_test_content/new_content/jcr_root/conf/mysite/settings/wcm/template-types/page/initial/$.content.xml
new file mode 100644
index 00000000..20a1550d
--- /dev/null
+++ b/pkg/int_test_content/new_content/jcr_root/conf/mysite/settings/wcm/template-types/page/initial/$.content.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
diff --git a/pkg/int_test_content/new_content/jcr_root/conf/mysite/settings/wcm/template-types/page/policies/$.content.xml b/pkg/int_test_content/new_content/jcr_root/conf/mysite/settings/wcm/template-types/page/policies/$.content.xml
new file mode 100644
index 00000000..20096f30
--- /dev/null
+++ b/pkg/int_test_content/new_content/jcr_root/conf/mysite/settings/wcm/template-types/page/policies/$.content.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
diff --git a/pkg/int_test_content/new_content/jcr_root/conf/mysite/settings/wcm/template-types/page/structure/$.content.xml b/pkg/int_test_content/new_content/jcr_root/conf/mysite/settings/wcm/template-types/page/structure/$.content.xml
new file mode 100644
index 00000000..911a61a3
--- /dev/null
+++ b/pkg/int_test_content/new_content/jcr_root/conf/mysite/settings/wcm/template-types/page/structure/$.content.xml
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pkg/int_test_content/new_content/jcr_root/conf/mysite/workflow/$.content.xml b/pkg/int_test_content/new_content/jcr_root/conf/mysite/workflow/$.content.xml
new file mode 100644
index 00000000..ee2e45c7
--- /dev/null
+++ b/pkg/int_test_content/new_content/jcr_root/conf/mysite/workflow/$.content.xml
@@ -0,0 +1,4 @@
+
+
diff --git a/pkg/int_test_content/new_content/jcr_root/conf/mysite/workflow/launcher/$.content.xml b/pkg/int_test_content/new_content/jcr_root/conf/mysite/workflow/launcher/$.content.xml
new file mode 100644
index 00000000..32703c6c
--- /dev/null
+++ b/pkg/int_test_content/new_content/jcr_root/conf/mysite/workflow/launcher/$.content.xml
@@ -0,0 +1,4 @@
+
+
diff --git a/pkg/int_test_content/new_content/jcr_root/conf/mysite/workflow/launcher/config/$.content.xml b/pkg/int_test_content/new_content/jcr_root/conf/mysite/workflow/launcher/config/$.content.xml
new file mode 100644
index 00000000..5b1063ab
--- /dev/null
+++ b/pkg/int_test_content/new_content/jcr_root/conf/mysite/workflow/launcher/config/$.content.xml
@@ -0,0 +1,4 @@
+
+
diff --git a/pkg/int_test_content/new_content/jcr_root/conf/mysite/workflow/launcher/config/asset_processing/$.content.xml b/pkg/int_test_content/new_content/jcr_root/conf/mysite/workflow/launcher/config/asset_processing/$.content.xml
new file mode 100644
index 00000000..746cf1ea
--- /dev/null
+++ b/pkg/int_test_content/new_content/jcr_root/conf/mysite/workflow/launcher/config/asset_processing/$.content.xml
@@ -0,0 +1,13 @@
+
+
diff --git a/pkg/int_test_content/new_content/jcr_root/conf/mysite/workflow/models/$.content.xml b/pkg/int_test_content/new_content/jcr_root/conf/mysite/workflow/models/$.content.xml
new file mode 100644
index 00000000..9f576d29
--- /dev/null
+++ b/pkg/int_test_content/new_content/jcr_root/conf/mysite/workflow/models/$.content.xml
@@ -0,0 +1,4 @@
+
+
diff --git a/pkg/int_test_content/new_content/jcr_root/conf/mysite/workflow/models/archive_page/$.content.xml b/pkg/int_test_content/new_content/jcr_root/conf/mysite/workflow/models/archive_page/$.content.xml
new file mode 100644
index 00000000..41aa947b
--- /dev/null
+++ b/pkg/int_test_content/new_content/jcr_root/conf/mysite/workflow/models/archive_page/$.content.xml
@@ -0,0 +1,131 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <_x0031_
+ jcr:primaryType="nt:unstructured"
+ sling:resourceType="cq/flow/components/parsys">
+
+
+
+
+ <_x0032_
+ jcr:primaryType="nt:unstructured"
+ sling:resourceType="cq/flow/components/parsys">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pkg/int_test_content/new_content/jcr_root/content/mysite/$.content.xml b/pkg/int_test_content/new_content/jcr_root/content/mysite/$.content.xml
new file mode 100644
index 00000000..b170bfe6
--- /dev/null
+++ b/pkg/int_test_content/new_content/jcr_root/content/mysite/$.content.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
diff --git a/pkg/int_test_content/new_content/jcr_root/content/mysite/us/$.content.xml b/pkg/int_test_content/new_content/jcr_root/content/mysite/us/$.content.xml
new file mode 100644
index 00000000..87f23cd4
--- /dev/null
+++ b/pkg/int_test_content/new_content/jcr_root/content/mysite/us/$.content.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
diff --git a/pkg/int_test_content/new_content/jcr_root/content/mysite/us/en/$.content.xml b/pkg/int_test_content/new_content/jcr_root/content/mysite/us/en/$.content.xml
new file mode 100644
index 00000000..5d91f0fc
--- /dev/null
+++ b/pkg/int_test_content/new_content/jcr_root/content/mysite/us/en/$.content.xml
@@ -0,0 +1,83 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pkg/int_test_content/new_content/jcr_root/var/workflow/models/mysite/$.content.xml b/pkg/int_test_content/new_content/jcr_root/var/workflow/models/mysite/$.content.xml
new file mode 100644
index 00000000..491392d5
--- /dev/null
+++ b/pkg/int_test_content/new_content/jcr_root/var/workflow/models/mysite/$.content.xml
@@ -0,0 +1,3 @@
+
+
diff --git a/pkg/int_test_content/new_content/jcr_root/var/workflow/models/mysite/asset_processing.xml b/pkg/int_test_content/new_content/jcr_root/var/workflow/models/mysite/asset_processing.xml
new file mode 100644
index 00000000..27f086bb
--- /dev/null
+++ b/pkg/int_test_content/new_content/jcr_root/var/workflow/models/mysite/asset_processing.xml
@@ -0,0 +1,246 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pkg/pkg/vault/META-INF/vault/nodetypes.cnd b/pkg/pkg/vault/META-INF/vault/nodetypes.cnd
index c5b1f740..fd926604 100644
--- a/pkg/pkg/vault/META-INF/vault/nodetypes.cnd
+++ b/pkg/pkg/vault/META-INF/vault/nodetypes.cnd
@@ -3,4 +3,3 @@
[rep:RepoAccessControllable]
mixin
+ rep:repoPolicy (rep:Policy) protected ignore
-
diff --git a/pkg/pkg/vault/META-INF/vault/properties.xml b/pkg/pkg/vault/META-INF/vault/properties.xml
index 0ee3dc67..40978aae 100644
--- a/pkg/pkg/vault/META-INF/vault/properties.xml
+++ b/pkg/pkg/vault/META-INF/vault/properties.xml
@@ -5,4 +5,5 @@
[[.Name]][[if (ne .Version "")]]
[[.Version]][[end]]
AEM Compose
+ merge