[{"data":1,"prerenderedAt":2662},["ShallowReactive",2],{"docs-list-en":3},[4,496,748,1234,1607,2065],{"id":5,"title":6,"body":7,"category":486,"description":487,"draft":488,"extension":489,"meta":490,"navigation":175,"order":491,"path":492,"seo":493,"stem":494,"__hash__":495},"docsEn\u002Fdocs\u002Fci-cd-opmbuild.md","Build .opm in CI\u002FCD with opmbuild",{"type":8,"value":9,"toc":479},"minimark",[10,14,31,36,58,65,69,146,150,428,432,448,452,475],[11,12,6],"h1",{"id":13},"build-opm-in-cicd-with-opmbuild",[15,16,17,21,22,25,26,30],"p",{},[18,19,20],"code",{},"OPM::Maker"," is a standalone Perl CPAN module that provides the ",[18,23,24],{},".opm"," tools ",[27,28,29],"strong",{},"without"," requiring a full OTOBO or Znuny installation. This makes it ideal for CI\u002FCD pipelines.",[32,33,35],"h2",{"id":34},"installation","Installation",[37,38,43],"pre",{"className":39,"code":40,"language":41,"meta":42,"style":42},"language-bash shiki shiki-themes one-dark-pro","cpanm OPM::Maker\n","bash","",[18,44,45],{"__ignoreMap":42},[46,47,50,54],"span",{"class":48,"line":49},"line",1,[46,51,53],{"class":52},"sVbv2","cpanm",[46,55,57],{"class":56},"subq3"," OPM::Maker\n",[15,59,60,61,64],{},"This makes the ",[18,62,63],{},"opmbuild"," command available.",[32,66,68],{"id":67},"commands","Commands",[70,71,72,86],"table",{},[73,74,75],"thead",{},[76,77,78,83],"tr",{},[79,80,82],"th",{"align":81},"left","Command",[79,84,85],{"align":81},"Purpose",[87,88,89,100,110,120,133],"tbody",{},[76,90,91,97],{},[92,93,94],"td",{"align":81},[18,95,96],{},"opmbuild sopmtest MyPackage.sopm",[92,98,99],{"align":81},"Validate manifest XML and structure",[76,101,102,107],{},[92,103,104],{"align":81},[18,105,106],{},"opmbuild filetest MyPackage.sopm",[92,108,109],{"align":81},"Verify file list against files on disk",[76,111,112,117],{},[92,113,114],{"align":81},[18,115,116],{},"opmbuild dependencies MyPackage.sopm",[92,118,119],{"align":81},"List dependencies",[76,121,122,127],{},[92,123,124],{"align":81},[18,125,126],{},"opmbuild build --output dist\u002F MyPackage.sopm",[92,128,129,130,132],{"align":81},"Generate ",[18,131,24],{}," file",[76,134,135,140],{},[92,136,137],{"align":81},[18,138,139],{},"opmbuild index repo\u002F",[92,141,142,143,145],{"align":81},"Create repository index XML for a directory containing ",[18,144,24],{}," files",[32,147,149],{"id":148},"github-actions-example","GitHub Actions Example",[37,151,155],{"className":152,"code":153,"language":154,"meta":42,"style":42},"language-yaml shiki shiki-themes one-dark-pro","name: Build OPM package\n\non:\n  push:\n    tags: ['v*']\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    container: perl:5.40\n    steps:\n      - uses: actions\u002Fcheckout@v4\n\n      - name: Install OPM::Maker\n        run: cpanm --notest OPM::Maker\n\n      - name: Validate manifest\n        run: |\n          opmbuild sopmtest MyPackage.sopm\n          opmbuild filetest MyPackage.sopm\n\n      - name: Build .opm\n        run: opmbuild build --output dist\u002F MyPackage.sopm\n\n      - name: Upload artifact\n        uses: actions\u002Fupload-artifact@v4\n        with:\n          name: opm-package\n          path: dist\u002F*.opm\n","yaml",[18,156,157,170,177,187,195,210,215,223,231,242,253,261,275,280,292,303,308,320,331,337,343,348,360,370,375,387,398,406,417],{"__ignoreMap":42},[46,158,159,163,167],{"class":48,"line":49},[46,160,162],{"class":161},"sVyAn","name",[46,164,166],{"class":165},"sn6KH",": ",[46,168,169],{"class":56},"Build OPM package\n",[46,171,173],{"class":48,"line":172},2,[46,174,176],{"emptyLinePlaceholder":175},true,"\n",[46,178,180,184],{"class":48,"line":179},3,[46,181,183],{"class":182},"sVC51","on",[46,185,186],{"class":165},":\n",[46,188,190,193],{"class":48,"line":189},4,[46,191,192],{"class":161},"  push",[46,194,186],{"class":165},[46,196,198,201,204,207],{"class":48,"line":197},5,[46,199,200],{"class":161},"    tags",[46,202,203],{"class":165},": [",[46,205,206],{"class":56},"'v*'",[46,208,209],{"class":165},"]\n",[46,211,213],{"class":48,"line":212},6,[46,214,176],{"emptyLinePlaceholder":175},[46,216,218,221],{"class":48,"line":217},7,[46,219,220],{"class":161},"jobs",[46,222,186],{"class":165},[46,224,226,229],{"class":48,"line":225},8,[46,227,228],{"class":161},"  build",[46,230,186],{"class":165},[46,232,234,237,239],{"class":48,"line":233},9,[46,235,236],{"class":161},"    runs-on",[46,238,166],{"class":165},[46,240,241],{"class":56},"ubuntu-latest\n",[46,243,245,248,250],{"class":48,"line":244},10,[46,246,247],{"class":161},"    container",[46,249,166],{"class":165},[46,251,252],{"class":56},"perl:5.40\n",[46,254,256,259],{"class":48,"line":255},11,[46,257,258],{"class":161},"    steps",[46,260,186],{"class":165},[46,262,264,267,270,272],{"class":48,"line":263},12,[46,265,266],{"class":165},"      - ",[46,268,269],{"class":161},"uses",[46,271,166],{"class":165},[46,273,274],{"class":56},"actions\u002Fcheckout@v4\n",[46,276,278],{"class":48,"line":277},13,[46,279,176],{"emptyLinePlaceholder":175},[46,281,283,285,287,289],{"class":48,"line":282},14,[46,284,266],{"class":165},[46,286,162],{"class":161},[46,288,166],{"class":165},[46,290,291],{"class":56},"Install OPM::Maker\n",[46,293,295,298,300],{"class":48,"line":294},15,[46,296,297],{"class":161},"        run",[46,299,166],{"class":165},[46,301,302],{"class":56},"cpanm --notest OPM::Maker\n",[46,304,306],{"class":48,"line":305},16,[46,307,176],{"emptyLinePlaceholder":175},[46,309,311,313,315,317],{"class":48,"line":310},17,[46,312,266],{"class":165},[46,314,162],{"class":161},[46,316,166],{"class":165},[46,318,319],{"class":56},"Validate manifest\n",[46,321,323,325,327],{"class":48,"line":322},18,[46,324,297],{"class":161},[46,326,166],{"class":165},[46,328,330],{"class":329},"seHd6","|\n",[46,332,334],{"class":48,"line":333},19,[46,335,336],{"class":56},"          opmbuild sopmtest MyPackage.sopm\n",[46,338,340],{"class":48,"line":339},20,[46,341,342],{"class":56},"          opmbuild filetest MyPackage.sopm\n",[46,344,346],{"class":48,"line":345},21,[46,347,176],{"emptyLinePlaceholder":175},[46,349,351,353,355,357],{"class":48,"line":350},22,[46,352,266],{"class":165},[46,354,162],{"class":161},[46,356,166],{"class":165},[46,358,359],{"class":56},"Build .opm\n",[46,361,363,365,367],{"class":48,"line":362},23,[46,364,297],{"class":161},[46,366,166],{"class":165},[46,368,369],{"class":56},"opmbuild build --output dist\u002F MyPackage.sopm\n",[46,371,373],{"class":48,"line":372},24,[46,374,176],{"emptyLinePlaceholder":175},[46,376,378,380,382,384],{"class":48,"line":377},25,[46,379,266],{"class":165},[46,381,162],{"class":161},[46,383,166],{"class":165},[46,385,386],{"class":56},"Upload artifact\n",[46,388,390,393,395],{"class":48,"line":389},26,[46,391,392],{"class":161},"        uses",[46,394,166],{"class":165},[46,396,397],{"class":56},"actions\u002Fupload-artifact@v4\n",[46,399,401,404],{"class":48,"line":400},27,[46,402,403],{"class":161},"        with",[46,405,186],{"class":165},[46,407,409,412,414],{"class":48,"line":408},28,[46,410,411],{"class":161},"          name",[46,413,166],{"class":165},[46,415,416],{"class":56},"opm-package\n",[46,418,420,423,425],{"class":48,"line":419},29,[46,421,422],{"class":161},"          path",[46,424,166],{"class":165},[46,426,427],{"class":56},"dist\u002F*.opm\n",[32,429,431],{"id":430},"without-a-dedicated-pipeline-the-hub-build-service","Without a Dedicated Pipeline: The Hub Build Service",[15,433,434,435,437,438,441,442,447],{},"Open ITSM Hub optionally provides a stateless service that wraps ",[18,436,63],{}," behind an HTTP API (see ",[18,439,440],{},"backend\u002Fopmbuild-service","). When enabled, the ",[443,444,446],"a",{"href":445},"\u002Ftools\u002Fsopm-validator",".sopm Validator"," and generators perform actual Perl validation on the server side—completely without a local Perl installation.",[32,449,451],{"id":450},"tip-multi-framework-builds","Tip: Multi-Framework Builds",[15,453,454,455,458,459,462,463,466,467,469,470,474],{},"Since a ",[18,456,457],{},".sopm"," file can contain multiple ",[18,460,461],{},"\u003CFramework>"," lines, a ",[27,464,465],{},"single"," build generates an ",[18,468,24],{}," package that can be installed on all declared forks. Check your compatibility beforehand using the ",[443,471,473],{"href":472},"\u002Ftools\u002Fcompatibility-checker","Compatibility Checker",".",[476,477,478],"style",{},"html pre.shiki code .sVbv2, html code.shiki .sVbv2{--shiki-default:#61AFEF}html pre.shiki code .subq3, html code.shiki .subq3{--shiki-default:#98C379}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sVyAn, html code.shiki .sVyAn{--shiki-default:#E06C75}html pre.shiki code .sn6KH, html code.shiki .sn6KH{--shiki-default:#ABB2BF}html pre.shiki code .sVC51, html code.shiki .sVC51{--shiki-default:#D19A66}html pre.shiki code .seHd6, html code.shiki .seHd6{--shiki-default:#C678DD}",{"title":42,"searchDepth":172,"depth":172,"links":480},[481,482,483,484,485],{"id":34,"depth":172,"text":35},{"id":67,"depth":172,"text":68},{"id":148,"depth":172,"text":149},{"id":430,"depth":172,"text":431},{"id":450,"depth":172,"text":451},"Automation","Automate building and testing OTOBO and Znuny packages without a full ticketing system installed — using the CPAN tool OPM::Maker (opmbuild) in GitHub Actions.",false,"md",{},60,"\u002Fdocs\u002Fci-cd-opmbuild",{"title":6,"description":487},"docs\u002Fci-cd-opmbuild","8DiJ4Nz-ztao1NdwVy48gdmjXdD5qsxEYbCyUQdBprY",{"id":497,"title":498,"body":499,"category":740,"description":741,"draft":488,"extension":489,"meta":742,"navigation":175,"order":743,"path":744,"seo":745,"stem":746,"__hash__":747},"docsEn\u002Fdocs\u002Fotobo-znuny-kompatibilitaet.md","Will my package run on OTOBO and Znuny?",{"type":8,"value":500,"toc":734},[501,504,522,526,592,602,606,666,673,677,686,712,719,723,731],[11,502,498],{"id":503},"will-my-package-run-on-otobo-and-znuny",[15,505,506,507,510,511,513,514,518,519,521],{},"Short answer: ",[27,508,509],{},"usually yes"," — but you have to declare it correctly. OTOBO, Znuny, and OTRS Community Edition all originate from the same OTRS codebase and share the ",[18,512,24],{}," format. The most common reason why a package ",[515,516,517],"em",{},"cannot"," be installed on a fork is a missing ",[18,520,461],{}," line, not the code itself.",[32,523,525],{"id":524},"version-lines-differ","Version lines differ",[70,527,528,538],{},[73,529,530],{},[76,531,532,535],{},[79,533,534],{"align":81},"Fork",[79,536,537],{"align":81},"Version Lines",[87,539,540,560,580],{},[76,541,542,545],{},[92,543,544],{"align":81},"OTOBO",[92,546,547,550,551,550,554,550,557],{"align":81},[18,548,549],{},"10.0.x",", ",[18,552,553],{},"10.1.x",[18,555,556],{},"11.0.x",[18,558,559],{},"11.1.x",[76,561,562,565],{},[92,563,564],{"align":81},"Znuny",[92,566,567,570,571,550,574,550,577],{"align":81},[18,568,569],{},"6.0.x"," … ",[18,572,573],{},"6.5.x",[18,575,576],{},"7.0.x",[18,578,579],{},"7.1.x",[76,581,582,585],{},[92,583,584],{"align":81},"OTRS Community Edition",[92,586,587,550,590],{"align":81},[18,588,589],{},"5.0.x",[18,591,569],{},[15,593,594,595,598,599,601],{},"A package that only declares ",[18,596,597],{},"\u003CFramework>6.0.x\u003C\u002FFramework>"," will be rejected by the ",[27,600,544],{}," package manager — even though the exact same code often runs there without issues. The package manager only checks the declared version.",[32,603,605],{"id":604},"solution-declare-multiple-frameworks","Solution: declare multiple frameworks",[37,607,611],{"className":608,"code":609,"language":610,"meta":42,"style":42},"language-xml shiki shiki-themes one-dark-pro","\u003CFramework>11.0.x\u003C\u002FFramework>   \u003C!-- OTOBO -->\n\u003CFramework>7.0.x\u003C\u002FFramework>    \u003C!-- Znuny -->\n\u003CFramework>6.0.x\u003C\u002FFramework>    \u003C!-- OTRS CE -->\n","xml",[18,612,613,633,650],{"__ignoreMap":42},[46,614,615,618,621,624,626,629],{"class":48,"line":49},[46,616,617],{"class":165},"\u003C",[46,619,620],{"class":161},"Framework",[46,622,623],{"class":165},">11.0.x\u003C\u002F",[46,625,620],{"class":161},[46,627,628],{"class":165},">   ",[46,630,632],{"class":631},"sV9Aq","\u003C!-- OTOBO -->\n",[46,634,635,637,639,642,644,647],{"class":48,"line":172},[46,636,617],{"class":165},[46,638,620],{"class":161},[46,640,641],{"class":165},">7.0.x\u003C\u002F",[46,643,620],{"class":161},[46,645,646],{"class":165},">    ",[46,648,649],{"class":631},"\u003C!-- Znuny -->\n",[46,651,652,654,656,659,661,663],{"class":48,"line":179},[46,653,617],{"class":165},[46,655,620],{"class":161},[46,657,658],{"class":165},">6.0.x\u003C\u002F",[46,660,620],{"class":161},[46,662,646],{"class":165},[46,664,665],{"class":631},"\u003C!-- OTRS CE -->\n",[15,667,668,669,672],{},"The ",[443,670,671],{"href":472},"compatibility checker"," instantly shows which forks your package targets and suggests missing sister versions.",[32,674,676],{"id":675},"declaration-is-not-a-free-pass","Declaration is not a free pass",[15,678,679,680,682,683,685],{},"A matching ",[18,681,461],{}," line only permits ",[515,684,34],{},". Before releasing for another fork, check:",[687,688,689,700,706],"ul",{},[690,691,692,695,696,699],"li",{},[27,693,694],{},"Internal API calls"," — some ",[18,697,698],{},"Kernel::System::*"," modules differ between OTOBO and Znuny.",[690,701,702,705],{},[27,703,704],{},"Templates"," — OTOBO has modernized parts of the frontend.",[690,707,708,711],{},[27,709,710],{},"Database schema"," — rare, but possible for core-related packages.",[15,713,714,715,718],{},"Test on every target version, ideally in an automated way (see ",[443,716,717],{"href":492},"CI\u002FCD with opmbuild",").",[32,720,722],{"id":721},"increase-reach","Increase reach",[15,724,725,726,730],{},"If your package supports multiple forks, ",[443,727,729],{"href":728},"\u002Fdocs\u002Fpaket-veroeffentlichen","list it on Open ITSM Hub"," with all compatible systems — this helps users across all three communities find it.",[476,732,733],{},"html pre.shiki code .sn6KH, html code.shiki .sn6KH{--shiki-default:#ABB2BF}html pre.shiki code .sVyAn, html code.shiki .sVyAn{--shiki-default:#E06C75}html pre.shiki code .sV9Aq, html code.shiki .sV9Aq{--shiki-default:#7F848E;--shiki-default-font-style:italic}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":42,"searchDepth":172,"depth":172,"links":735},[736,737,738,739],{"id":524,"depth":172,"text":525},{"id":604,"depth":172,"text":605},{"id":675,"depth":172,"text":676},{"id":721,"depth":172,"text":722},"Compatibility","Why OTOBO, Znuny, and OTRS packages usually work across forks — and how to make your .opm available for all three forks using the correct \u003CFramework> settings.",{},40,"\u002Fdocs\u002Fotobo-znuny-kompatibilitaet",{"title":498,"description":741},"docs\u002Fotobo-znuny-kompatibilitaet","iVtiC_af9QZbnL2LNvgR-TcY3BdvA4_6cpFIFYIZVpQ",{"id":749,"title":750,"body":751,"category":1227,"description":1228,"draft":488,"extension":489,"meta":1229,"navigation":175,"order":244,"path":1230,"seo":1231,"stem":1232,"__hash__":1233},"docsEn\u002Fdocs\u002Fotobo-znuny-paket-bauen.md","Building OTOBO & Znuny Packages (.opm)",{"type":8,"value":752,"toc":1220},[753,756,775,779,782,790,794,802,1063,1073,1077,1080,1124,1136,1163,1169,1173,1179,1194,1198,1217],[11,754,750],{"id":755},"building-otobo-znuny-packages-opm",[15,757,758,759,761,762,767,768,771,772,718],{},"An ",[18,760,24],{}," package is an XML container that bundles Perl code, configuration, database changes, and frontend files. It is built from a ",[27,763,764,766],{},[18,765,457],{}," source manifest"," along with the corresponding files. OTOBO, Znuny, and OTRS Community Edition use the same format. The primary difference is the root element (",[18,769,770],{},"otobo_package"," vs. ",[18,773,774],{},"otrs_package",[32,776,778],{"id":777},"_1-creating-the-directory-structure","1. Creating the Directory Structure",[15,780,781],{},"Create your files in the paths where they should reside on the target system:",[37,783,788],{"className":784,"code":786,"language":787,"meta":42},[785],"language-text","MyPackage\u002F\n├── MyPackage.sopm\n├── Kernel\u002F\n│   └── Config\u002F\n│       └── Files\u002F\n│           └── XML\u002F\n│               └── MyPackage.xml\n└── var\u002F\n    └── httpd\u002F\n        └── htdocs\u002F\n            └── js\u002F\n                └── MyPackage.js\n","text",[18,789,786],{"__ignoreMap":42},[32,791,793],{"id":792},"_2-creating-the-sopm-manifest","2. Creating the .sopm Manifest",[15,795,796,797,801],{},"The manifest declares metadata, compatible frameworks, and the complete file list. Use the ",[443,798,800],{"href":799},"\u002Ftools\u002Fsopm-generator",".sopm Generator"," to generate a valid manifest via a form:",[37,803,805],{"className":608,"code":804,"language":610,"meta":42,"style":42},"\u003C?xml version=\"1.0\" encoding=\"utf-8\" ?>\n\u003Cotobo_package version=\"1.1\">\n    \u003CName>MyPackage\u003C\u002FName>\n    \u003CVersion>1.0.0\u003C\u002FVersion>\n    \u003CFramework>11.0.x\u003C\u002FFramework>\n    \u003CFramework>7.0.x\u003C\u002FFramework>\n    \u003CVendor>Example GmbH\u003C\u002FVendor>\n    \u003CURL>https:\u002F\u002Fexample.com\u002F\u003C\u002FURL>\n    \u003CLicense>GPL-3.0\u003C\u002FLicense>\n    \u003CDescription Lang=\"en\">A short description.\u003C\u002FDescription>\n    \u003CDescription Lang=\"de\">Eine kurze Beschreibung.\u003C\u002FDescription>\n    \u003CFilelist>\n        \u003CFile Permission=\"660\" Location=\"Kernel\u002FConfig\u002FFiles\u002FXML\u002FMyPackage.xml\" \u002F>\n        \u003CFile Permission=\"644\" Location=\"var\u002Fhttpd\u002Fhtdocs\u002Fjs\u002FMyPackage.js\" \u002F>\n    \u003C\u002FFilelist>\n\u003C\u002Fotobo_package>\n",[18,806,807,834,850,865,879,891,903,917,931,945,967,987,996,1023,1045,1054],{"__ignoreMap":42},[46,808,809,812,814,817,820,823,826,828,831],{"class":48,"line":49},[46,810,811],{"class":165},"\u003C?",[46,813,610],{"class":161},[46,815,816],{"class":182}," version",[46,818,819],{"class":165},"=",[46,821,822],{"class":56},"\"1.0\"",[46,824,825],{"class":182}," encoding",[46,827,819],{"class":165},[46,829,830],{"class":56},"\"utf-8\"",[46,832,833],{"class":165}," ?>\n",[46,835,836,838,840,842,844,847],{"class":48,"line":172},[46,837,617],{"class":165},[46,839,770],{"class":161},[46,841,816],{"class":182},[46,843,819],{"class":165},[46,845,846],{"class":56},"\"1.1\"",[46,848,849],{"class":165},">\n",[46,851,852,855,858,861,863],{"class":48,"line":179},[46,853,854],{"class":165},"    \u003C",[46,856,857],{"class":161},"Name",[46,859,860],{"class":165},">MyPackage\u003C\u002F",[46,862,857],{"class":161},[46,864,849],{"class":165},[46,866,867,869,872,875,877],{"class":48,"line":189},[46,868,854],{"class":165},[46,870,871],{"class":161},"Version",[46,873,874],{"class":165},">1.0.0\u003C\u002F",[46,876,871],{"class":161},[46,878,849],{"class":165},[46,880,881,883,885,887,889],{"class":48,"line":197},[46,882,854],{"class":165},[46,884,620],{"class":161},[46,886,623],{"class":165},[46,888,620],{"class":161},[46,890,849],{"class":165},[46,892,893,895,897,899,901],{"class":48,"line":212},[46,894,854],{"class":165},[46,896,620],{"class":161},[46,898,641],{"class":165},[46,900,620],{"class":161},[46,902,849],{"class":165},[46,904,905,907,910,913,915],{"class":48,"line":217},[46,906,854],{"class":165},[46,908,909],{"class":161},"Vendor",[46,911,912],{"class":165},">Example GmbH\u003C\u002F",[46,914,909],{"class":161},[46,916,849],{"class":165},[46,918,919,921,924,927,929],{"class":48,"line":225},[46,920,854],{"class":165},[46,922,923],{"class":161},"URL",[46,925,926],{"class":165},">https:\u002F\u002Fexample.com\u002F\u003C\u002F",[46,928,923],{"class":161},[46,930,849],{"class":165},[46,932,933,935,938,941,943],{"class":48,"line":233},[46,934,854],{"class":165},[46,936,937],{"class":161},"License",[46,939,940],{"class":165},">GPL-3.0\u003C\u002F",[46,942,937],{"class":161},[46,944,849],{"class":165},[46,946,947,949,952,955,957,960,963,965],{"class":48,"line":244},[46,948,854],{"class":165},[46,950,951],{"class":161},"Description",[46,953,954],{"class":182}," Lang",[46,956,819],{"class":165},[46,958,959],{"class":56},"\"en\"",[46,961,962],{"class":165},">A short description.\u003C\u002F",[46,964,951],{"class":161},[46,966,849],{"class":165},[46,968,969,971,973,975,977,980,983,985],{"class":48,"line":255},[46,970,854],{"class":165},[46,972,951],{"class":161},[46,974,954],{"class":182},[46,976,819],{"class":165},[46,978,979],{"class":56},"\"de\"",[46,981,982],{"class":165},">Eine kurze Beschreibung.\u003C\u002F",[46,984,951],{"class":161},[46,986,849],{"class":165},[46,988,989,991,994],{"class":48,"line":263},[46,990,854],{"class":165},[46,992,993],{"class":161},"Filelist",[46,995,849],{"class":165},[46,997,998,1001,1004,1007,1009,1012,1015,1017,1020],{"class":48,"line":277},[46,999,1000],{"class":165},"        \u003C",[46,1002,1003],{"class":161},"File",[46,1005,1006],{"class":182}," Permission",[46,1008,819],{"class":165},[46,1010,1011],{"class":56},"\"660\"",[46,1013,1014],{"class":182}," Location",[46,1016,819],{"class":165},[46,1018,1019],{"class":56},"\"Kernel\u002FConfig\u002FFiles\u002FXML\u002FMyPackage.xml\"",[46,1021,1022],{"class":165}," \u002F>\n",[46,1024,1025,1027,1029,1031,1033,1036,1038,1040,1043],{"class":48,"line":282},[46,1026,1000],{"class":165},[46,1028,1003],{"class":161},[46,1030,1006],{"class":182},[46,1032,819],{"class":165},[46,1034,1035],{"class":56},"\"644\"",[46,1037,1014],{"class":182},[46,1039,819],{"class":165},[46,1041,1042],{"class":56},"\"var\u002Fhttpd\u002Fhtdocs\u002Fjs\u002FMyPackage.js\"",[46,1044,1022],{"class":165},[46,1046,1047,1050,1052],{"class":48,"line":294},[46,1048,1049],{"class":165},"    \u003C\u002F",[46,1051,993],{"class":161},[46,1053,849],{"class":165},[46,1055,1056,1059,1061],{"class":48,"line":305},[46,1057,1058],{"class":165},"\u003C\u002F",[46,1060,770],{"class":161},[46,1062,849],{"class":165},[15,1064,1065,1066,1069,1070,1072],{},"Every file on disk must be listed in the ",[18,1067,1068],{},"\u003CFilelist>"," and vice versa. The ",[443,1071,446],{"href":445}," checks the most important rules directly in your browser.",[32,1074,1076],{"id":1075},"_3-building-the-package","3. Building the Package",[15,1078,1079],{},"With a running OTOBO\u002FZnuny installation:",[37,1081,1083],{"className":39,"code":1082,"language":41,"meta":42,"style":42},"# OTOBO\nbin\u002Fotobo.Console.pl Dev::Package::Build \u002Fpath\u002Fto\u002FMyPackage.sopm \u002Ftarget\u002Fdirectory\u002F\n\n# Znuny \u002F OTRS\nbin\u002Fotrs.Console.pl Dev::Package::Build \u002Fpath\u002Fto\u002FMyPackage.sopm \u002Ftarget\u002Fdirectory\u002F\n",[18,1084,1085,1090,1104,1108,1113],{"__ignoreMap":42},[46,1086,1087],{"class":48,"line":49},[46,1088,1089],{"class":631},"# OTOBO\n",[46,1091,1092,1095,1098,1101],{"class":48,"line":172},[46,1093,1094],{"class":52},"bin\u002Fotobo.Console.pl",[46,1096,1097],{"class":56}," Dev::Package::Build",[46,1099,1100],{"class":56}," \u002Fpath\u002Fto\u002FMyPackage.sopm",[46,1102,1103],{"class":56}," \u002Ftarget\u002Fdirectory\u002F\n",[46,1105,1106],{"class":48,"line":179},[46,1107,176],{"emptyLinePlaceholder":175},[46,1109,1110],{"class":48,"line":189},[46,1111,1112],{"class":631},"# Znuny \u002F OTRS\n",[46,1114,1115,1118,1120,1122],{"class":48,"line":197},[46,1116,1117],{"class":52},"bin\u002Fotrs.Console.pl",[46,1119,1097],{"class":56},[46,1121,1100],{"class":56},[46,1123,1103],{"class":56},[15,1125,1126,1129,1130,1132,1133,1135],{},[27,1127,1128],{},"Without"," an installed ticketing system (e.g., in CI\u002FCD), use ",[18,1131,63],{}," from the ",[18,1134,20],{}," CPAN module:",[37,1137,1139],{"className":39,"code":1138,"language":41,"meta":42,"style":42},"cpanm OPM::Maker\nopmbuild build --output \u002Ftarget\u002Fdirectory\u002F \u002Fpath\u002Fto\u002FMyPackage.sopm\n",[18,1140,1141,1147],{"__ignoreMap":42},[46,1142,1143,1145],{"class":48,"line":49},[46,1144,53],{"class":52},[46,1146,57],{"class":56},[46,1148,1149,1151,1154,1157,1160],{"class":48,"line":172},[46,1150,63],{"class":52},[46,1152,1153],{"class":56}," build",[46,1155,1156],{"class":182}," --output",[46,1158,1159],{"class":56}," \u002Ftarget\u002Fdirectory\u002F",[46,1161,1162],{"class":56}," \u002Fpath\u002Fto\u002FMyPackage.sopm\n",[15,1164,1165,1166,474],{},"Find details in the ",[443,1167,1168],{"href":492},"CI\u002FCD Guide",[32,1170,1172],{"id":1171},"_4-installing-testing","4. Installing & Testing",[15,1174,1175,1176,1178],{},"Install the generated ",[18,1177,24],{}," via the package manager (Admin → Package Manager → Install Package) or via the console:",[37,1180,1182],{"className":39,"code":1181,"language":41,"meta":42,"style":42},"bin\u002Fotobo.Console.pl Admin::Package::Install \u002Ftarget\u002Fdirectory\u002FMyPackage-1.0.0.opm\n",[18,1183,1184],{"__ignoreMap":42},[46,1185,1186,1188,1191],{"class":48,"line":49},[46,1187,1094],{"class":52},[46,1189,1190],{"class":56}," Admin::Package::Install",[46,1192,1193],{"class":56}," \u002Ftarget\u002Fdirectory\u002FMyPackage-1.0.0.opm\n",[32,1195,1197],{"id":1196},"next-steps","Next Steps",[687,1199,1200,1207,1212],{},[690,1201,1202,1206],{},[443,1203,1205],{"href":1204},"\u002Fdocs\u002Fsopm-referenz",".sopm Reference"," — all elements in detail",[690,1208,1209],{},[443,1210,1211],{"href":744},"Does my package run on OTOBO and Znuny?",[690,1213,1214],{},[443,1215,1216],{"href":728},"Publishing a Package on Open ITSM Hub",[476,1218,1219],{},"html pre.shiki code .sn6KH, html code.shiki .sn6KH{--shiki-default:#ABB2BF}html pre.shiki code .sVyAn, html code.shiki .sVyAn{--shiki-default:#E06C75}html pre.shiki code .sVC51, html code.shiki .sVC51{--shiki-default:#D19A66}html pre.shiki code .subq3, html code.shiki .subq3{--shiki-default:#98C379}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sV9Aq, html code.shiki .sV9Aq{--shiki-default:#7F848E;--shiki-default-font-style:italic}html pre.shiki code .sVbv2, html code.shiki .sVbv2{--shiki-default:#61AFEF}",{"title":42,"searchDepth":172,"depth":172,"links":1221},[1222,1223,1224,1225,1226],{"id":777,"depth":172,"text":778},{"id":792,"depth":172,"text":793},{"id":1075,"depth":172,"text":1076},{"id":1171,"depth":172,"text":1172},{"id":1196,"depth":172,"text":1197},"Packages","Step-by-step: From directory structure to the .sopm manifest and the final .opm file for OTOBO, Znuny, and OTRS CE.",{},"\u002Fdocs\u002Fotobo-znuny-paket-bauen",{"title":750,"description":1228},"docs\u002Fotobo-znuny-paket-bauen","9j9dKQ66PVHpwOIck-Mhkv17LVG7trJBEK12eP1H5k8",{"id":1235,"title":1236,"body":1237,"category":1600,"description":1601,"draft":488,"extension":489,"meta":1602,"navigation":175,"order":1603,"path":728,"seo":1604,"stem":1605,"__hash__":1606},"docsEn\u002Fdocs\u002Fpaket-veroeffentlichen.md","Publish a Package on Open ITSM Hub",{"type":8,"value":1238,"toc":1594},[1239,1242,1259,1263,1291,1298,1302,1308,1327,1334,1338,1349,1554,1558,1585,1591],[11,1240,1236],{"id":1241},"publish-a-package-on-open-itsm-hub",[15,1243,1244,1245,1248,1249,1255,1256,474],{},"Open ITSM Hub is an open, versioned directory where every package lives as a JSON file under ",[18,1246,1247],{},"content\u002Fpackages\u002F"," in the ",[443,1250,1254],{"href":1251,"rel":1252},"https:\u002F\u002Fgithub.com\u002FSoftoft-Orga\u002Fopen-itsm-hub",[1253],"nofollow","GitHub repository",". \"Publishing\" simply means adding a JSON file via a pull request. There is ",[27,1257,1258],{},"no registration and no separate backend",[32,1260,1262],{"id":1261},"method-1-directly-from-the-sopm-generator-recommended","Method 1: Directly from the .sopm Generator (Recommended)",[1264,1265,1266,1272,1282,1288],"ol",{},[690,1267,1268,1269,1271],{},"Open the ",[443,1270,800],{"href":799}," and fill out the form.",[690,1273,1274,1275,1278,1279,474],{},"In the ",[27,1276,1277],{},"\"Publish on Open ITSM Hub\""," section, click ",[27,1280,1281],{},"Prepare Pull Request",[690,1283,1284,1285,474],{},"GitHub opens the \"new file\" view with the catalog JSON ",[27,1286,1287],{},"already pre-filled",[690,1289,1290],{},"Commit to a branch and open the pull request — you're done.",[15,1292,1293,1294,1297],{},"The generator automatically takes care of the name, version, vendor, license, and — thanks to compatibility analysis — all matching ",[18,1295,1296],{},"compatibility.systems"," entries.",[32,1299,1301],{"id":1300},"method-2-from-an-existing-sopm-cli","Method 2: From an Existing .sopm (CLI)",[15,1303,1304,1305,1307],{},"If you already have a ",[18,1306,457],{},", convert it using the provided script:",[37,1309,1311],{"className":39,"code":1310,"language":41,"meta":42,"style":42},"python data-scrape\u002Fsopm_to_catalogue.py path\u002Fto\u002FMyPackage.sopm --write\n",[18,1312,1313],{"__ignoreMap":42},[46,1314,1315,1318,1321,1324],{"class":48,"line":49},[46,1316,1317],{"class":52},"python",[46,1319,1320],{"class":56}," data-scrape\u002Fsopm_to_catalogue.py",[46,1322,1323],{"class":56}," path\u002Fto\u002FMyPackage.sopm",[46,1325,1326],{"class":182}," --write\n",[15,1328,1329,1330,1333],{},"This writes ",[18,1331,1332],{},"content\u002Fpackages\u002F\u003Cslug>.json",". Afterward, commit the file and open a pull request.",[32,1335,1337],{"id":1336},"the-catalog-entry","The Catalog Entry",[15,1339,1340,1341,1344,1345,1348],{},"The generated JSON follows the ",[18,1342,1343],{},"packages"," schema (see ",[18,1346,1347],{},"content.config.ts",") and includes, among other things:",[37,1350,1354],{"className":1351,"code":1352,"language":1353,"meta":42,"style":42},"language-json shiki shiki-themes one-dark-pro","{\n  \"basic_info\": { \"title\": \"MyPackage\", \"slug\": \"my-package\", \"summary\": \"...\" },\n  \"provider\": { \"vendor_name\": \"Example GmbH\", \"vendor_type\": \"community\" },\n  \"compatibility\": {\n    \"systems\": [\n      { \"system_id\": \"otobo\", \"system_name\": \"OTOBO\", \"supported_versions\": [\"11.0.x\"] },\n      { \"system_id\": \"znuny\", \"system_name\": \"Znuny\", \"supported_versions\": [\"7.0.x\"] }\n    ]\n  },\n  \"technical_details\": { \"latest_version\": \"1.0.0\", \"package_type\": \".opm\" }\n}\n","json",[18,1355,1356,1361,1400,1427,1435,1443,1479,1511,1516,1521,1549],{"__ignoreMap":42},[46,1357,1358],{"class":48,"line":49},[46,1359,1360],{"class":165},"{\n",[46,1362,1363,1366,1369,1372,1374,1377,1379,1382,1384,1387,1389,1392,1394,1397],{"class":48,"line":172},[46,1364,1365],{"class":161},"  \"basic_info\"",[46,1367,1368],{"class":165},": { ",[46,1370,1371],{"class":161},"\"title\"",[46,1373,166],{"class":165},[46,1375,1376],{"class":56},"\"MyPackage\"",[46,1378,550],{"class":165},[46,1380,1381],{"class":161},"\"slug\"",[46,1383,166],{"class":165},[46,1385,1386],{"class":56},"\"my-package\"",[46,1388,550],{"class":165},[46,1390,1391],{"class":161},"\"summary\"",[46,1393,166],{"class":165},[46,1395,1396],{"class":56},"\"...\"",[46,1398,1399],{"class":165}," },\n",[46,1401,1402,1405,1407,1410,1412,1415,1417,1420,1422,1425],{"class":48,"line":179},[46,1403,1404],{"class":161},"  \"provider\"",[46,1406,1368],{"class":165},[46,1408,1409],{"class":161},"\"vendor_name\"",[46,1411,166],{"class":165},[46,1413,1414],{"class":56},"\"Example GmbH\"",[46,1416,550],{"class":165},[46,1418,1419],{"class":161},"\"vendor_type\"",[46,1421,166],{"class":165},[46,1423,1424],{"class":56},"\"community\"",[46,1426,1399],{"class":165},[46,1428,1429,1432],{"class":48,"line":189},[46,1430,1431],{"class":161},"  \"compatibility\"",[46,1433,1434],{"class":165},": {\n",[46,1436,1437,1440],{"class":48,"line":197},[46,1438,1439],{"class":161},"    \"systems\"",[46,1441,1442],{"class":165},": [\n",[46,1444,1445,1448,1451,1453,1456,1458,1461,1463,1466,1468,1471,1473,1476],{"class":48,"line":212},[46,1446,1447],{"class":165},"      { ",[46,1449,1450],{"class":161},"\"system_id\"",[46,1452,166],{"class":165},[46,1454,1455],{"class":56},"\"otobo\"",[46,1457,550],{"class":165},[46,1459,1460],{"class":161},"\"system_name\"",[46,1462,166],{"class":165},[46,1464,1465],{"class":56},"\"OTOBO\"",[46,1467,550],{"class":165},[46,1469,1470],{"class":161},"\"supported_versions\"",[46,1472,203],{"class":165},[46,1474,1475],{"class":56},"\"11.0.x\"",[46,1477,1478],{"class":165},"] },\n",[46,1480,1481,1483,1485,1487,1490,1492,1494,1496,1499,1501,1503,1505,1508],{"class":48,"line":217},[46,1482,1447],{"class":165},[46,1484,1450],{"class":161},[46,1486,166],{"class":165},[46,1488,1489],{"class":56},"\"znuny\"",[46,1491,550],{"class":165},[46,1493,1460],{"class":161},[46,1495,166],{"class":165},[46,1497,1498],{"class":56},"\"Znuny\"",[46,1500,550],{"class":165},[46,1502,1470],{"class":161},[46,1504,203],{"class":165},[46,1506,1507],{"class":56},"\"7.0.x\"",[46,1509,1510],{"class":165},"] }\n",[46,1512,1513],{"class":48,"line":225},[46,1514,1515],{"class":165},"    ]\n",[46,1517,1518],{"class":48,"line":233},[46,1519,1520],{"class":165},"  },\n",[46,1522,1523,1526,1528,1531,1533,1536,1538,1541,1543,1546],{"class":48,"line":244},[46,1524,1525],{"class":161},"  \"technical_details\"",[46,1527,1368],{"class":165},[46,1529,1530],{"class":161},"\"latest_version\"",[46,1532,166],{"class":165},[46,1534,1535],{"class":56},"\"1.0.0\"",[46,1537,550],{"class":165},[46,1539,1540],{"class":161},"\"package_type\"",[46,1542,166],{"class":165},[46,1544,1545],{"class":56},"\".opm\"",[46,1547,1548],{"class":165}," }\n",[46,1550,1551],{"class":48,"line":255},[46,1552,1553],{"class":165},"}\n",[32,1555,1557],{"id":1556},"why-this-works-well","Why This Works Well",[687,1559,1560,1573,1579],{},[690,1561,1562,1565,1566,550,1569,1572],{},[27,1563,1564],{},"Discoverability"," — Your package appears in fork-specific directories (",[18,1567,1568],{},"\u002Fotobo-plugins",[18,1570,1571],{},"\u002Fznuny-plugins",", etc.) and in search results.",[690,1574,1575,1578],{},[27,1576,1577],{},"Greater Reach"," — Cross-compatible packages are displayed to all matching communities.",[690,1580,1581,1584],{},[27,1582,1583],{},"Transparency"," — Data origins are versioned and fully traceable.",[15,1586,1587,1588,1590],{},"Tip: Use the ",[443,1589,473],{"href":472}," beforehand to see which forks you should declare.",[476,1592,1593],{},"html pre.shiki code .sVbv2, html code.shiki .sVbv2{--shiki-default:#61AFEF}html pre.shiki code .subq3, html code.shiki .subq3{--shiki-default:#98C379}html pre.shiki code .sVC51, html code.shiki .sVC51{--shiki-default:#D19A66}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sn6KH, html code.shiki .sn6KH{--shiki-default:#ABB2BF}html pre.shiki code .sVyAn, html code.shiki .sVyAn{--shiki-default:#E06C75}",{"title":42,"searchDepth":172,"depth":172,"links":1595},[1596,1597,1598,1599],{"id":1261,"depth":172,"text":1262},{"id":1300,"depth":172,"text":1301},{"id":1336,"depth":172,"text":1337},{"id":1556,"depth":172,"text":1557},"Publishing","List your OTOBO or Znuny package for free in the Open ITSM Hub directory via a pre-filled GitHub pull request — no backend login required.",{},50,{"title":1236,"description":1601},"docs\u002Fpaket-veroeffentlichen","AnR_PeiXjrw3twAX2KVdR62AYN2qRfn_nD1TOEU6rPo",{"id":1608,"title":1609,"body":1610,"category":2057,"description":2058,"draft":488,"extension":489,"meta":2059,"navigation":175,"order":2060,"path":2061,"seo":2062,"stem":2063,"__hash__":2064},"docsEn\u002Fdocs\u002Fskin-entwicklung.md","OTOBO\u002FZnuny Skin Development",{"type":8,"value":1611,"toc":2050},[1612,1615,1624,1628,1634,1645,1649,1656,1909,1926,1930,1937,2016,2020,2033,2037,2047],[11,1613,1609],{"id":1614},"otoboznuny-skin-development",[15,1616,1617,1618,1620,1621,474],{},"A skin overrides the default look and feel of the agent or customer interface with custom CSS. Skins are packaged as regular ",[18,1619,24],{}," packages and registered via the ",[27,1622,1623],{},"SysConfig",[32,1625,1627],{"id":1626},"directory-structure","Directory Structure",[37,1629,1632],{"className":1630,"code":1631,"language":787,"meta":42},[785],"var\u002Fhttpd\u002Fhtdocs\u002Fskins\u002FAgent\u002FMySkin\u002Fcss\u002FMySkin.css\nvar\u002Fhttpd\u002Fhtdocs\u002Fskins\u002FCustomer\u002FMySkin\u002Fcss\u002FMySkin.css\n",[18,1633,1631],{"__ignoreMap":42},[15,1635,1636,1637,1640,1641,1644],{},"The directory name (",[18,1638,1639],{},"MySkin",") is the ",[27,1642,1643],{},"internal name"," of the skin.",[32,1646,1648],{"id":1647},"sysconfig-registration","SysConfig Registration",[15,1650,1651,1652,1655],{},"Register the skin in ",[18,1653,1654],{},"Kernel\u002FConfig\u002FFiles\u002FXML\u002FMyPackage.xml",":",[37,1657,1659],{"className":608,"code":1658,"language":610,"meta":42,"style":42},"\u003C?xml version=\"1.0\" encoding=\"utf-8\"?>\n\u003Cotobo_config version=\"2.0\" init=\"Application\">\n    \u003CSetting Name=\"Loader::Agent::Skin###100-MySkin\" Required=\"0\" Valid=\"1\">\n        \u003CDescription Translatable=\"1\">Agent skin provided by the MyPackage package.\u003C\u002FDescription>\n        \u003CNavigation>Frontend::Agent::View\u003C\u002FNavigation>\n        \u003CValue>\n            \u003CHash>\n                \u003CItem Key=\"InternalName\">MySkin\u003C\u002FItem>\n                \u003CItem Key=\"VisibleName\">My Skin\u003C\u002FItem>\n                \u003CItem Key=\"Description\">A custom agent skin.\u003C\u002FItem>\n                \u003CItem Key=\"HomePage\">https:\u002F\u002Fexample.com\u003C\u002FItem>\n            \u003C\u002FHash>\n        \u003C\u002FValue>\n    \u003C\u002FSetting>\n\u003C\u002Fotobo_config>\n",[18,1660,1661,1682,1706,1739,1759,1773,1782,1792,1815,1835,1855,1875,1884,1893,1901],{"__ignoreMap":42},[46,1662,1663,1665,1667,1669,1671,1673,1675,1677,1679],{"class":48,"line":49},[46,1664,811],{"class":165},[46,1666,610],{"class":161},[46,1668,816],{"class":182},[46,1670,819],{"class":165},[46,1672,822],{"class":56},[46,1674,825],{"class":182},[46,1676,819],{"class":165},[46,1678,830],{"class":56},[46,1680,1681],{"class":165},"?>\n",[46,1683,1684,1686,1689,1691,1693,1696,1699,1701,1704],{"class":48,"line":172},[46,1685,617],{"class":165},[46,1687,1688],{"class":161},"otobo_config",[46,1690,816],{"class":182},[46,1692,819],{"class":165},[46,1694,1695],{"class":56},"\"2.0\"",[46,1697,1698],{"class":182}," init",[46,1700,819],{"class":165},[46,1702,1703],{"class":56},"\"Application\"",[46,1705,849],{"class":165},[46,1707,1708,1710,1713,1716,1718,1721,1724,1726,1729,1732,1734,1737],{"class":48,"line":179},[46,1709,854],{"class":165},[46,1711,1712],{"class":161},"Setting",[46,1714,1715],{"class":182}," Name",[46,1717,819],{"class":165},[46,1719,1720],{"class":56},"\"Loader::Agent::Skin###100-MySkin\"",[46,1722,1723],{"class":182}," Required",[46,1725,819],{"class":165},[46,1727,1728],{"class":56},"\"0\"",[46,1730,1731],{"class":182}," Valid",[46,1733,819],{"class":165},[46,1735,1736],{"class":56},"\"1\"",[46,1738,849],{"class":165},[46,1740,1741,1743,1745,1748,1750,1752,1755,1757],{"class":48,"line":189},[46,1742,1000],{"class":165},[46,1744,951],{"class":161},[46,1746,1747],{"class":182}," Translatable",[46,1749,819],{"class":165},[46,1751,1736],{"class":56},[46,1753,1754],{"class":165},">Agent skin provided by the MyPackage package.\u003C\u002F",[46,1756,951],{"class":161},[46,1758,849],{"class":165},[46,1760,1761,1763,1766,1769,1771],{"class":48,"line":197},[46,1762,1000],{"class":165},[46,1764,1765],{"class":161},"Navigation",[46,1767,1768],{"class":165},">Frontend::Agent::View\u003C\u002F",[46,1770,1765],{"class":161},[46,1772,849],{"class":165},[46,1774,1775,1777,1780],{"class":48,"line":212},[46,1776,1000],{"class":165},[46,1778,1779],{"class":161},"Value",[46,1781,849],{"class":165},[46,1783,1784,1787,1790],{"class":48,"line":217},[46,1785,1786],{"class":165},"            \u003C",[46,1788,1789],{"class":161},"Hash",[46,1791,849],{"class":165},[46,1793,1794,1797,1800,1803,1805,1808,1811,1813],{"class":48,"line":225},[46,1795,1796],{"class":165},"                \u003C",[46,1798,1799],{"class":161},"Item",[46,1801,1802],{"class":182}," Key",[46,1804,819],{"class":165},[46,1806,1807],{"class":56},"\"InternalName\"",[46,1809,1810],{"class":165},">MySkin\u003C\u002F",[46,1812,1799],{"class":161},[46,1814,849],{"class":165},[46,1816,1817,1819,1821,1823,1825,1828,1831,1833],{"class":48,"line":233},[46,1818,1796],{"class":165},[46,1820,1799],{"class":161},[46,1822,1802],{"class":182},[46,1824,819],{"class":165},[46,1826,1827],{"class":56},"\"VisibleName\"",[46,1829,1830],{"class":165},">My Skin\u003C\u002F",[46,1832,1799],{"class":161},[46,1834,849],{"class":165},[46,1836,1837,1839,1841,1843,1845,1848,1851,1853],{"class":48,"line":244},[46,1838,1796],{"class":165},[46,1840,1799],{"class":161},[46,1842,1802],{"class":182},[46,1844,819],{"class":165},[46,1846,1847],{"class":56},"\"Description\"",[46,1849,1850],{"class":165},">A custom agent skin.\u003C\u002F",[46,1852,1799],{"class":161},[46,1854,849],{"class":165},[46,1856,1857,1859,1861,1863,1865,1868,1871,1873],{"class":48,"line":255},[46,1858,1796],{"class":165},[46,1860,1799],{"class":161},[46,1862,1802],{"class":182},[46,1864,819],{"class":165},[46,1866,1867],{"class":56},"\"HomePage\"",[46,1869,1870],{"class":165},">https:\u002F\u002Fexample.com\u003C\u002F",[46,1872,1799],{"class":161},[46,1874,849],{"class":165},[46,1876,1877,1880,1882],{"class":48,"line":263},[46,1878,1879],{"class":165},"            \u003C\u002F",[46,1881,1789],{"class":161},[46,1883,849],{"class":165},[46,1885,1886,1889,1891],{"class":48,"line":277},[46,1887,1888],{"class":165},"        \u003C\u002F",[46,1890,1779],{"class":161},[46,1892,849],{"class":165},[46,1894,1895,1897,1899],{"class":48,"line":282},[46,1896,1049],{"class":165},[46,1898,1712],{"class":161},[46,1900,849],{"class":165},[46,1902,1903,1905,1907],{"class":48,"line":294},[46,1904,1058],{"class":165},[46,1906,1688],{"class":161},[46,1908,849],{"class":165},[15,1910,1911,1912,1915,1916,1918,1919,1922,1923,474],{},"For customer skins, use ",[18,1913,1914],{},"Loader::Customer::Skin###..."," with the ",[18,1917,1765],{}," ",[18,1920,1921],{},"Frontend::Customer::View",". For Znuny\u002FOTRS, the root element is ",[18,1924,1925],{},"otrs_config",[32,1927,1929],{"id":1928},"writing-css","Writing CSS",[15,1931,1932,1933,1936],{},"The skin CSS is loaded ",[27,1934,1935],{},"in addition"," to the default skin. You only need to override what you want to change:",[37,1938,1942],{"className":1939,"code":1940,"language":1941,"meta":42,"style":42},"language-css shiki shiki-themes one-dark-pro",":root {\n    --oitsm-skin-accent: #10b981;\n}\n\n#Navigation > li.Selected > a {\n    background-color: var(--oitsm-skin-accent);\n}\n","css",[18,1943,1944,1953,1966,1970,1974,1995,2012],{"__ignoreMap":42},[46,1945,1946,1950],{"class":48,"line":49},[46,1947,1949],{"class":1948},"sjrmR",":root",[46,1951,1952],{"class":165}," {\n",[46,1954,1955,1958,1960,1963],{"class":48,"line":172},[46,1956,1957],{"class":161},"    --oitsm-skin-accent",[46,1959,166],{"class":165},[46,1961,1962],{"class":182},"#10b981",[46,1964,1965],{"class":165},";\n",[46,1967,1968],{"class":48,"line":179},[46,1969,1553],{"class":165},[46,1971,1972],{"class":48,"line":189},[46,1973,176],{"emptyLinePlaceholder":175},[46,1975,1976,1979,1982,1985,1988,1990,1993],{"class":48,"line":197},[46,1977,1978],{"class":52},"#Navigation",[46,1980,1981],{"class":165}," >",[46,1983,1984],{"class":161}," li",[46,1986,1987],{"class":182},".Selected",[46,1989,1981],{"class":165},[46,1991,1992],{"class":161}," a",[46,1994,1952],{"class":165},[46,1996,1997,2000,2003,2006,2009],{"class":48,"line":212},[46,1998,1999],{"class":165},"    background-color: ",[46,2001,2002],{"class":1948},"var",[46,2004,2005],{"class":165},"(",[46,2007,2008],{"class":161},"--oitsm-skin-accent",[46,2010,2011],{"class":165},");\n",[46,2013,2014],{"class":48,"line":217},[46,2015,1553],{"class":165},[32,2017,2019],{"id":2018},"quick-start","Quick Start",[15,2021,668,2022,2026,2027,2029,2030,474],{},[443,2023,2025],{"href":2024},"\u002Ftools\u002Fskin-generator","Skin Generator"," creates the complete structure—",[18,2028,457],{},", SysConfig XML, and CSS—in a single step. Afterward, build the package as described in ",[443,2031,2032],{"href":1230},"Building OTOBO & Znuny Packages",[32,2034,2036],{"id":2035},"activation","Activation",[15,2038,2039,2040,2043,2044,474],{},"After installation, agents can select the skin under ",[27,2041,2042],{},"Personal Preferences → Interface",", or you can set the default via ",[18,2045,2046],{},"Loader::Agent::DefaultSelectedSkin",[476,2048,2049],{},"html pre.shiki code .sn6KH, html code.shiki .sn6KH{--shiki-default:#ABB2BF}html pre.shiki code .sVyAn, html code.shiki .sVyAn{--shiki-default:#E06C75}html pre.shiki code .sVC51, html code.shiki .sVC51{--shiki-default:#D19A66}html pre.shiki code .subq3, html code.shiki .subq3{--shiki-default:#98C379}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sjrmR, html code.shiki .sjrmR{--shiki-default:#56B6C2}html pre.shiki code .sVbv2, html code.shiki .sVbv2{--shiki-default:#61AFEF}",{"title":42,"searchDepth":172,"depth":172,"links":2051},[2052,2053,2054,2055,2056],{"id":1626,"depth":172,"text":1627},{"id":1647,"depth":172,"text":1648},{"id":1928,"depth":172,"text":1929},{"id":2018,"depth":172,"text":2019},{"id":2035,"depth":172,"text":2036},"Skins","Create custom agent and customer skins for OTOBO, Znuny, and OTRS CE: SysConfig loader entries, directory structure, and CSS overrides.",{},30,"\u002Fdocs\u002Fskin-entwicklung",{"title":1609,"description":2058},"docs\u002Fskin-entwicklung","9wcOnr_Dqxn0Z6yofK4ed1UyGDvE4j_lKEx985eEznU",{"id":2066,"title":1205,"body":2067,"category":1227,"description":2657,"draft":488,"extension":489,"meta":2658,"navigation":175,"order":339,"path":1204,"seo":2659,"stem":2660,"__hash__":2661},"docsEn\u002Fdocs\u002Fsopm-referenz.md",{"type":8,"value":2068,"toc":2647},[2069,2072,2080,2084,2126,2129,2133,2229,2235,2238,2275,2285,2290,2297,2358,2362,2410,2425,2429,2602,2628,2632,2644],[11,2070,1205],{"id":2071},"sopm-reference",[15,2073,668,2074,2076,2077,2079],{},[18,2075,457],{}," (Source OPM) is the XML source file of a package. The ",[18,2078,24],{}," file is generated from it during the build process. This reference describes the most common elements.",[32,2081,2083],{"id":2082},"root-element","Root Element",[70,2085,2086,2097],{},[73,2087,2088],{},[76,2089,2090,2092,2094],{},[79,2091,534],{"align":81},[79,2093,2083],{"align":81},[79,2095,2096],{"align":81},"Example",[87,2098,2099,2112],{},[76,2100,2101,2103,2107],{},[92,2102,544],{"align":81},[92,2104,2105],{"align":81},[18,2106,770],{},[92,2108,2109],{"align":81},[18,2110,2111],{},"\u003Cotobo_package version=\"1.1\">",[76,2113,2114,2117,2121],{},[92,2115,2116],{"align":81},"Znuny \u002F OTRS CE",[92,2118,2119],{"align":81},[18,2120,774],{},[92,2122,2123],{"align":81},[18,2124,2125],{},"\u003Cotrs_package version=\"1.0\">",[15,2127,2128],{},"The content is otherwise identical, which is why a package is usually portable across forks.",[32,2130,2132],{"id":2131},"required-elements","Required Elements",[37,2134,2136],{"className":608,"code":2135,"language":610,"meta":42,"style":42},"\u003CName>MyPackage\u003C\u002FName>                 \u003C!-- CamelCase, no spaces -->\n\u003CVersion>1.0.0\u003C\u002FVersion>               \u003C!-- major.minor.patch -->\n\u003CFramework>11.0.x\u003C\u002FFramework>          \u003C!-- at least one, format major.minor.x -->\n\u003CVendor>Example GmbH\u003C\u002FVendor>\n\u003CLicense>GPL-3.0\u003C\u002FLicense>\n\u003CDescription Lang=\"en\">...\u003C\u002FDescription>\n",[18,2137,2138,2154,2170,2186,2198,2210],{"__ignoreMap":42},[46,2139,2140,2142,2144,2146,2148,2151],{"class":48,"line":49},[46,2141,617],{"class":165},[46,2143,857],{"class":161},[46,2145,860],{"class":165},[46,2147,857],{"class":161},[46,2149,2150],{"class":165},">                 ",[46,2152,2153],{"class":631},"\u003C!-- CamelCase, no spaces -->\n",[46,2155,2156,2158,2160,2162,2164,2167],{"class":48,"line":172},[46,2157,617],{"class":165},[46,2159,871],{"class":161},[46,2161,874],{"class":165},[46,2163,871],{"class":161},[46,2165,2166],{"class":165},">               ",[46,2168,2169],{"class":631},"\u003C!-- major.minor.patch -->\n",[46,2171,2172,2174,2176,2178,2180,2183],{"class":48,"line":179},[46,2173,617],{"class":165},[46,2175,620],{"class":161},[46,2177,623],{"class":165},[46,2179,620],{"class":161},[46,2181,2182],{"class":165},">          ",[46,2184,2185],{"class":631},"\u003C!-- at least one, format major.minor.x -->\n",[46,2187,2188,2190,2192,2194,2196],{"class":48,"line":189},[46,2189,617],{"class":165},[46,2191,909],{"class":161},[46,2193,912],{"class":165},[46,2195,909],{"class":161},[46,2197,849],{"class":165},[46,2199,2200,2202,2204,2206,2208],{"class":48,"line":197},[46,2201,617],{"class":165},[46,2203,937],{"class":161},[46,2205,940],{"class":165},[46,2207,937],{"class":161},[46,2209,849],{"class":165},[46,2211,2212,2214,2216,2218,2220,2222,2225,2227],{"class":48,"line":212},[46,2213,617],{"class":165},[46,2215,951],{"class":161},[46,2217,954],{"class":182},[46,2219,819],{"class":165},[46,2221,959],{"class":56},[46,2223,2224],{"class":165},">...\u003C\u002F",[46,2226,951],{"class":161},[46,2228,849],{"class":165},[2230,2231,2233],"h3",{"id":2232},"framework",[18,2234,461],{},[15,2236,2237],{},"Declares the compatible framework version lines. Multiple lines are allowed and act as the key to cross-fork compatibility:",[37,2239,2241],{"className":608,"code":2240,"language":610,"meta":42,"style":42},"\u003CFramework Minimum=\"11.0.9\">11.0.x\u003C\u002FFramework>\n\u003CFramework>7.0.x\u003C\u002FFramework>\n",[18,2242,2243,2263],{"__ignoreMap":42},[46,2244,2245,2247,2249,2252,2254,2257,2259,2261],{"class":48,"line":49},[46,2246,617],{"class":165},[46,2248,620],{"class":161},[46,2250,2251],{"class":182}," Minimum",[46,2253,819],{"class":165},[46,2255,2256],{"class":56},"\"11.0.9\"",[46,2258,623],{"class":165},[46,2260,620],{"class":161},[46,2262,849],{"class":165},[46,2264,2265,2267,2269,2271,2273],{"class":48,"line":172},[46,2266,617],{"class":165},[46,2268,620],{"class":161},[46,2270,641],{"class":165},[46,2272,620],{"class":161},[46,2274,849],{"class":165},[15,2276,2277,2278,2281,2282,474],{},"The optional ",[18,2279,2280],{},"Minimum"," attribute enforces a minimum patch version. Read more in the ",[443,2283,2284],{"href":744},"Compatibility Guide",[32,2286,2288],{"id":2287},"filelist",[18,2289,1068],{},[15,2291,2292,2293,2296],{},"Lists ",[27,2294,2295],{},"all"," files included in the package with their path and Unix permissions:",[37,2298,2300],{"className":608,"code":2299,"language":610,"meta":42,"style":42},"\u003CFilelist>\n    \u003CFile Permission=\"660\" Location=\"Kernel\u002FConfig\u002FFiles\u002FXML\u002FMyPackage.xml\" \u002F>\n    \u003CFile Permission=\"644\" Location=\"var\u002Fhttpd\u002Fhtdocs\u002Fjs\u002FMyPackage.js\" \u002F>\n\u003C\u002FFilelist>\n",[18,2301,2302,2310,2330,2350],{"__ignoreMap":42},[46,2303,2304,2306,2308],{"class":48,"line":49},[46,2305,617],{"class":165},[46,2307,993],{"class":161},[46,2309,849],{"class":165},[46,2311,2312,2314,2316,2318,2320,2322,2324,2326,2328],{"class":48,"line":172},[46,2313,854],{"class":165},[46,2315,1003],{"class":161},[46,2317,1006],{"class":182},[46,2319,819],{"class":165},[46,2321,1011],{"class":56},[46,2323,1014],{"class":182},[46,2325,819],{"class":165},[46,2327,1019],{"class":56},[46,2329,1022],{"class":165},[46,2331,2332,2334,2336,2338,2340,2342,2344,2346,2348],{"class":48,"line":179},[46,2333,854],{"class":165},[46,2335,1003],{"class":161},[46,2337,1006],{"class":182},[46,2339,819],{"class":165},[46,2341,1035],{"class":56},[46,2343,1014],{"class":182},[46,2345,819],{"class":165},[46,2347,1042],{"class":56},[46,2349,1022],{"class":165},[46,2351,2352,2354,2356],{"class":48,"line":189},[46,2353,1058],{"class":165},[46,2355,993],{"class":161},[46,2357,849],{"class":165},[32,2359,2361],{"id":2360},"dependencies","Dependencies",[37,2363,2365],{"className":608,"code":2364,"language":610,"meta":42,"style":42},"\u003CPackageRequired Version=\"11.0.1\">ITSMCore\u003C\u002FPackageRequired>\n\u003CModuleRequired Version=\"3.0\">JSON::XS\u003C\u002FModuleRequired>\n",[18,2366,2367,2389],{"__ignoreMap":42},[46,2368,2369,2371,2374,2377,2379,2382,2385,2387],{"class":48,"line":49},[46,2370,617],{"class":165},[46,2372,2373],{"class":161},"PackageRequired",[46,2375,2376],{"class":182}," Version",[46,2378,819],{"class":165},[46,2380,2381],{"class":56},"\"11.0.1\"",[46,2383,2384],{"class":165},">ITSMCore\u003C\u002F",[46,2386,2373],{"class":161},[46,2388,849],{"class":165},[46,2390,2391,2393,2396,2398,2400,2403,2406,2408],{"class":48,"line":172},[46,2392,617],{"class":165},[46,2394,2395],{"class":161},"ModuleRequired",[46,2397,2376],{"class":182},[46,2399,819],{"class":165},[46,2401,2402],{"class":56},"\"3.0\"",[46,2404,2405],{"class":165},">JSON::XS\u003C\u002F",[46,2407,2395],{"class":161},[46,2409,849],{"class":165},[687,2411,2412,2420],{},[690,2413,2414,2416,2417,2419],{},[18,2415,2373],{}," — another ",[18,2418,24],{}," package must be installed.",[690,2421,2422,2424],{},[18,2423,2395],{}," — a Perl module (CPAN) must be available.",[32,2426,2428],{"id":2427},"install-upgrade-sections","Install \u002F Upgrade Sections",[37,2430,2432],{"className":608,"code":2431,"language":610,"meta":42,"style":42},"\u003CDatabaseInstall Type=\"post\">\n    \u003CTableCreate Name=\"my_table\">\n        \u003CColumn Name=\"id\" Required=\"true\" PrimaryKey=\"true\" AutoIncrement=\"true\" Type=\"INTEGER\" \u002F>\n        \u003CColumn Name=\"name\" Required=\"true\" Size=\"200\" Type=\"VARCHAR\" \u002F>\n    \u003C\u002FTableCreate>\n\u003C\u002FDatabaseInstall>\n\n\u003CCodeInstall Type=\"post\">\u003C![CDATA[\n    $Kernel::OM->Get('Kernel::System::MyModule')->Setup();\n]]>\u003C\u002FCodeInstall>\n",[18,2433,2434,2451,2467,2511,2547,2555,2563,2567,2586,2591],{"__ignoreMap":42},[46,2435,2436,2438,2441,2444,2446,2449],{"class":48,"line":49},[46,2437,617],{"class":165},[46,2439,2440],{"class":161},"DatabaseInstall",[46,2442,2443],{"class":182}," Type",[46,2445,819],{"class":165},[46,2447,2448],{"class":56},"\"post\"",[46,2450,849],{"class":165},[46,2452,2453,2455,2458,2460,2462,2465],{"class":48,"line":172},[46,2454,854],{"class":165},[46,2456,2457],{"class":161},"TableCreate",[46,2459,1715],{"class":182},[46,2461,819],{"class":165},[46,2463,2464],{"class":56},"\"my_table\"",[46,2466,849],{"class":165},[46,2468,2469,2471,2474,2476,2478,2481,2483,2485,2488,2491,2493,2495,2498,2500,2502,2504,2506,2509],{"class":48,"line":179},[46,2470,1000],{"class":165},[46,2472,2473],{"class":161},"Column",[46,2475,1715],{"class":182},[46,2477,819],{"class":165},[46,2479,2480],{"class":56},"\"id\"",[46,2482,1723],{"class":182},[46,2484,819],{"class":165},[46,2486,2487],{"class":56},"\"true\"",[46,2489,2490],{"class":182}," PrimaryKey",[46,2492,819],{"class":165},[46,2494,2487],{"class":56},[46,2496,2497],{"class":182}," AutoIncrement",[46,2499,819],{"class":165},[46,2501,2487],{"class":56},[46,2503,2443],{"class":182},[46,2505,819],{"class":165},[46,2507,2508],{"class":56},"\"INTEGER\"",[46,2510,1022],{"class":165},[46,2512,2513,2515,2517,2519,2521,2524,2526,2528,2530,2533,2535,2538,2540,2542,2545],{"class":48,"line":189},[46,2514,1000],{"class":165},[46,2516,2473],{"class":161},[46,2518,1715],{"class":182},[46,2520,819],{"class":165},[46,2522,2523],{"class":56},"\"name\"",[46,2525,1723],{"class":182},[46,2527,819],{"class":165},[46,2529,2487],{"class":56},[46,2531,2532],{"class":182}," Size",[46,2534,819],{"class":165},[46,2536,2537],{"class":56},"\"200\"",[46,2539,2443],{"class":182},[46,2541,819],{"class":165},[46,2543,2544],{"class":56},"\"VARCHAR\"",[46,2546,1022],{"class":165},[46,2548,2549,2551,2553],{"class":48,"line":197},[46,2550,1049],{"class":165},[46,2552,2457],{"class":161},[46,2554,849],{"class":165},[46,2556,2557,2559,2561],{"class":48,"line":212},[46,2558,1058],{"class":165},[46,2560,2440],{"class":161},[46,2562,849],{"class":165},[46,2564,2565],{"class":48,"line":217},[46,2566,176],{"emptyLinePlaceholder":175},[46,2568,2569,2571,2574,2576,2578,2580,2583],{"class":48,"line":225},[46,2570,617],{"class":165},[46,2572,2573],{"class":161},"CodeInstall",[46,2575,2443],{"class":182},[46,2577,819],{"class":165},[46,2579,2448],{"class":56},[46,2581,2582],{"class":165},">",[46,2584,2585],{"class":56},"\u003C![CDATA[\n",[46,2587,2588],{"class":48,"line":233},[46,2589,2590],{"class":56},"    $Kernel::OM->Get('Kernel::System::MyModule')->Setup();\n",[46,2592,2593,2596,2598,2600],{"class":48,"line":244},[46,2594,2595],{"class":56},"]]>",[46,2597,1058],{"class":165},[46,2599,2573],{"class":161},[46,2601,849],{"class":165},[15,2603,2604,2605,550,2608,550,2611,550,2614,2617,2618,2621,2622,2624,2625,718],{},"Counterparts: ",[18,2606,2607],{},"DatabaseUninstall",[18,2609,2610],{},"CodeUninstall",[18,2612,2613],{},"DatabaseUpgrade",[18,2615,2616],{},"CodeUpgrade",". The ",[18,2619,2620],{},"Type"," controls the timing (",[18,2623,37],{},"\u002F",[18,2626,2627],{},"post",[32,2629,2631],{"id":2630},"tools","Tools",[687,2633,2634,2639],{},[690,2635,2636,2638],{},[443,2637,800],{"href":799}," — create manifests via form",[690,2640,2641,2643],{},[443,2642,446],{"href":445}," — check existing manifests",[476,2645,2646],{},"html pre.shiki code .sn6KH, html code.shiki .sn6KH{--shiki-default:#ABB2BF}html pre.shiki code .sVyAn, html code.shiki .sVyAn{--shiki-default:#E06C75}html pre.shiki code .sV9Aq, html code.shiki .sV9Aq{--shiki-default:#7F848E;--shiki-default-font-style:italic}html pre.shiki code .sVC51, html code.shiki .sVC51{--shiki-default:#D19A66}html pre.shiki code .subq3, html code.shiki .subq3{--shiki-default:#98C379}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":42,"searchDepth":172,"depth":172,"links":2648},[2649,2650,2653,2654,2655,2656],{"id":2082,"depth":172,"text":2083},{"id":2131,"depth":172,"text":2132,"children":2651},[2652],{"id":2232,"depth":179,"text":461},{"id":2287,"depth":172,"text":1068},{"id":2360,"depth":172,"text":2361},{"id":2427,"depth":172,"text":2428},{"id":2630,"depth":172,"text":2631},"Reference of all important .sopm elements for OTOBO, Znuny, and OTRS CE: name, version, framework, filelist, dependencies, and install sections.",{},{"title":1205,"description":2657},"docs\u002Fsopm-referenz","BV6o_lOO7USmbfMJcdN3eZGk4wcP8El0xigFd6zUCHg",1787732987709]