317. EPMO Open Source Coordination Office Redaction File Detail Report

Produced by Araxis Merge on 2/4/2019 11:34:07 AM Eastern Standard Time. See www.araxis.com for information about Merge. This report uses XHTML and CSS2, and is best viewed with a modern standards-compliant browser. For optimum results when printing this report, use landscape orientation and enable printing of background images and colours in your browser.

317.1 Files compared

# Location File Last Modified
1 MHPRO_v1.x.zip\mhpro-web-master@18b10e0e051.zip\app\veteran\cordova Gruntfile.js Wed Dec 20 15:17:09 2017 UTC
2 MHPRO_v1.x.zip\mhpro-web-master@18b10e0e051.zip\app\veteran\cordova Gruntfile.js Fri Feb 1 19:29:11 2019 UTC

317.2 Comparison summary

Description Between
Files 1 and 2
Text Blocks Lines
Unchanged 3 964
Changed 2 4
Inserted 0 0
Removed 0 0

317.3 Comparison options

Whitespace
Character case Differences in character case are significant
Line endings Differences in line endings (CR and LF characters) are ignored
CR/LF characters Not shown in the comparison detail

317.4 Active regular expressions

No regular expressions were active.

317.5 Comparison detail

  1   var path =  require(' path');
  2  
  3   module.exp orts = fun ction (gru nt) {
  4       var as set = {
  5           li bs: [
  6                'bower_c omponents/ modernizr/ modernizr. js',
  7                'bower_c omponents/ jquery/dis t/jquery.m in.js',
  8                'bower_c omponents/ bootstrap/ dist/js/bo otstrap.mi n.js',
  9                'bower_c omponents/ underscore /underscor e.js',
  10                'bower_c omponents/ backbone/b ackbone.js ',
  11                'bower_c omponents/ marionette /lib/backb one.marion ette.min.j s',
  12                'bower_c omponents/ handlebars /handlebar s.js',
  13                'bower_c omponents/ moment/mom ent.js',
  14                'bower_c omponents/ bootstrap- datepicker /dist/js/b ootstrap-d atepicker. min.js',
  15                'bower_c omponents/ d3/d3.min. js',
  16                '_temp/c ommon/lib/ modernizr_ mhpro.js',
  17                '_temp/c ommon/lib/ template_h elpers.js'
  18           ],
  19           cs s: [
  20                'bower_c omponents/ bootstrap/ dist/css/b ootstrap.c ss',
  21                'bower_c omponents/ bootstrap- datepicker /dist/css/ bootstrap- datepicker 3.css',
  22                '_temp/c ommon/css/ misc.css'
  23           ],
  24           ve teran: [
  25                '_temp/c ommon/js/a pp.js',
  26                '_temp/c ommon/lib/ resource_d irectory_u til.js',
  27                '_temp/c ommon/lib/ app_utils. js',
  28                '_temp/c ommon/lib/ vamf_user. js',
  29                '_temp/c ommon/js/m odel/*.js' ,
  30                '_temp/c ommon/js/c ollection/ *.js',
  31                '_temp/c ommon/_tem p/app_json .js',
  32                '_temp/c ommon/_tem p/vet_temp lates.js',
  33                '_temp/c ommon/_tem p/common_t emplates.j s',
  34                '_temp/c ommon/js/v iew/*.js',
  35                '_temp/v eteran/js/ view/*.js' ,
  36                '_temp/c ommon/js/r oute/base. js',
  37                '_temp/c ommon/js/r oute/veter an.js',
  38                '_temp/c ommon/js/v eteran.js' ,
  39                '_temp/c ommon/js/c ordova.js'
  40           ],
  41           ap p: '../../ ../app',
  42           te mp: '_temp ',
  43           co rdovaWeb:  'www',
  44           pl atforms: ' platforms' ,
  45           so urceDirs:  [
  46                'common/ css/**',
  47                'common/ data/**',
  48                'common/ js/**',
  49                'common/ img/**',
  50                'common/ lib/**',
  51                'common/ sass/**',
  52                'veteran /css/**',
  53                'veteran /font/**',
  54                'veteran /img/**',
  55                'veteran /js/**',
  56                'veteran /index.htm l',
  57                'veteran /resource_ directory. json'
  58           ],
  59           ap pDependenc ies: [
  60                '**'
  61           ]
  62       };
  63  
  64       grunt. initConfig ({
  65           pk g: grunt.f ile.readJS ON('packag e.json'),
  66           cl ean: {
  67                cordova:  {
  68                    src:  [
  69                         asset.temp ,
  70                         asset.cord ovaWeb,
  71                         asset.plat forms
  72                    ]
  73                }
  74           },
  75  
  76           co nnect: {
  77                Android:  {
  78                    opti ons: {
  79                         base: 'www ',
  80                         port: 3001
  81                    }
  82                },
  83                iOS: {
  84                    opti ons: {
  85                         base: 'www ',
  86                         port: 3002
  87                    }
  88                }
  89           },
  90  
  91           ex press: {
  92                veteran:  {
  93                    opti ons: {
  94                         script: 's erver.js'
  95                    }
  96                }
  97           },
  98  
  99           ha ndlebars:  {
  100                veteran:  {
  101                    opti ons: {
  102                         namespace:  'MHPRO.Te mplate',
  103                         processNam e: functio n (filePat h) {
  104                             var fi leName = f ilePath.ma tch(/.*\/( [a-zA-Z0-9 \_\-]+)\.h tml$/);
  105                             return  fileName[ 1];
  106                         }
  107                    },
  108                    file s: {
  109                         '_temp/com mon/_temp/ vet_templa tes.js': [ asset.temp  + '/veter an/js/temp late/*.htm l'],
  110                         '_temp/com mon/_temp/ common_tem plates.js' : [asset.t emp + '/co mmon/js/te mplate/*.h tml']
  111                    }
  112                }
  113           },
  114           sa ss: {
  115                veteran:  {
  116                    file s: [{
  117                         expand: tr ue,
  118                         cwd: asset .temp + '/ common/sas s',
  119                         src: ['app .scss'],
  120                         dest: asse t.temp + ' /veteran/_ build/css' ,
  121                         ext: '.css '
  122                    }/*,  {
  123                         expand: tr ue,
  124                         cwd: asset .temp + '/ common/sas s/veteran' ,
  125                         src: ['ass essment.sc ss'],
  126                         dest: asse t.temp + ' /veteran/_ build/css' ,
  127                         ext: '.css '
  128                    }, {
  129                         expand: tr ue,
  130                         cwd: asset .temp + '/ common/sas s/veteran' ,
  131                         src: ['hom e.scss'],
  132                         dest: asse t.temp + ' /veteran/_ build/css' ,
  133                         ext: '.css '
  134                    }, {
  135                         expand: tr ue,
  136                         cwd: asset .temp + '/ common/sas s/veteran' ,
  137                         src: ['hom e_phone_no tification s.scss'],
  138                         dest: asse t.temp + ' /veteran/_ build/css' ,
  139                         ext: '.css '
  140                    }*/]
  141                }
  142           },
  143  
  144           co py: {
  145                source:  {
  146                    file s: [
  147                         {
  148                             expand : true,
  149                             cwd: a sset.app,
  150                             src: [
  151                                 as set.source Dirs
  152                             ],
  153                             dest:  asset.temp
  154                         },
  155                         {expand: t rue, cwd:  asset.app,  src: 'bow er.json',  dest: '.'}
  156                    ]
  157                },
  158  
  159                veteran_ build: {
  160                    file s: [
  161                         {src: asse t.temp + ' /veteran/i ndex.html' , dest: as set.temp +  '/veteran /_build/in dex.html'} ,
  162                         {
  163                             expand : true,
  164                             flatte n: true,
  165                             src: a sset.temp  + '/vetera n/css/*',
  166                             dest:  asset.temp  + '/veter an/_build/ css/'
  167                         },
  168                         {
  169                             expand : true,
  170                             flatte n: true,
  171                             src: a sset.temp  + '/vetera n/font/*',
  172                             dest:  asset.temp  + '/veter an/_build/ font/'
  173                         },
  174                         {
  175                             expand : true,
  176                             flatte n: true,
  177                             src: a sset.temp  + '/vetera n/img/*',
  178                             dest:  asset.temp  + '/veter an/_build/ img/'
  179                         },
  180                         {
  181                             expand : true,
  182                             flatte n: true,
  183                             src: a sset.temp  + '/vetera n/js/*',
  184                             dest:  asset.temp  + '/veter an/_build/ js/'
  185                         },
  186                         {
  187                             expand : true,
  188                             flatte n: true,
  189                             src: a sset.temp  + '/common /data/*',
  190                             dest:  asset.temp  + '/veter an/_build/ '
  191                         },
  192                         {
  193                             expand : true,
  194                             flatte n: true,
  195                             src: a sset.temp  + '/common /img/*',
  196                             dest:  asset.temp  + '/veter an/_build/ img/'
  197                         },
  198                         {
  199                             expand : true,
  200                             flatte n: true,
  201                             src: ' bower_comp onents/boo tstrap/fon ts/*',
  202                             dest:  asset.temp  + '/veter an/_build/ fonts/'
  203                         },
  204                         {
  205                             src: ' bower_comp onents/boo tstrap/dis t/css/boot strap.css. map',
  206                             dest:  asset.temp  + '/veter an/_build/ css/bootst rap.css.ma p'
  207                         }
  208                    ]
  209                },
  210  
  211                grunt_me rge_androi d: {
  212                    file s: [
  213                         {expand: t rue, cwd:  'grunt_mer ge/android ', src: '* *', dest:  asset.temp  + '/'},
  214                         {expand: t rue, cwd:  asset.temp  + '/veter an', src:  '*', dest:  asset.tem p + '/vete ran/_build '}
  215                    ]
  216                },
  217  
  218                grunt_me rge_ios: {
  219                    file s: [
  220                         {expand: t rue, cwd:  'grunt_mer ge/ios', s rc: '**',  dest: asse t.temp + ' /'},
  221                         {expand: t rue, cwd:  asset.temp  + '/veter an', src:  '*', dest:  asset.tem p + '/vete ran/_build '}
  222                    ]
  223                },
  224  
  225                copy_ios _build_fil es: {
  226                    file s: [
  227                         {src: 'bui ld.gradle' , dest: as set.platfo rms + '/io s/build.gr adle'},
  228                         {src: 'MHP RO.mobilep rovision',  dest: ass et.platfor ms + '/ios /MHPRO.mob ileprovisi on'},
  229                         {src: 'jim _va_certif icates.p12 ', dest: a sset.platf orms + '/i os/jim_va_ certificat es.p12'}
  230                    ]
  231                },
  232  
  233                copy_and roid_gradl e_extras:  {
  234                    file s: [
  235                         {src: 'bui ld-extras. gradle', d est: asset .platforms  + '/andro id/build-e xtras.grad le'}
  236                    ]
  237                },
  238  
  239                setup: {
  240                    file s: [
  241                         {
  242                             expand : true,
  243                             cwd: a sset.temp  + '/vetera n/_build',
  244                             src: [
  245                                 as set.appDep endencies
  246                             ],
  247                             dest:  asset.cord ovaWeb
  248                         }
  249                    ]
  250                }
  251           },
  252  
  253           sh ell: {
  254                addCordo vaPlugins:  {
  255                    comm and: 'node  tasks/plu gins.js'
  256                },
  257                addLocal CordovaPlu gins: {
  258                    comm and: 'cord ova plugin  add ./loc al_plugins /proguard'
  259                },
  260                platform RemoveAndr oid: {
  261                    comm and: 'cord ova platfo rm remove  android'
  262                },
  263                platform AddAndroid : {
  264                    comm and: 'cord ova platfo rm add and roid'
  265                },
  266                platform AddIos: {
  267                    comm and: 'cord ova platfo rm add ios '
  268                },
  269                prepareA ndroid: {
  270                    comm and: 'cord ova prepar e android'
  271                },
  272                prepareI os: {
  273                    comm and: 'cord ova prepar e ios'
  274                },
  275                buildAnd roidDebug:  {
  276                    comm and: [
  277                         'export CO RDOVA_BUIL D_TYPE=deb ug',
  278                         'cordova b uild andro id'
  279                    ].jo in('&&')
  280                },
  281                buildAnd roidReleas e: {
  282                    comm and: [
  283                         'export CO RDOVA_BUIL D_TYPE=rel ease',
  284                         'cordova b uild andro id --relea se'
  285                    ].jo in('&&')
  286                },
  287                buildIos Debug: {
  288                    comm and: 'cord ova build  ios'
  289                },
  290                buildIos Release: {
  291                    comm and: 'cord ova build  ios'
  292                }
  293           },
  294  
  295           co ncat: {
  296                veteran:  {
  297                    src:  asset.css ,
  298                    dest : asset.te mp + '/vet eran/_buil d/css/lib. css'
  299                }
  300           },
  301  
  302           js on: {
  303                app: {
  304                    opti ons: {
  305                         namespace:  'MHPRO_Da ta',
  306                         includePat h: false
  307                    },
  308                    src:  ['_temp/c ommon/data /app.json' , '_temp/v eteran/res ource_dire ctory.json '],
  309                    dest : '_temp/c ommon/_tem p/app_json .js'
  310                }
  311           },
  312           ug lify: {
  313                options:  {
  314                    mang le: false,
  315                    sour ceMap: fal se
  316                },
  317                vet_libs : {
  318                    file s: {
  319                         '_temp/vet eran/_buil d/js/libs. js': asset .libs
  320                    }
  321                },
  322                veteran:  {
  323                    file s: {
  324                         '_temp/vet eran/_buil d/js/app.j s': asset. veteran
  325                    }
  326                }
  327           },
  328           wa tch: {
  329                androidA pp: {
  330                    file s: 'grunt_ merge/andr oid/common /js/**/*',
  331                    task s: ['copy: grunt_merg e_android' , 'handleb ars', 'ugl ify', 'cop y:setup']
  332                },
  333                iosApp:  {
  334                    file s: 'grunt_ merge/ios/ common/js/ **/*',
  335                    task s: ['copy: grunt_merg e_ios', 'h andlebars' , 'uglify' , 'copy:se tup']
  336                },
  337                androids css: {
  338                    file s: 'grunt_ merge/andr oid/common /sass/**/* ',
  339                    task s: ['copy: grunt_merg e_android' , 'sass',  'uglify',  'copy:setu p']
  340                },
  341                iosscss:  {
  342                    file s: 'grunt_ merge/ios/ common/sas s/**/*',
  343                    task s: ['copy: grunt_merg e_ios', 's ass', 'ugl ify', 'cop y:setup']
  344                }
  345           },
  346  
  347           //  STRING-RE PLACE
  348           's tring-repl ace': {
  349                // resou rce urls t o use IP a ddresses s o this can  be tested  on phones  (cannot m odify host  file on d evices)
  350                devResou rceUrl: {
  351                    opti ons: {
  352                         replacemen ts: [
  353                             {
  354                                   pattern: / :\/\/ DNS . URL /ig,
  355                                 re placement:  function  (match, p1 , offset,  string) {
  356                                        return ':/ / IP             ';
  357                                 }
  358                             }
  359                         ]
  360                    },
  361                    src:  'www/js/a pp.js',
  362                    dest : 'www/js/ app.js'
  363                },
  364                // updat e the vers ion code s tored in A ndroidMani fest.xml
  365                androidV ersionCode : {
  366                    opti ons: {
  367                         replacemen ts: [
  368                             {
  369                                 pa ttern: /an droid-vers ionCode=[' "](\d*)['" ]/ig,
  370                                 re placement:  function  (match, p1 , offset,  string) {
  371                                      var buil dNum = gru nt.option( 'buildNum' );
  372                                      return ' android-ve rsionCode= "' + build Num + '"';
  373                                 }
  374                             }
  375                         ]
  376                    },
  377                    file s: {
  378                         'config.xm l': 'confi g.xml'
  379                    }
  380                },
  381                // updat e the vers ion name s tored in A ndroidMani fest.xml
  382                androidV ersionName : {
  383                    opti ons: {
  384                         replacemen ts: [
  385                             {
  386                                 pa ttern: /ve rsion=['"] (\d*).(\d* ).(\d*)['" ]/ig,
  387                                 re placement:  function  (match, p1 , offset,  string) {
  388                                      var buil dNum = gru nt.option( 'buildNum' );
  389                                      return ' version="1 .0.' + bui ldNum + '" ';
  390                                 }
  391                             }
  392                         ]
  393                    },
  394                    file s: {
  395                         'config.xm l': 'confi g.xml'
  396                    }
  397                }
  398           },
  399  
  400           /* *
  401            *  Hockeyapp  integrati on
  402            * /
  403           ho ckeyapp: {
  404                options:  {
  405                    reso urce: '239 b87de4a615 2e172ba378 95b5c9951/ app_versio ns/upload' ,
  406                    toke n: 'b95677 4c6d374cd1 bb625de419 cb3dd7',
  407                    down load: true ,
  408                    noti fy: 0
  409                },
  410                android:  {
  411                    file : 'platfor ms/android /build/out puts/apk/a ndroid-deb ug.apk',
  412                }
  413           },
  414       });
  415  
  416       grunt. loadNpmTas ks('grunt- json');
  417       grunt. loadNpmTas ks('grunt- contrib-co py');
  418       grunt. loadNpmTas ks('grunt- bower');
  419       grunt. loadNpmTas ks('grunt- contrib-cl ean');
  420       grunt. loadNpmTas ks('grunt- contrib-sa ss');
  421       grunt. loadNpmTas ks('grunt- contrib-co ncat');
  422       grunt. loadNpmTas ks('grunt- contrib-co nnect');
  423       grunt. loadNpmTas ks('grunt- contrib-ha ndlebars') ;
  424       grunt. loadNpmTas ks('grunt- contrib-wa tch');
  425       grunt. loadNpmTas ks('grunt- contrib-ug lify');
  426       grunt. loadNpmTas ks('grunt- shell');
  427       grunt. loadNpmTas ks('grunt- string-rep lace');
  428       grunt. loadNpmTas ks('grunt- express-se rver');
  429       grunt. loadNpmTas ks('grunt- hockeyapp- upload');
  430  
  431       grunt. registerTa sk('useFor ce', '', f unction(){
  432           if (!grunt.op tion('forc e')){
  433                grunt.op tion('forc e', true);
  434           }
  435       });
  436  
  437       // App  Update co nfig - new  add
  438       grunt. registerTa sk('app_co nfig', fun ction (typ e, prod) {
  439           va r jsonFile  = asset.t emp + "/co mmon/data/ app.json";
  440           if  (!grunt.f ile.exists (jsonFile) ) {
  441                grunt.lo g.error("f ile " + js onFile + "  not found ");
  442                return t rue;//retu rn false t o abort th e executio n
  443           }
  444           va r json = g runt.file. readJSON(j sonFile);
  445           js on['last-u pdate-date '] = grunt .template. today("mm/ dd/yy");
  446           js on['appCon fig'].vete ran = (typ e === "vet ") ? true  : false;
  447           js on['appCon fig'].prov ider = (ty pe === "pr o") ? true  : false;
  448           js on['appCon fig'].cord ova = (typ e === "cor ") ? true  : false;
  449           js on['appCon fig'].prod  = (prod = == "true")  ? true :  false;
  450  
  451           gr unt.file.w rite('_tem p/common/_ temp/app.j son', JSON .stringify (json, nul l, 2));
  452       }); //  end new a dd
  453  
  454       grunt. registerTa sk('setupC ordovaAndr oid', ['cl ean', 'cop y:source',  'copy:vet eran_build ', 'copy:g runt_merge _android',  'concat',  'sass', ' handlebars ', 'json',  'uglify',  'copy:set up'/*, 'st ring-repla ce:devReso urceUrl'*/ ]);
  455       grunt. registerTa sk('setupC ordovaIos' , ['clean' , 'copy:so urce', 'co py:veteran _build', ' copy:grunt _merge_ios ', 'concat ', 'sass',  'handleba rs', 'json ', 'uglify ', 'copy:s etup']);
  456       grunt. registerTa sk('buildA ndroidDebu g-local',  ['useForce ', 'setupC ordovaAndr oid', 'she ll:platfor mAddAndroi d', 'shell :prepareAn droid', 's hell:build AndroidDeb ug']);
  457       grunt. registerTa sk('buildA ndroidDebu g', ['useF orce', 'se tupCordova Android',  'shell:add CordovaPlu gins', 'sh ell:addLoc alCordovaP lugins', ' shell:plat formAddAnd roid', 'sh ell:prepar eAndroid',  'shell:bu ildAndroid Debug' /*,  'hockeyap p'*/]);
  458       grunt. registerTa sk('buildA ndroidRele ase', ['se tupCordova Android',  'shell:add CordovaPlu gins', 'sh ell:addLoc alCordovaP lugins', ' shell:plat formAddAnd roid', 'sh ell:prepar eAndroid',  'shell:bu ildAndroid Release']) ;
  459       grunt. registerTa sk('buildI osDebug-lo cal', ['us eForce','s etupCordov aIos', 'sh ell:platfo rmAddIos',  'shell:pr epareIos',  'shell:bu ildIosDebu g', 'copy: copy_ios_b uild_files ']);
  460       grunt. registerTa sk('buildI osDebug',  ['useForce ', 'setupC ordovaIos' , 'shell:a ddCordovaP lugins', ' shell:plat formAddIos ', 'shell: prepareIos ', 'shell: buildIosDe bug', 'cop y:copy_ios _build_fil es']);
  461       grunt. registerTa sk('buildI osRelease' , ['useFor ce', 'setu pCordovaIo s', 'shell :addCordov aPlugins',  'shell:pl atformAddI os', 'shel l:prepareI os', 'shel l:buildIos Release',  'copy:copy _ios_build _files']);
  462       grunt. registerTa sk('serveA ndroid', [ 'setupCord ovaAndroid ', 'connec t:Android' , 'express ', 'watch' ]);
  463       grunt. registerTa sk('serveI os', ['set upCordovaI os', 'conn ect:iOS',  'watch']);
  464       grunt. registerTa sk('connec t-watch-an droid', [' connect:An droid', 'w atch']);
  465  
  466       // new  add
  467       //grun t.register Task('conf iguration_ dev', ['ap p_config:v et:false',  'json', ' uglify']);
  468       //grun t.register Task('serv eAndroid-l ocal', ['s etupCordov aAndroid',   'connect :Android',  'express' , 'watch'] );
  469       //grun t.register Task('serv eAndroid',  ['setupCo rdovaAndro id', 'conn ect:Androi d', 'expre ss', 'watc h']);
  470  
  471       //grun t.register Task('dev2 ', ['build ', 'config uration_de v', 'conne ct:veteran ', 'connec t:provider ', 'watch' ]);
  472  
  473       /*
  474           gr unt.regist erTask('se tupCordova Android',  ['clean',  'copy:sour ce', 'copy :veteran_b uild', 'co py:grunt_m erge_andro id', 'conc at', 'sass ', 'handle bars', 'js on', 'ugli fy', 'copy :setup', ' string-rep lace:devRe sourceUrl' ]);
  475           gr unt.regist erTask('se tupCordova Ios', ['cl ean', 'cop y:source',  'copy:vet eran_build ', 'copy:g runt_merge _ios', 'co ncat', 'sa ss', 'hand lebars', ' json', 'ug lify', 'co py:setup'] );
  476           gr unt.regist erTask('bu ildAndroid Debug', [' updateAppC onfig:cord ova:false' , 'setupCo rdovaAndro id', 'shel l:addCordo vaPlugins' , 'shell:p latformAdd Android',  'shell:pre pareAndroi d', 'shell :buildAndr oidDebug'] );
  477           gr unt.regist erTask('bu ildAndroid Release',  ['updateAp pConfig:co rdova:true ', 'setupC ordovaAndr oid', 'she ll:addCord ovaPlugins ', 'shell: platformAd dAndroid',  'shell:pr epareAndro id', 'shel l:buildAnd roidReleas e']);
  478           gr unt.regist erTask('bu ildIosDebu g', ['upda teAppConfi g:cordova: false', 's etupCordov aIos', 'sh ell:platfo rmAddIos',  'shell:pr epareIos',  'shell:ad dCordovaPl ugins', 's hell:build IosDebug'] );
  479           gr unt.regist erTask('bu ildIosRele ase', ['up dateAppCon fig:cordov a:true', ' setupCordo vaIos', 's hell:addCo rdovaPlugi ns', 'shel l:platform AddIos', ' shell:prep areIos', ' shell:buil dIosReleas e']);
  480           gr unt.regist erTask('se rveAndroid ', ['updat eAppConfig :cordova:f alse', 'se tupCordova Android',  'connect:A ndroid', ' express',  'watch']);
  481           gr unt.regist erTask('se rveIos', [ 'updateApp Config:cor dova:false ', 'setupC ordovaIos' , 'connect :iOS', 'wa tch']);
  482           gr unt.regist erTask('co nnect-watc h', ['conn ect:Androi d', 'watch ']);
  483           */
  484   };