rocket-a


git -C '/home/opc/rocketa.git' show c8c5ba6 -- resources/views/media/site/regist.blade.php

commit c8c5ba61b1fb4c40e219ffbcf4e593c54f7d4ac6
Author: Satoshi Ujihara <satoshi_ujihara@fivegate.jp>
Date:   Thu Dec 18 12:00:15 2025 +0900

    メディア会員登録フロー変更

diff --git a/resources/views/media/site/regist.blade.php b/resources/views/media/site/regist.blade.php
index a973f91..ddedf6b 100644
--- a/resources/views/media/site/regist.blade.php
+++ b/resources/views/media/site/regist.blade.php
@@ -5,7 +5,7 @@
 ページタイトル定義
 ここのタイトルがapp.bladeに読み込まれます。
 --}}
-@section('title', 'パートナー編集')
+@section('title', 'メディア編集')
 
 {{-- コンテンツ内容 .main_col内 --}}
 @section('content')
@@ -60,6 +60,80 @@
                     </div>
                 </div><!-- /.form-group -->
 
+                <div class="form-group row m-0 border-bottom">
+                    <div class="col-sm-2 px-0 bg-gray d-flex align-items-center">
+                        {{ Form::label('',__('site-regist.click_url_custom_params'), ['class'=>'px-2 col-form-label2'], false) }}
+                    </div>
+
+                    <div class="col-sm-10 px-0 d-flex align-items-center">
+                        <div class="p-2 w-100">
+                            {{ Form::text('custom_param', $media_data->custom_param, ['id'=>'enumInput','class'=>'form-control', 'autocomplete'=>'off', 'placeholder'=>__('site-regist.enter_custom_params')]) }}
+
+                            @if($errors->has('custom_param'))
+                                <div class="err_msg mt-2">{{ $errors->first('custom_param') }}</div>
+                            @endif
+                        </div>
+                    </div>
+                </div><!-- /.form-group -->
+
+                <div class="form-group row m-0 border-bottom">
+                    <div class="col-sm-2 px-0 bg-gray d-flex align-items-center">
+                        {{ Form::label('',__('site-regist.performance_return_api').'<span class="required">'.__('site-regist.required').'</span>', ['class'=>'px-2 col-form-label'], false) }}
+                    </div>
+
+                    <div class="col-sm-10 px-0 d-flex align-items-center">
+                        <div class="p-2 w-100">
+                            {{ Form::url('api_url', $media_data->api_url, ['id'=>'api_url','class'=>'form-control url-input', 'autocomplete'=>'off', 'placeholder'=>__('site-regist.please_enter_performance_return_api_url')]) }}
+@if(__('common._')=="ja")
+<a href="https://drive.google.com/drive/u/0/folders/1LTBxGPg0kY2e8Mo9PgOyGVSpBL5ORtI1" target="_blank">help</a>
+@elseif(__('common._')=="kr")
+<a href="https://drive.google.com/drive/u/0/folders/1V8Np7zKouRBb5FP9mG1U0Hqw2qm5iI5L" target="_blank">help</a>
+@elseif(__('common._')=="en")
+<a href="https://drive.google.com/drive/u/0/folders/19rPKVo-9Ou0Mm1gFFjvgJ_8tHn7RXcWL" target="_blank">help</a>
+@endif
+                            @if($errors->has('api_url'))
+                                <div class="err_msg mt-2">{{ $errors->first('api_url') }}</div>
+                            @endif
+                        </div>
+                    </div>
+                </div><!-- /.form-group -->
+
+                <div class="form-group row m-0 border-bottom">
+                    <div class="col-sm-2 px-0 bg-gray d-flex align-items-center">
+                        {{ Form::label('',__('site-regist.performance_return_api')." (TEST)", ['class'=>'px-2 col-form-label'], false) }}
+                    </div>
+
+                    <div class="col-sm-10 px-0 d-flex align-items-center">
+                        <div class="p-2 w-100">
+                            <input type="button" id="copy_url_button" value="↓copy" />
+                            {{ Form::url('api_url_test', $media_data->api_url_test, ['id'=>'api_url_test','class'=>'form-control  url-input',  'autocomplete'=>'off', 'placeholder'=>__('site-regist.please_enter_performance_return_api_url')]) }}
+
+                            @if($errors->has('api_url_test'))
+                                <div class="err_msg mt-2">{{ $errors->first('api_url_test') }}</div>
+                            @endif
+                        </div>
+                    </div>
+                </div><!-- /.form-group -->
+
+
+                <div class="form-group row m-0 border-bottom">
+                    <div class="col-sm-2 px-0 bg-gray d-flex align-items-center">
+                        {{ Form::label('','status code'.'<span class="required">'.__('site-regist.required').'</span>', ['class'=>'px-2 col-form-label'], false) }}
+                    </div>
+
+                    <div class="col-sm-10 px-0 d-flex align-items-center">
+                        <div class="p-2 w-100">
+                            <label class="w-20">{{__('site-regist.pending')}}</label>{{ Form::text('status_0', $media_data->status_0 ? $media_data->status_0:"0", ['class'=>'form-control w-80  d-inline-block ']) }}
+                            <label class="w-20">{{__('site-regist.approved')}}</label>{{ Form::text('status_1', $media_data->status_1 ? $media_data->status_1:"1", ['class'=>'form-control w-80  d-inline-block ']) }}
+                            <label class="w-20">{{__('site-regist.rejected')}}</label>{{ Form::text('status_2', $media_data->status_2 ? $media_data->status_2:"2", ['class'=>'form-control w-80  d-inline-block ']) }}
+
+                            @if($errors->has('api_url_test'))
+                                <div class="err_msg mt-2">{{ $errors->first('api_url_test') }}</div>
+                            @endif
+                        </div>
+                    </div>
+                </div><!-- /.form-group -->
+
                 <div class="form-group row m-0 border-bottom">
                     <div class="col-sm-2 px-0 bg-gray d-flex align-items-center">
                         {{ Form::label('',__('site-regist.partner_category'), ['class'=>'px-2 col-form-label'], false) }}
