viplinktextmediapush.js 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608
  1. define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'template', 'gridify', 'custommain'], function ($, undefined, Backend, Table, Form, Template, Gridify, Custommain) {
  2. var Controller = {
  3. index: function () {
  4. // 初始化表格参数配置
  5. Table.api.init({
  6. extend: {
  7. index_url: 'vipcustom/viplinktextmediapush/index?status=' + Config.status,
  8. },
  9. searchFormVisible: true,
  10. search:false
  11. });
  12. var table = $("#table");
  13. // 初始化表格
  14. table.bootstrapTable({
  15. url: $.fn.bootstrapTable.defaults.extend.index_url,
  16. pk: 'id',
  17. sortName: 'id',
  18. clickToSelect:false,
  19. pageSize: 12, //每页的记录行数(*)
  20. pageList: [12, 36, 72, 120], //可供选择的每页的行数(*)
  21. columns: [Controller.api.showFilterColumns(table)],
  22. onLoadSuccess: function () { //加载成功时执行
  23. },
  24. onPostBody:function(){
  25. $('#table td').attr('rowspan', '1000');
  26. var ooptions = {
  27. srcNode: 'tr', // grid items (class, node)
  28. margin: '0', // margin in pixel, default: 0px
  29. width: '296px', // grid item width in pixel, default: 220px
  30. max_width: '', // dynamic gird item width if specified, (pixel)
  31. resizable: true, // re-layout if window resize
  32. transition: 'all 0.5s ease' // support transition for CSS3, default: all 0.5s ease
  33. }
  34. $('#table').gridify(ooptions);
  35. }
  36. });
  37. // 为表格绑定事件
  38. Table.api.bindevent(table);
  39. //tooltip
  40. $(document).on('mouseover', '#table td', function () {
  41. $('.wxb-card-list-scroll .anticon').tooltip();
  42. $('[rel="popover"]').popover({
  43. trigger: 'manual',
  44. placement: 'top',
  45. html: true,
  46. content: function () {
  47. var ids = $(this).data('rowid');
  48. /*jshint multistr: true*/
  49. return '<div class="msg_popover_but_box">\
  50. <a href="javascript:;" class="btn-multi-ajax" data-href="/admin/vipcustom/viplinktextmedia/multiSendMessage?table=media&ids=' + ids + '&message_type=0">群发服务号</a>\
  51. <a href="javascript:;" class="btn-multi-ajax" data-href="/admin/vipcustom/viplinktextmedia/multiSendMessage?table=media&ids=' + ids + '&message_type=1">群发订阅号</a>\
  52. </div>';
  53. }
  54. }).on("mouseenter", function () {
  55. var _this = this;
  56. $(this).popover("show");
  57. $(this).siblings(".popover").on("mouseleave", function () {
  58. $(_this).popover('hide');
  59. });
  60. }).on("mouseleave", function () {
  61. var _this = this;
  62. setTimeout(function () {
  63. if (!$(".popover:hover").length) {
  64. $(_this).popover("hide")
  65. }
  66. }, 100);
  67. })
  68. });
  69. //删除文字链消息列表单列
  70. $(document).on('click', '.anticon-delete', function () {
  71. var $this = $(this);
  72. var oLi = $this.parents('li');
  73. var nIndex = $this.parents('li').index();
  74. var sid = $this.data('id');
  75. layer.confirm("确定删除此项?", {
  76. icon: 3,
  77. title: "温馨提示",
  78. shadeClose: true
  79. }, function (index) {
  80. $.get($.fn.bootstrapTable.defaults.extend.del_url, {"ids":sid, "idx":nIndex}, function (data) {
  81. if (data.code) {
  82. var msg = data.msg != '' ? data.msg : '操作成功';
  83. Toastr.success(msg);
  84. table.bootstrapTable('refresh');
  85. } else {
  86. var msg = data.msg != '' ? data.msg : '操作失败';
  87. Toastr.error(msg);
  88. }
  89. layer.close(index);
  90. });
  91. }, function () {
  92. layer.close();
  93. });
  94. });
  95. //删除文字链消息列表整列
  96. $(document).on('click', '.btn-del-ajax', function () {
  97. if(!Custommain.check_waiting_send_editable($(this).attr('data_send_time'))){
  98. Toastr.error("发送前10分钟不可操作");
  99. return;
  100. }
  101. var del_url = $(this).attr('data-href');
  102. layer.confirm("确定删除此项?", {
  103. icon: 3,
  104. title: "温馨提示",
  105. shadeClose: true
  106. }, function (index) {
  107. layer.close(index);
  108. $.get(del_url, {}, function (data) {
  109. if (data.code) {
  110. var msg = data.msg != '' ? data.msg : '操作成功';
  111. Toastr.success(msg);
  112. table.bootstrapTable('refresh');
  113. } else {
  114. var msg = data.msg != '' ? data.msg : '操作失败';
  115. Toastr.error(msg);
  116. }
  117. });
  118. }, function () {
  119. layer.close();
  120. });
  121. });
  122. // 打开详情页面
  123. $(document).on('click', '.btn-view-ajax', function () {
  124. Fast.api.open($(this).attr('data-href'), '查看详情', {});
  125. });
  126. // 打开详情页面
  127. $(document).on('click', '.btn-editwaitmsg-ajax', function () {
  128. if(!Custommain.check_waiting_send_editable($(this).attr('data_send_time'))){
  129. Toastr.error("发送前10分钟不可操作");
  130. return;
  131. }
  132. Fast.api.open($(this).attr('data-href'), '编辑', {});
  133. });
  134. //群发消息
  135. $(document).on('click', '.btn-multi-ajax', function () {
  136. var multi_url = $(this).attr('data-href');
  137. $.get(multi_url, {}, function (data) {
  138. if (data.code) {
  139. var msg = data.msg != '' ? data.msg : '操作成功';
  140. Toastr.success(msg);
  141. } else {
  142. var msg = data.msg != '' ? data.msg : '操作失败';
  143. Toastr.error(msg);
  144. }
  145. });
  146. });
  147. //修改图文内容
  148. $(document).on('click','.anticon-novel-edit',function(){
  149. var $this=$(this);
  150. var nIndex = $this.parents('li').index();
  151. var sid = $this.data('id');
  152. $.ajax({
  153. type:'get',
  154. url:'vipcustom/viplinktextmedia/getMediaMessage?ids='+ sid + '&idx='+ nIndex,
  155. success:function(data){
  156. if(!data.code){
  157. Fast.api.open('custom/editlinktext?json=' + encodeURIComponent(data.data), '修改内容', {
  158. callback: function (data) {
  159. var data = data;
  160. $.ajax({
  161. type:'get',
  162. url:'vipcustom/viplinktextmedia/editLink?idx='+ nIndex +'&ids='+ sid + '&message_json=' + encodeURIComponent(JSON.stringify(data)),
  163. success:function(data){
  164. if(data.code == 0){
  165. Toastr.success('编辑成功');
  166. }else{
  167. Toastr.error('编辑失败');
  168. }
  169. }
  170. })
  171. }
  172. });
  173. }else{
  174. Toastr.error('编辑失败');
  175. }
  176. }
  177. })
  178. });
  179. },
  180. //待发图文客服消息
  181. editwaitingimgmsg:function(){
  182. //发送 订阅号/服务号 验证
  183. $("#add-form").data("validator-options", {
  184. ignore: ':hidden',
  185. beforeSubmit: function (form) {
  186. var user_json = $.parseJSON($('.img_txt_hidde_input_no').val())
  187. if (user_json.all==0 && !user_json.subscribe_time) {
  188. var sub_from = (new Moment($('input[name="row[sub_from]"]').val())).valueOf() / 1000
  189. var sub_to = (new Moment($('input[name="row[sub_to]"]').val())).valueOf() / 1000
  190. if(!sub_from && !sub_to){
  191. Toastr.error("起止时间不能为空");
  192. return false;
  193. }else{
  194. user_json.subscribe_range = sub_from +'-'+ sub_to;
  195. }
  196. }
  197. $('.img_txt_hidde_input_no').val(JSON.stringify(user_json));
  198. var senddyhradioval = $('#dyhradio input').val();
  199. if ($(":checkbox[name^='row[sub_id]']", $("#add-form")).length) {
  200. if (!$('#c-name').val()) {
  201. Toastr.error("请选择需要发送的服务号");
  202. return false;
  203. }
  204. var other_tips = $(":checked[name^='row[sub_id]']", $("#add-form"));
  205. if (other_tips.length <= 0) {
  206. Toastr.error("请选择需要发送的订阅号");
  207. return false;
  208. }
  209. if (senddyhradioval < other_tips.length) {
  210. Toastr.error("最多可选择发送" + senddyhradioval + '个订阅号');
  211. return false;
  212. }
  213. }
  214. if (!$('.js_selected_group_id').val()) {
  215. if ($(":checkbox[name^='row[service_id]']", $("#add-form")).length) {
  216. var other_tips = $(":checked[name^='row[service_id]']", $("#add-form"));
  217. if (other_tips.length <= 0) {
  218. Toastr.error("请选择需要发送的服务号");
  219. return false;
  220. }
  221. if (senddyhradioval < other_tips.length) {
  222. Toastr.error("最多可选择发送" + senddyhradioval + '个服务号');
  223. return false;
  224. }
  225. }
  226. }
  227. //发送时间必须大于当前时间
  228. var sdatatime=$('#c-sendtime').val()+'';
  229. sdatatime = sdatatime.replace(/-/g,'/');
  230. sdatatime =new Date(sdatatime).getTime();
  231. if(sdatatime <= new Date().getTime()){
  232. Toastr.error("发送时间必须大于当前时间");
  233. return false;
  234. }
  235. }
  236. });
  237. Controller.api.bindevent();
  238. },
  239. //查看详情
  240. viewdetail: function () {
  241. // 初始化表格参数配置
  242. Table.api.init({
  243. extend: {
  244. getimage_url: window.location.href,
  245. },
  246. search: false,
  247. showToggle: false,
  248. showColumns: false,
  249. showExport: false,
  250. commonSearch: false
  251. });
  252. var table = $("#table");
  253. //当表格数据加载完成时
  254. table.on('load-success.bs.table', function (e, data) {
  255. //这里可以获取从服务端获取的JSON数据
  256. //console.log(data);
  257. //这里我们手动设置底部的值
  258. //$("#money").text(data.extend.money);
  259. //$("#price").text(data.extend.price);
  260. });
  261. // 初始化表格
  262. table.bootstrapTable({
  263. url: $.fn.bootstrapTable.defaults.extend.getimage_url,
  264. pk: 'id',
  265. sortName: 'id',
  266. columns: [Controller.api.getimagelist(table)]
  267. });
  268. // 为表格绑定事件
  269. Table.api.bindevent(table);
  270. $(document).on('click', '.btn-close', function () {
  271. Fast.api.close();
  272. });
  273. },
  274. api: {
  275. showFilterColumns:function(table){
  276. var cols = new Array();
  277. /*cols.push({field: 'sendtime', title:"发送时间",operate:'RANGE', addclass:'datetimerange', visible:false});*/
  278. /*cols.push({field: 'official_account_type', title:"群发类型",searchList: {"0":__('服务号'),"1":__('订阅号')}, visible:false});*/
  279. /* cols.push({field: 'wechat_name', title:"公众号名称", visible:false});*/
  280. cols.push({field: 'id', title: "推广ID", formatter: Controller.api.formatter.showStyle});
  281. cols.push({field: "message_text$[*].book_name", title:"书籍名称", visible:false,operate:'LIKE %...%'});
  282. return cols;
  283. },
  284. bindevent: function () {
  285. Custommain.checkbox_relation('#dyhradio', '#dyhcheck');
  286. //群发测试
  287. $('.test_fans_but').click(function(){
  288. Custommain.fans_send_message();
  289. })
  290. Form.api.bindevent($("form[role=form]"));
  291. //修改发送消息时间
  292. $(document).on('click','.s_time_box span',function(){
  293. var $this = $(this);
  294. var nval = parseInt($this.attr('stime'));
  295. var ntime = Date.parse(new Date());
  296. var nt = ntime + nval;
  297. $('#c-sendtime').val(GetRTime(nt));
  298. });
  299. function GetRTime(time){
  300. var stime;
  301. time = new Date(time);
  302. var year = time.getYear() + 1900;
  303. var month = time.getMonth()+1;
  304. var day = time.getDate();
  305. var hours = time.getHours();
  306. var minutes = time.getMinutes();
  307. var seconds = time.getSeconds();
  308. stime = year + '-' +
  309. (month < 10 ? '0'+month : month) + '-' +
  310. (day < 10 ? '0'+day : day) + ' ' +
  311. (hours < 10 ? '0'+hours : hours) + ':' +
  312. (minutes < 10 ? '0'+minutes : minutes) + ':' +
  313. (seconds < 10 ? '0'+seconds : seconds);
  314. return stime;
  315. }
  316. /**
  317. * 资源类型管理
  318. */
  319. $(document).on('click', "input[name='row[type]']", function () {
  320. var type = $(this).val();
  321. if (type == 'all') {
  322. var tagObj = {
  323. all: "1"
  324. }
  325. } else {
  326. var tagObj = {
  327. sex: -1,
  328. mobile_system: 0,
  329. tag: -1,
  330. consume: -1,
  331. kandian: -1,
  332. subscribe_time: -1,
  333. all: "0"
  334. }
  335. }
  336. var ucon = JSON.stringify(tagObj);
  337. $('#usercondition').val(ucon);
  338. $('.group-tag-type').addClass('hide');
  339. $('.group-tag-type input').attr('disabled');
  340. $('#group-tag-type-' + type).removeClass('hide');
  341. $('#group-tag-type-' + type + ' input').removeAttr('disabled');
  342. });
  343. if ($('#usercondition').val() && $('#usercondition').val().length > 0) {
  344. $tagval = JSON.parse($('#usercondition').val());
  345. if ($tagval.all == 1) { //选择所有用户
  346. $('#type-all').attr('checked', true);
  347. var type = 'all';
  348. $('.group-tag-type').addClass('hide');
  349. $('.group-tag-type input').attr('disabled');
  350. $('#group-tag-type-' + type).removeClass('hide');
  351. $('#group-tag-type-' + type + ' input').removeAttr('disabled');
  352. }
  353. }
  354. $.ajax({
  355. type: 'get',
  356. url: '/admin/custom/ajaxcategory',
  357. cache: false,
  358. async: false,
  359. success: function (res) {
  360. data = res.data;
  361. var htmlstr = '';
  362. for (var i = 0; i < data.length; i++) {
  363. htmlstr += '<span data-cid="' + data[i].id + '" >' + data[i].name + '</span>';
  364. }
  365. $('#ctag').append(htmlstr);
  366. $('#mustbe').html('约' + res.ids + '人');
  367. if ($('#usercondition').val() && $('#usercondition').val().length > 0) {
  368. $tagval = JSON.parse($('#usercondition').val());
  369. $("#sex span[data-sex='" + $tagval.sex + "']").addClass('s_s_tag').siblings().removeClass('s_s_tag');
  370. $("#ctag span[data-cid='" + $tagval.tag + "']").addClass('s_s_tag').siblings().removeClass('s_s_tag');
  371. $("#consume span[data-fee='" + $tagval.consume + "']").addClass('s_s_tag').siblings().removeClass('s_s_tag');
  372. $("#kandian span[data-kandian='" + $tagval.kandian + "']").addClass('s_s_tag').siblings().removeClass('s_s_tag');
  373. // $("#subTime span[data-week='" + $tagval.subscribe_time + "']").addClass('s_s_tag').siblings().removeClass('s_s_tag');
  374. // if ($tagval.subscribe_range) {
  375. // var t_l = $tagval.subscribe_range.split('-');
  376. // $('input[name="row[sub_from]"]').val(Moment(parseInt(t_l[0]) * 1000).format("YYYY-MM-DD HH:mm:ss"));
  377. // $('input[name="row[sub_to]"]').val(Moment(parseInt(t_l[1]) * 1000).format("YYYY-MM-DD HH:mm:ss"));
  378. // }
  379. if ($tagval.subscribe_time) {
  380. $("#subscribe_time1 span[data-fee='" + $tagval.subscribe_time + "']").addClass('s_s_tag').siblings().removeClass('s_s_tag');
  381. $('#subscribe_time2').hide();
  382. } else {
  383. $("#subscribe_time1 span").last().addClass('s_s_tag').siblings().removeClass('s_s_tag');
  384. }
  385. } else {
  386. var tagObj1 = {
  387. sex: -1,
  388. mobile_system: 0,
  389. tag: -1,
  390. consume: -1,
  391. kandian: -1,
  392. subscribe_time: -1,
  393. all: "0"
  394. };
  395. var ucon1 = JSON.stringify(tagObj1);
  396. $('#usercondition').val(ucon1);
  397. }
  398. },
  399. error: function (err) {
  400. }
  401. });
  402. $(document).on('click', '.s_tag_li_list span', function () {
  403. var $this = $(this);
  404. $this.addClass('s_s_tag').siblings('span').removeClass('s_s_tag');
  405. var tagObj = {
  406. sex: $('#sex span.s_s_tag').data('sex'),
  407. mobile_system: $('#mobile_system span.s_s_tag').data('mobile_system'),
  408. tag: $('#ctag span.s_s_tag').data('cid'),
  409. consume: $('#consume span.s_s_tag').data('fee'),
  410. kandian: $('#kandian span.s_s_tag').data('kandian'),
  411. subscribe_time: $('#subTime span.s_s_tag').data('week'),
  412. all: "0"
  413. }
  414. if ($(this).parent().attr('id') == 'subscribe_time1') {
  415. if ($(this).data('fee')) {
  416. $('#cdstarttime').val('');
  417. $('#cdendtime').val('');
  418. $('#subscribe_time2').hide();
  419. } else {
  420. $('#subscribe_time2').show();
  421. }
  422. }
  423. var uconditon = JSON.stringify(tagObj);
  424. $('#usercondition').val(uconditon);
  425. });
  426. var ofansopen = true;
  427. //tag切换
  428. $(document).on('click', '.s_tag_fans_num', function () {
  429. var $this = $(this);
  430. //防止重复点击
  431. if (!ofansopen) {
  432. return false;
  433. }
  434. ofansopen = false;
  435. $('.s_tag_footer').addClass('s_tag_fans_show');
  436. var tagObj = {
  437. sex: $('#sex span.s_s_tag').data('sex'),
  438. mobile_system: $('#mobile_system span.s_s_tag').data('mobile_system'),
  439. tag: $('#ctag span.s_s_tag').data('cid'),
  440. consume: $('#consume span.s_s_tag').data('fee'),
  441. kandian: $('#kandian span.s_s_tag').data('kandian'),
  442. subscribe_time: $('#subTime span.s_s_tag').data('week'),
  443. all: "0"
  444. }
  445. var uconditon = JSON.stringify(tagObj);
  446. $('#usercondition').val(uconditon);
  447. //console.log(tagObj);
  448. $.ajax({
  449. type: 'post',
  450. data: tagObj,
  451. //dataType:'json',
  452. url: '/admin/custom/ajaxcustom',
  453. success: function (data) {
  454. //console.log(data);
  455. $('#mustbe').html('约' + data.ids + '人');
  456. ofansopen = true;
  457. $('.s_tag_footer').removeClass('s_tag_fans_show');
  458. },
  459. error: function (err) {
  460. ofansopen = true;
  461. $('.s_tag_footer').removeClass('s_tag_fans_show');
  462. }
  463. });
  464. });
  465. },
  466. formatter:{
  467. showType: function (value, row, index) {
  468. var type_arr = ['书籍', '活动', '继续阅读', '菜单'];
  469. return type_arr[value];
  470. },
  471. showStyle:function(value, row, index){
  472. var message_data = JSON.parse(row.message_text);
  473. /*jshint multistr: true */
  474. var html = '<div class="wxb-card-list-scroll"><div class="wxb-card-item"><div class="wxb-card-item-inner"><div class="item-header"><div>';
  475. html += '<div class="tweets-card-title"><p>素材id:' + row.id + '</p></div>';
  476. html += '<div class="tweets-card-title"><p>创建时间:' + Table.api.formatter.datetime(row.createtime, row, index) + '</p></div>';
  477. html += '<div class="tweets-card-title"><p>修改时间:' + Table.api.formatter.datetime(row.updatetime, row, index) + '</p></div>';
  478. var offical_type = parseInt(row.official_account_type) == 1 ? '订阅号' : '服务号';
  479. var send_color = '';
  480. var send_text = '';
  481. switch (parseInt(row.status)) {
  482. case 0:
  483. send_color = 'red';
  484. send_text = '待发送';
  485. break;
  486. case 1:
  487. send_color = '#FF9900';
  488. send_text = '群发中';
  489. break;
  490. case 2:
  491. send_color = '#88d743';
  492. send_text = '已群发';
  493. break;
  494. }
  495. html += '<div class="tweets-card-title"><p style="color:' + send_color + '">发送时间:' + Table.api.formatter.datetime(row.sendtime, row, index) + ' ' + send_text + '</p></div>';
  496. html += '<div class="tweets-card-title"><p>群发类型:' + offical_type + '</p></div>';
  497. html += '</div></div><div class="img_txt_url"><ul>';
  498. var txtlis = '';
  499. for(var i=0; i<message_data.length; i++){
  500. var scolor = '';
  501. if(message_data[i]['type'] == 4) scolor = 'style="color:#333"';
  502. txtlis += '<li>\
  503. <p '+ scolor +'>' + message_data[i]['title'] + '</p>\
  504. </li>'
  505. }
  506. html += txtlis +'</ul></div><ul class="footer-btns">';
  507. if (parseInt(Config.status) == 0) {
  508. if(Custommain.check_waiting_send_editable(row.sendtime)){
  509. html += '<li><a class="btn-del-ajax" data_send_time="'+row.sendtime+'" href="javascript:void(0);" data-href="/admin/vipcustom/viplinktextmediapush/del?table=push&ids=' + row.id + '">删除</a></li>';
  510. html += '<li><a class="btn-editwaitmsg-ajax" data_send_time="'+row.sendtime+'" href="javascript:void(0);" data-href="/admin/vipcustom/viplinktextmediapush/editWaitingImgMsg?table=push&ids=' + row.id + '">编辑</a></li>';
  511. }
  512. } else if (parseInt(Config.status) == 2) {
  513. html += '<li><a class="btn-view-ajax" href="javascript:void(0);" data-href="/admin/vipcustom/viplinktextmediapush/viewdetail?ids=' + row.id + '">查看详情</a></li>';
  514. //html += '<li><a href="/admin/vipcustomurl/index?push_id=' + row.id +'">查看数据分析</a></li>';
  515. }
  516. html += '</ul></div></div></div>';
  517. return html;
  518. }
  519. },
  520. getimagelist: function (table) {
  521. var cols = new Array();
  522. cols.push({
  523. field: 'title',
  524. title: "标题",
  525. operate: false
  526. });
  527. cols.push({
  528. field: 'type',
  529. title: "链接类型",
  530. operate: false,
  531. formatter: Controller.api.formatter.showType
  532. });
  533. cols.push({
  534. field: 'book_id',
  535. title: "书籍id",
  536. operate: false,
  537. });
  538. cols.push({
  539. field: 'name',
  540. title: "书籍名称/活动名称/菜单名称",
  541. operate: false,
  542. });
  543. cols.push({
  544. field: 'position',
  545. title: "推广位置",
  546. operate: false,
  547. });
  548. return cols;
  549. }
  550. }
  551. };
  552. return Controller;
  553. });