@@ -169,6 +243,57 @@
                     </div>
                 </div><!-- /.form-group -->
 
+                <div class="form-group row m-0 border-bottom">
+                    <div class="col-sm-2 px-0 bg-gray d-flex align-items-center">
+                        <div class="px-2 col-form-label">{!!__('site-regist.click_url_custom_params')!!}</div>
+                    </div>
+
+                    <div class="col-sm-10 px-0 d-flex align-items-center">
+                        <div class="px-2 py-3 w-100">
+                           {{ $datas['custom_param'] }}
+                        </div>
+                    </div>
+                </div><!-- /.form-group -->
+
+                <div class="form-group row m-0 border-bottom">
+                    <div class="col-sm-2 px-0 bg-gray d-flex align-items-center">
+                        <div class="px-2 col-form-label">{{__('site-regist.performance_return_api')}}<span class="required">{{__('site-regist.required')}}</span></div>
+                    </div>
+
+                    <div class="col-sm-10 px-0 d-flex align-items-center">
+                        <div class="px-2 py-3 w-100">
+                           {{ $datas['api_url'] }}
+                        </div>
+                    </div>
+                </div><!-- /.form-group -->
+
+                <div class="form-group row m-0 border-bottom">
+                    <div class="col-sm-2 px-0 bg-gray d-flex align-items-center">
+                        <div class="px-2 col-form-label">{{__('site-regist.performance_return_api')}} (TEST)</div>
+                    </div>
+
+                    <div class="col-sm-10 px-0 d-flex align-items-center">
+                        <div class="px-2 py-3 w-100">
+                           {{ $datas['api_url_test'] }}
+                        </div>
+                    </div>
+                </div><!-- /.form-group -->
+
+                <div class="form-group row m-0 border-bottom">
+                    <div class="col-sm-2 px-0 bg-gray d-flex align-items-center">
+                        <div class="px-2 col-form-label">status code</div>
+                    </div>
+
+                    <div class="col-sm-10 px-0 d-flex align-items-center">
+                        <div class="px-2 py-3 w-100">
+                            {{__('site-regist.pending')}}:{{ $datas['status_0'] }}
+                            {{__('site-regist.approved')}}:{{ $datas['status_1'] }}
+                            {{__('site-regist.rejected')}}:{{ $datas['status_2'] }}
+                        </div>
+                    </div>
+                </div><!-- /.form-group -->
+
+
                 <div class="form-group row m-0 border-bottom">
                     <div class="col-sm-2 px-0 bg-gray d-flex align-items-center">
                         <div class="px-2 col-form-label">{{__('site-detail.partner_category')}}</div>
@@ -208,7 +333,7 @@
 
                     <div class="col-sm-4 px-0 d-flex align-items-center">
                         <div class="px-2 py-3 w-100">
-                            {{ $media_monthly_uu[$datas['monthly_uu']] }}
+                            {{ __($media_monthly_uu[$datas['monthly_uu']]) }}
                         </div>
                     </div>
                 </div><!-- /.form-group -->
@@ -247,4 +372,409 @@
             {{ Form::hidden('action', 'regist') }}
         {{ Form::close() }}
     @endif
+
+<!-- 共通モーダル -->
+<div class="modal fade" id="urlBuilderModal" tabindex="-1" aria-labelledby="urlBuilderModalLabel" aria-hidden="true">
+  <div class="modal-dialog modal-lg">
+    <div class="modal-content">
+      <div class="modal-header">
+        <h5 class="modal-title" id="urlBuilderModalLabel">{{__('site-regist.url_builder')}}</h5>
+        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="{{__('site-regist.close')}}"></button>
+      </div>
+      <div class="modal-body">
+        <form id="urlBuilderForm" class="row g-2">
+          <div class="col-12">
+            <label class="form-label">{{__('site-regist.domain_example')}}</label>
+            <input type="text" id="ubDomain" class="form-control" placeholder="abr.ge">
+          </div>
+          <div class="col-12">
+            <label class="form-label">{{__('site-regist.path_note')}}</label>
+            <input type="text" id="ubPath" class="form-control" placeholder="/@appname/rocket_a">
+          </div>
+
+          <div class="col-12 mt-3">
+            <label class="form-label">{{__('site-regist.query_parameters')}}</label>
+            <div id="kvContainer" class="mb-2">
+              <!-- key/value 行がここに挿入される -->
+            </div>
+            <button type="button" id="addKvBtn" class="btn btn-sm btn-outline-primary">+ {{__('site-regist.add_parameter')}}</button>
+          </div>
+
+          <div class="col-12">
+            <small class="text-muted">※{{__('site-regist.empty_keys_ignored')}}</small>
+          </div>
+        </form>
+      </div>
+
+      <div class="modal-footer">
+        <button type="button" id="ubCancel" class="btn btn-secondary" data-bs-dismiss="modal">{{__('site-regist.cancel')}}</button>
+        <button type="button" id="ubApply" class="btn btn-primary">{{__('site-regist.confirm')}}</button>
+      </div>
+    </div>
+  </div>
+</div>
+
+<!-- テンプレート(非表示) -->
+<template id="kvRowTemplate">
+  <div class="input-group mb-2 kv-row">
+    <input type="text" class="form-control kv-key" placeholder="key">
+    <select  class="form-control kv-value" placeholder="{{__('site-regist.please_select')}}">
+    </select>
+    <button type="button" class="btn btn-outline-danger remove-kv-btn" title="{{__('site-regist.delete')}}">✕</button>
+  </div>
+</template>
+
+
+
+  <!-- モーダル -->
+  <div class="modal fade" id="enumModal" tabindex="-1" aria-hidden="true">
+    <div class="modal-dialog modal-dialog-centered modal-lg">
+      <div class="modal-content">
+        <div class="modal-header">
+          <h5 class="modal-title">{{__('site-regist.register_custom_params')}}</h5>
+          <button type="button" class="btn-close" data-bs-dismiss="modal"></button>
+        </div>
+        <div class="modal-body">
+            <div id="assume_url">
+                <u>{{__('site-regist.custom_params_description')}}</u><br />
+                <b>htts://api.rocket-a.com/click_url?xxx=yyy<font color="red" id="enumPreview"></font></b>
+            </div>
+          <div id="enumList">
+            <div class="input-group mb-2 enum-item">
+              <input type="text" class="form-control enum-value" placeholder="{{__('site-regist.enter_value')}}">
+              <button class="btn btn-outline-danger remove-btn">−</button>
+            </div>
+          </div>
+          <button id="addEnum" class="btn btn-outline-primary w-100">+ {{__('site-regist.add_row')}}</button>
+        </div>
+        <div class="modal-footer">
+          <button class="btn btn-secondary" data-bs-dismiss="modal">{{__('site-regist.cancel')}}</button>
+          <button id="saveEnum" class="btn btn-primary">{{__('site-regist.confirm')}}</button>
+        </div>
+      </div>
+    </div>
+  </div>
+
+@endsection
+
+@section('respectively_js')
+<script>
+$('#copy_url_button').on('click', function() {
+    var value = $('#api_url').val();
+    $('#api_url_test').val(value);
+});
+//////////////////////////
+//トラッキングURL設定 start
+//////////////////////////
+$(function() {
+  // Bootstrap Modal インスタンスを生成(要素は DOM に存在する前提)
+  var urlModalEl = document.getElementById('urlBuilderModal');
+  var urlModal = new bootstrap.Modal(urlModalEl, { backdrop: 'static', keyboard: false });
+
+  var $currentInput = null; // モーダル操作対象の input 要素
+
+  // --- ヘルパー: KV 行を追加 ---
+function addKvRow(key, value) {
+    const tpl = document.getElementById('kvRowTemplate').content.cloneNode(true);
+    const $row = $(tpl).find('.kv-row');
+
+    const $select = $row.find('.kv-value');
+    $select.empty();
+
+    // enumInputItems1 を追加
+    const enumInputItems1 = 'status,sid,ad_id,client_id,media_id,media_uid,reward,date,stage,product_code,amount,count,device_uuid'
+        .split(',').map(s => s.trim()).filter(s => s !== '');
+    enumInputItems1.forEach(v => {
+        $select.append($('<option>', {value: '{'+v+'}', text: '{'+v+'}'}));
+    });
+
+    // enumInputItems2 を追加
+    const enumInputText = $('#enumInput').val() || '';
+    const enumInputItems2 = enumInputText.split(',').map(s => s.trim()).filter(s => s !== '');
+    enumInputItems2.forEach(v => {
+        $select.append($('<option>', {value: '{custom.'+v+'}', text: '{custom.'+v+'}   ({{__('site-regist.custom_parameters')}})'}));
+    });
+
+    // key をセット
+    $row.find('.kv-key').val(key || '');
+
+    // value を選択
+    if (value) {
+        $select.val(value.includes('{') ? value : '{'+value+'}').trigger('change');
+    }
+
+    $('#kvContainer').append($row);
+}
+
+  // --- 初期で1行用意 ---
+  function ensureAtLeastOneRow() {
+    if ($('#kvContainer').children().length === 0) addKvRow();
+  }
+
+    // 行削除
+  $(document).on('click', '.remove-kv-btn', function () {
+    $(this).closest('.kv-row').remove();
+  });
+
+  // + ボタン
+  $('#addKvBtn').on('click', function() {
+    addKvRow();
+  });
+
+  // input 選択(フォーカス/クリック)でモーダルを開く
+  // 複数あっても対応できるよう class .url-input を使う
+  $(document).on('focus', '.url-input', function() {
+    $currentInput = $(this);
+    openModalWithInputValue($currentInput.val());
+  });
+
+  // 既存値を解析してモーダルにプリセットする
+  function openModalWithInputValue(val) {
+    // クリア
+    $('#ubDomain').val('');
+    $('#ubPath').val('');
+    $('#kvContainer').empty();
+
+    if (val && $.trim(val) !== '') {
+      // URL パース(protocol が無ければ https を仮置き)
+      var tryUrl = val;
+      if (!/^[a-zA-Z][a-zA-Z0-9+.-]*:\/\//.test(tryUrl)) {
+        tryUrl = 'https://' + tryUrl;
+      }
+      try {
+        var parsed = new URL(tryUrl);
+        // host は host (ホスト名:ポート) ではなく hostname が望ましい
+        $('#ubDomain').val(parsed.hostname + (parsed.port ? (':' + parsed.port) : ''));
+        // pathname は先頭スラッシュあり
+        $('#ubPath').val(parsed.pathname === '/' ? '' : parsed.pathname);
+        // query params
+        parsed.searchParams.forEach(function(value, key) {
+            // {} で囲まれているかチェック
+            if (/^\{.*\}$/.test(value)) {
+                addKvRow(key, value);
+            } else {
+                // {} で囲まれていない場合は ubPath に ?key=value として追加
+                var currentPath = $('#ubPath').val();
+                var separator = currentPath.includes('?') ? '&' : '?';
+                $('#ubPath').val(currentPath + separator + encodeURIComponent(key) + '=' + encodeURIComponent(value));
+            }
+        });
+      } catch (e) {
+        // URL でない場合(例: "example.com/path" でパースできないなど)は簡易分解
+        // domain と path をスラッシュで分ける
+        var m = val.match(/^([^\/]+)(\/.*)?$/);
+        if (m) {
+          $('#ubDomain').val(m[1]);
+          $('#ubPath').val(m[2] || '');
+        }
+        // query があればパースする(? が含まれている場合)
+        var qIndex = val.indexOf('?');
+        if (qIndex !== -1) {
+            var qs = val.substring(qIndex + 1);
+            var pairs = qs.split('&');
+            pairs.forEach(function(p) {
+                if (!p) return;
+                var kv = p.split('=');
+                var k = decodeURIComponent(kv[0] || '');
+                var v = decodeURIComponent(kv.slice(1).join('=') || '');
+
+                if (/^\{.*\}$/.test(v)) {
+                    addKvRow(k, v);
+                } else {
+                    var currentPath = $('#ubPath').val();
+                    var separator = currentPath.includes('?') ? '&' : '?';
+                    $('#ubPath').val(currentPath + separator + encodeURIComponent(k) + '=' + encodeURIComponent(v));
+                }
+            });
+        }
+      }
+    }
+    ensureAtLeastOneRow();
+    // モーダル表示
+    urlModal.show();
+/*
+    const $select = $('.kv-value');
+    $select.empty();
+    //rocket-aパラメータをselect optionに追加
+    const enumInputItems1 = 'status,sid,ad_id,client_id,media_id,media_uid,reward,date,stage,product_code,amount,count,device_uuid'.split(',').map(s => s.trim()).filter(s => s !== '');
+    enumInputItems1.forEach(value => {
+        $select.append($('<option>', {value: '{'+value+'}',text: '{'+value+'}'}));
+    });    
+    const enumInputText = $('#enumInput').val();
+    const enumInputItems2 = enumInputText.split(',').map(s => s.trim()).filter(s => s !== '');
+    enumInputItems2.forEach(value => {
+        $select.append($('<option>', {value: '{'+value+'}',text: '{'+value+'}   ({{__('site-regist.custom_parameters')}})'}));
+    });
+*/
+  }
+
+  // 決定ボタンの動作: 入力値を URL に組み立てて input に反映
+  $('#ubApply').on('click', function() {
+    var domain = $.trim($('#ubDomain').val() || '');
+    var path = $.trim($('#ubPath').val() || '');
+    // path は先頭に / をつける(空なら空)
+    if (path && path[0] !== '/') path = '/' + path;
+
+    if (!domain) {
+      alert('{{__('site-regist.enter_domain_example')}}');
+      return;
+    }
+
+    // query を収集
+    var params = [];
+    $('#kvContainer .kv-row').each(function() {
+    var k = $.trim($(this).find('.kv-key').val() || '');
+    var v = $(this).find('.kv-value').val() || '';
+    if (k === '') return; // 空キーは無視
+    // encodeURIComponent で値を安全にエンコード
+    params.push(encodeURIComponent(k) + '=' + v);
+    });
+
+    var query = '';
+    if (params.length) {
+    // ubPath に ? が含まれているかチェック
+    var separator = path.includes('?') ? '&' : '?';
+    query = separator + params.join('&');
+    }
+
+    // デフォルトスキームは https
+    var finalUrl = 'https://' + domain + (path || '') + query;
+
+    // 元のスキームを維持する場合
+    var original = $currentInput && $currentInput.val();
+    if (original && /^[a-zA-Z][a-zA-Z0-9+.-]*:\/\//.test(original)) {
+    try {
+        var origParsed = new URL(original);
+        finalUrl = origParsed.protocol + '//' + domain + (path || '') + query;
+    } catch (e) {}
+    }
+
+    // 入力に反映
+    if ($currentInput) {
+    $currentInput.val(finalUrl).trigger('change');
+    }
+
+    // モーダル閉じる
+    urlModal.hide();
+  });
+
+  // モーダルが閉じられたら currentInput をクリア(必要なら)
+  urlModalEl.addEventListener('hidden.bs.modal', function () {
+    $currentInput = null;
+  });
+
+  // 初期状態で KV を1行確保(モーダル毎に表示時に ensureAtLeastOneRow が呼ばれるため冗長ではない)
+  ensureAtLeastOneRow();
+
+$(document).on('input change', '.kv-key', function() {
+    const val = $(this).val();
+    const regex = /^[0-9A-Za-z_]*$/; // 半角英数+_ のみ許可
+
+    if (!regex.test(val)) {
+        alert('❌ {{__('site-regist.only_alphanumeric_and_underscore_allowed')}}');
+        // 入力を直前の正しい値に戻す
+        $(this).val(val.replace(/[^0-9A-Za-z_]/g, ''));
+    }
+});
+
+});
+//////////////////////////
+//トラッキングURL設定 end
+//////////////////////////
+
+//////////////////////////
+//独自パラメータ設定 start
+//////////////////////////
+    $(function () {
+        const updatePreview = () => {
+        const values = $('.enum-value').map(function () {
+            return $(this).val().trim();
+        }).get().filter(v => v);
+
+        // 値を &key={key} の形式に変換して結合
+        const joined = values.map(v => `&${v}={${v}}`).join('');
+
+        $('#enumPreview').text(joined || '');
+        };
+
+      // input選択でモーダル表示
+      $('#enumInput').on('focus', function () {
+        const currentValues = $(this).val().split(',').map(v => v.trim()).filter(v => v);
+        const $list = $('#enumList');
+        $list.empty();
+
+        // 既存値を反映
+        if (currentValues.length) {
+          currentValues.forEach(v => {
+            $list.append(`<div class="input-group mb-2 enum-item">
+              <input type="text" class="form-control enum-value" value="${v}">
+              <button class="btn btn-outline-danger remove-btn">−</button>
+            </div>`);
+          });
+        } else {
+          $list.append(`<div class="input-group mb-2 enum-item">
+            <input type="text" class="form-control enum-value" placeholder="{{__('site-regist.enter_value')}}">
+            <button class="btn btn-outline-danger remove-btn">−</button>
+          </div>`);
+        }
+        updatePreview();
+        $('#enumModal').modal('show');
+      });
+    $(document).on('input change', '.enum-value', function() {
+        const val = $(this).val();
+        const regex = /^[0-9A-Za-z_]*$/; // 半角英数+_ のみ許可
+
+        if (!regex.test(val)) {
+            alert('❌ {{__('site-regist.only_alphanumeric_and_underscore_allowed')}}');
+            // 入力を直前の正しい値に戻す
+            $(this).val(val.replace(/[^0-9A-Za-z_]/g, ''));
+        }
+    });
+
+      $(document).on('input change', '.enum-value', updatePreview);
+
+      // 行追加
+      $('#addEnum').on('click', function () {
+        const count = $('.enum-value').length;
+        if (count >= 4) {
+            alert('{{__('site-regist.cannot_add_more_items_max_4',['cnt'=>4])}}');
+            return;
+        }
+
+        $('#enumList').append(`<div class="input-group mb-2 enum-item">
+          <input type="text" class="form-control enum-value" placeholder="{{__('site-regist.enter_value')}}">
+          <button class="btn btn-outline-danger remove-btn">−</button>
+        </div>`);
+        updatePreview();
+      });
+
+      // 行削除
+      $(document).on('click', '.remove-btn', function () {
+        $(this).closest('.enum-item').remove();
+      });
+
+      // 決定ボタン
+      $('#saveEnum').on('click', function () {
+        const values = $('.enum-value').map(function () {
+          return $(this).val().trim();
+        }).get().filter(v => v);
+        
+        const output = [];
+        values.forEach((value, index) => {
+            if(value=="ad_id" || value=="client_id" || value=="banner_id" || value=="media_uid" || value=="media_id") {
+                alert('{{__('site-regist.invalid_parameter_name')}}:\nad_id\nclient_id\nbanner_id\nmedia_id\nmedia_uid');
+            } else {
+                output.push(value);
+            }
+        });
+
+        $('#enumInput').val(output.join(','));
+        $('#enumModal').modal('hide');
+        $('.url-input').val('');
+      });
+    });
+//////////////////////////
+//独自パラメータ設定 end
+//////////////////////////
+</script>
 @endsection

diff.txt · 最終更新: by root