middleware/Debug/DebugWindow.xaml.cs
changeset 54 eb52a12370a3
parent 50 d969375fbcf7
child 56 7d0ae2f385e7
equal deleted inserted replaced
53:5df462180423 54:eb52a12370a3
    36 
    36 
    37 namespace Trakers.Debug
    37 namespace Trakers.Debug
    38 {
    38 {
    39     public partial class DebugWindow : Window
    39     public partial class DebugWindow : Window
    40     {
    40     {
       
    41         //Nom du projet, afin de savoir quel menu charger et quel fichier de configuration utiliser (TraKERS ou BBM).
       
    42         private String projectName = "BBM";
       
    43         //Chemins du fichier de config.
       
    44         private String configPath;
       
    45         //private String projectName = "BBM";
       
    46 
    41         //Gestionnaire de ressources.
    47         //Gestionnaire de ressources.
    42         private ResourceManager rm;
    48         private ResourceManager rm;
    43 
    49 
    44         //Paramètres du serveur TUIO.
    50         //Paramètres du serveur TUIO.
    45         private OrderedDictionary config;
    51         private OrderedDictionary config;
    63         /*
    69         /*
    64         * Constructeur : Affiche la fenêtre de debug en lui passant en paramètre une instanciation de la
    70         * Constructeur : Affiche la fenêtre de debug en lui passant en paramètre une instanciation de la
    65         * classe KinectMain.
    71         * classe KinectMain.
    66         * Au départ, la kinect est éteinte.
    72         * Au départ, la kinect est éteinte.
    67         */
    73         */
    68         public DebugWindow()//KinectMain main)
    74         public DebugWindow()
    69         {
    75         {
    70             InitializeComponent();
    76             InitializeComponent();
    71 
    77 
    72             imgLocation = "Imgs";
    78             imgLocation = "Imgs";
    73 
    79 
    74             config = new OrderedDictionary();
    80             config = new OrderedDictionary();
    75 
    81 
    76             //On fait appel au gestionnaire de ressources.
    82             //On fait appel au gestionnaire de ressources.
    77             rm = new ResourceManager("Trakers.Debug.Properties.Resources", Assembly.GetExecutingAssembly());
    83             rm = new ResourceManager("Trakers.Debug.Properties.Resources", Assembly.GetExecutingAssembly());
       
    84 
       
    85             //On charge les éléments relatifs au projet.
       
    86             if (projectName.Equals("TraKERS"))
       
    87             {
       
    88                 configPath = ".\\TraKERS - config.txt";
       
    89                 loadTraKERSMenu();
       
    90             }
       
    91             else if (projectName.Equals("BBM"))
       
    92             {
       
    93                 configPath = ".\\BBM - config.txt";
       
    94                 loadBBMMenu();
       
    95             }
       
    96 
    78             //On tente de charger les paramètres du fichier params.ini.
    97             //On tente de charger les paramètres du fichier params.ini.
    79             //Si on n'y arrive pas, on affiche une erreur et on charge les paramètres par défaut.
    98             //Si on n'y arrive pas, on affiche une erreur et on charge les paramètres par défaut.
    80             if (!loadParameters())
    99             if (!loadParameters())
    81             {
   100             {
    82                 ExceptionLbl.Content = rm.GetString("loadParametersFail");
   101                 ExceptionLbl.Content = rm.GetString("loadParametersFail");
    95                 config.Add("wsTimerElapsing", 1000);
   114                 config.Add("wsTimerElapsing", 1000);
    96                 config.Add("imagesToShow", 20);
   115                 config.Add("imagesToShow", 20);
    97                 config.Add("takenPoints", 10);
   116                 config.Add("takenPoints", 10);
    98                 config.Add("directionChangeTresholdXY", 10);
   117                 config.Add("directionChangeTresholdXY", 10);
    99                 config.Add("directionChangeTresholdZ", 0.01f);
   118                 config.Add("directionChangeTresholdZ", 0.01f);
   100                 //Chemins des readme et doc.
   119 
   101                 config.Add("readmeMiddleware", "..\\readme - Middleware.txt");
   120                 if (projectName.Equals("TraKERS"))
   102                 config.Add("readmeFrontProcessing", "..\\readme - Front Processing.txt");
   121                 {
   103                 config.Add("docFrontProcessing", "..\\tutorial front processing.html");
   122                     //On charge les paramètres relatifs à TraKERS.
   104                 config.Add("readmeFrontJS", "..\\readme - Front Web.txt");
   123                     //Chemins des readme et doc pour TraKERS.
   105                 config.Add("docFrontJS", "..\\tutorial front js et wamp.html");
   124                     config.Add("readmeTraKERSMiddleware", "..\\readme - TraKERS Middleware.txt");
   106                 //Chemins des exemples processing.
   125                     config.Add("readmeTraKERSFrontProcessing", "..\\readme - TraKERS Front Processing.txt");
   107                 config.Add("exPFMPS", "..\\Front Processing\\src\\Fluid_manipulation\\Fluid_manipulation.pde");
   126                     config.Add("docTraKERSFrontProcessing", "..\\tutorial - TraKERS Front Processing.html");
   108                 config.Add("exPFMExe", "..\\Front Processing\\src\\Fluid_manipulation\\application.windows\\Fluid_manipulation.exe");
   127                     config.Add("readmeTraKERSFrontJS", "..\\readme - TraKERS Front Web.txt");
   109                 config.Add("exPSMPS", "..\\Front Processing\\src\\Smoke_manipulation\\Smoke_manipulation.pde");
   128                     config.Add("docTraKERSFrontJS", "..\\tutorial - TraKERS Front JS et Wamp.html");
   110                 config.Add("exPSMExe", "..\\Front Processing\\src\\Smoke_manipulation\\application.windows\\Smoke_manipulation.exe");
   129                     //Chemins des exemples processing.
   111                 config.Add("exPTPS", "..\\Front Processing\\src\\Trakers\\Trakers.pde");
   130                     config.Add("exPFMPS", "..\\Front Processing\\src\\Fluid_manipulation\\Fluid_manipulation.pde");
   112                 config.Add("exPTExe", "..\\Front Processing\\src\\Trakers\\application.windows\\Trakers.exe");
   131                     config.Add("exPFMExe", "..\\Front Processing\\src\\Fluid_manipulation\\application.windows\\Fluid_manipulation.exe");
   113                 config.Add("exPTGPS", "..\\Front Processing\\src\\Trakers_gestures\\Trakers_gestures.pde");
   132                     config.Add("exPSMPS", "..\\Front Processing\\src\\Smoke_manipulation\\Smoke_manipulation.pde");
   114                 config.Add("exPTGExe", "..\\Front Processing\\src\\Trakers_gestures\\application.windows\\Trakers_gestures.exe");
   133                     config.Add("exPSMExe", "..\\Front Processing\\src\\Smoke_manipulation\\application.windows\\Smoke_manipulation.exe");
   115                 config.Add("exPIEHand1DPS", "..\\Front Processing\\src\\Interaction_examples\\Hands_1D\\Hands_1D.pde");
   134                     config.Add("exPTPS", "..\\Front Processing\\src\\Trakers\\Trakers.pde");
   116                 config.Add("exPIEHand1DExe", "..\\Front Processing\\src\\Interaction_examples\\Hands_1D\\application.windows\\Hands_1D.exe");
   135                     config.Add("exPTExe", "..\\Front Processing\\src\\Trakers\\application.windows\\Trakers.exe");
   117                 config.Add("exPIEHand2DPS", "..\\Front Processing\\src\\Interaction_examples\\Hands_2D\\Hands_2D.pde");
   136                     config.Add("exPTGPS", "..\\Front Processing\\src\\Trakers_gestures\\Trakers_gestures.pde");
   118                 config.Add("exPIEHand2DExe", "..\\Front Processing\\src\\Interaction_examples\\Hands_2D\\application.windows\\Hands_2D.exe");
   137                     config.Add("exPTGExe", "..\\Front Processing\\src\\Trakers_gestures\\application.windows\\Trakers_gestures.exe");
   119                 config.Add("exPIEHandPressPS", "..\\Front Processing\\src\\Interaction_examples\\Hand_press\\Hand_press.pde");
   138                     config.Add("exPIEHand1DPS", "..\\Front Processing\\src\\Interaction_examples\\Hands_1D\\Hands_1D.pde");
   120                 config.Add("exPIEHandPressExe", "..\\Front Processing\\src\\Interaction_examples\\Hand_press\\application.windows\\Hand_press.exe");
   139                     config.Add("exPIEHand1DExe", "..\\Front Processing\\src\\Interaction_examples\\Hands_1D\\application.windows\\Hands_1D.exe");
   121                 config.Add("exPIEHandSignalPS", "..\\Front Processing\\src\\Interaction_examples\\Hand_signal\\Hand_signal.pde");
   140                     config.Add("exPIEHand2DPS", "..\\Front Processing\\src\\Interaction_examples\\Hands_2D\\Hands_2D.pde");
   122                 config.Add("exPIEHandSignalExe", "..\\Front Processing\\src\\Interaction_examples\\Hand_signal\\application.windows\\Hand_signal.exe");
   141                     config.Add("exPIEHand2DExe", "..\\Front Processing\\src\\Interaction_examples\\Hands_2D\\application.windows\\Hands_2D.exe");
   123                 //Chemins des exemples web.
   142                     config.Add("exPIEHandPressPS", "..\\Front Processing\\src\\Interaction_examples\\Hand_press\\Hand_press.pde");
   124                 config.Add("exWPointersPS", "C:\\wamp\\www\\Front JS\\pointers\\");
   143                     config.Add("exPIEHandPressExe", "..\\Front Processing\\src\\Interaction_examples\\Hand_press\\application.windows\\Hand_press.exe");
   125                 config.Add("exWPointersExe", "http://localhost/Front%20JS/pointers/");
   144                     config.Add("exPIEHandSignalPS", "..\\Front Processing\\src\\Interaction_examples\\Hand_signal\\Hand_signal.pde");
   126                 config.Add("exWGesturesPS", "C:\\wamp\\www\\Front JS\\pointers\\");
   145                     config.Add("exPIEHandSignalExe", "..\\Front Processing\\src\\Interaction_examples\\Hand_signal\\application.windows\\Hand_signal.exe");
   127                 config.Add("exWGesturesExe", "http://localhost/Front%20JS/gestures/");
   146                     //Chemins des exemples web.
       
   147                     config.Add("exWPointersPS", "C:\\wamp\\www\\Front JS\\pointers\\");
       
   148                     config.Add("exWPointersExe", "http://localhost/Front%20JS/pointers/");
       
   149                     config.Add("exWGesturesPS", "C:\\wamp\\www\\Front JS\\pointers\\");
       
   150                     config.Add("exWGesturesExe", "http://localhost/Front%20JS/gestures/");
       
   151                 }
       
   152                 else if (projectName.Equals("BBM"))
       
   153                 {
       
   154                     //On charge les paramètres relatifs à BBM.
       
   155                     //Chemins des readme et doc pour BBM.
       
   156                     config.Add("readmeBBMMiddleware", "..\\readme - BBM Middleware.txt");
       
   157                     config.Add("docBBMFrontIDILL", "..\\Front IDILL\\Documentation - Front IDILL.html");
       
   158                     //Chemins du Front IDILL pour BBM.
       
   159                     config.Add("frontIDILLS", "C:\\wamp\\www\\Front IDILL\\");
       
   160                     config.Add("frontIDILLExe", "http://localhost/Front%20IDILL/");
       
   161                 }
   128             }
   162             }
   129 
   163 
   130             //On donne les noms des éléments du menu.
   164             //On donne les noms des éléments du menu.
   131             FileMenu.Header = rm.GetString("menuFile");
   165             FileMenu.Header = rm.GetString("menuFile");
   132             ReadmeMiddlewareMenu.Header = rm.GetString("menuReadmeMiddleware");
   166             ReadmeMiddlewareMenu.Header = rm.GetString("menuReadmeMiddleware");
       
   167             
       
   168             QuitMenu.Header = rm.GetString("menuQuit");
       
   169             ConfigMenu.Header = rm.GetString("menuConfig");
       
   170             ParamMenu.Header = rm.GetString("menuParam");
       
   171             ParamMenuReboot.Header = rm.GetString("menuParamReboot");
       
   172 
       
   173             //kinectMain = main;
       
   174             on = true;
       
   175             closing = false;
       
   176             refreshImage = true;
       
   177             try
       
   178             {
       
   179                 //On instancie les timers à N ms.
       
   180                 _timer = new System.Timers.Timer((int)config["tuioTimerElapsing"]);
       
   181                 //Dès que le timer est expiré, on appelle _timer_Elapsed.
       
   182                 _timer.Elapsed += new ElapsedEventHandler(_timer_Elapsed);
       
   183             }
       
   184             catch (Exception){}
       
   185         }
       
   186 
       
   187         /*
       
   188          Charge la partie du menu de TraKERS.
       
   189          */
       
   190         public void loadTraKERSMenu()
       
   191         {
       
   192             //On rend visible la partie du menu des readme et doc de TraKERS.
       
   193             ReadmeFrontProcessingMenu.Visibility = Visibility.Visible;
       
   194             DocumentationFrontProcessingMenu.Visibility = Visibility.Visible;
       
   195             ReadmeFrontJSMenu.Visibility = Visibility.Visible;
       
   196             DocumentationFrontJSMenu.Visibility = Visibility.Visible;
       
   197             //On rend visible la partie du menu des exemples Processing et Web de TraKERS.
       
   198             ExamplesMenu.Visibility = Visibility.Visible;
       
   199 
       
   200             //On cache la partie du menu des readme et doc de BBM.
       
   201             DocumentationFrontIDILLMenu.Visibility = Visibility.Collapsed;
       
   202 
       
   203             //Readme et doc de TraKERS.
   133             ReadmeFrontProcessingMenu.Header = rm.GetString("menuReadmeFrontProcessing");
   204             ReadmeFrontProcessingMenu.Header = rm.GetString("menuReadmeFrontProcessing");
   134             DocumentationFrontProcessingMenu.Header = rm.GetString("menuDocFrontP");
   205             DocumentationFrontProcessingMenu.Header = rm.GetString("menuDocFrontP");
   135             ReadmeFrontJSMenu.Header = rm.GetString("menuReadmeFrontJS");
   206             ReadmeFrontJSMenu.Header = rm.GetString("menuReadmeFrontJS");
   136             DocumentationFrontJSMenu.Header = rm.GetString("menuDocFrontJS");
   207             DocumentationFrontJSMenu.Header = rm.GetString("menuDocFrontJS");
   137             QuitMenu.Header = rm.GetString("menuQuit");
   208             //Exemples de TraKERS.
   138             ConfigMenu.Header = rm.GetString("menuConfig");
       
   139             ParamMenu.Header = rm.GetString("menuParam");
       
   140             ParamMenuReboot.Header = rm.GetString("menuParamReboot");
       
   141             ExamplesMenu.Header = rm.GetString("menuEx");
   209             ExamplesMenu.Header = rm.GetString("menuEx");
   142             ProcessingMenu.Header = rm.GetString("menuExP");
   210             ProcessingMenu.Header = rm.GetString("menuExP");
   143             ProcessingMenuFM.Header = rm.GetString("menuExPFluid");
   211             ProcessingMenuFM.Header = rm.GetString("menuExPFluid");
   144             ProcessingMenuFMPS.Header = rm.GetString("menuExSource");
   212             ProcessingMenuFMPS.Header = rm.GetString("menuExSource");
   145             ProcessingMenuFMExe.Header = rm.GetString("menuExExe");
   213             ProcessingMenuFMExe.Header = rm.GetString("menuExExe");
   170             WebMenuPointersPS.Header = rm.GetString("menuExSource");
   238             WebMenuPointersPS.Header = rm.GetString("menuExSource");
   171             WebMenuPointersExe.Header = rm.GetString("menuExExe");
   239             WebMenuPointersExe.Header = rm.GetString("menuExExe");
   172             WebMenuGestures.Header = rm.GetString("menuExWGestures");
   240             WebMenuGestures.Header = rm.GetString("menuExWGestures");
   173             WebMenuGesturesPS.Header = rm.GetString("menuExSource");
   241             WebMenuGesturesPS.Header = rm.GetString("menuExSource");
   174             WebMenuGesturesExe.Header = rm.GetString("menuExExe");
   242             WebMenuGesturesExe.Header = rm.GetString("menuExExe");
   175 
   243         }
   176             //kinectMain = main;
   244 
   177             on = true;
   245         /*
   178             closing = false;
   246          Charge la partie du menu de BBM.
   179             refreshImage = true;
   247          */
   180             try
   248         public void loadBBMMenu()
   181             {
   249         {
   182                 //On instancie les timers à N ms.
   250             //On rend visible la partie du menu des readme et doc de BBM.
   183                 _timer = new System.Timers.Timer((int)config["tuioTimerElapsing"]);
   251             DocumentationFrontIDILLMenu.Visibility = Visibility.Visible;
   184                 //Dès que le timer est expiré, on appelle _timer_Elapsed.
   252             //On rend visible la partie du menu du Front IDILL pour BBM.
   185                 _timer.Elapsed += new ElapsedEventHandler(_timer_Elapsed);
   253             FrontIDILLMenu.Visibility = Visibility.Visible;
   186             }
   254             
   187             catch (Exception){}
   255             //On cache la partie du menu des readme et doc de TraKERS.
       
   256             ReadmeFrontProcessingMenu.Visibility = Visibility.Collapsed;
       
   257             DocumentationFrontProcessingMenu.Visibility = Visibility.Collapsed;
       
   258             ReadmeFrontJSMenu.Visibility = Visibility.Collapsed;
       
   259             DocumentationFrontJSMenu.Visibility = Visibility.Collapsed;
       
   260             //On cache la partie du menu des exemples Processing et Web de TraKERS.
       
   261             menu.Items.Remove(ExamplesMenu);
       
   262             
       
   263             //Readme et doc de BBM.
       
   264             DocumentationFrontIDILLMenu.Header = rm.GetString("menuDocFrontIDILL");
       
   265             //Exemples de BBM.
       
   266             FrontIDILLMenu.Header = rm.GetString("menuFrontIDILL");
       
   267             FrontIDILLMenuS.Header = rm.GetString("menuFrontIDILLS");
       
   268             FrontIDILLMenuExe.Header = rm.GetString("menuFrontIDILLExe");
   188         }
   269         }
   189 
   270 
   190         /*
   271         /*
   191          * Méthode d'effacement du label d'exceptions.
   272          * Méthode d'effacement du label d'exceptions.
   192          */
   273          */
   764         public bool loadParameters()
   845         public bool loadParameters()
   765         {
   846         {
   766             try
   847             try
   767             {
   848             {
   768                 //On lit le fichier de config.
   849                 //On lit le fichier de config.
   769                 String[] lines = System.IO.File.ReadAllLines("config.txt");
   850   
       
   851                     String[] lines = System.IO.File.ReadAllLines(configPath);
   770 
   852 
   771                 //On repère les paramètres supposés être des int ou float de manière à les parser.
   853                 //On repère les paramètres supposés être des int ou float de manière à les parser.
   772                 String[] ints = { "tuioConnexionPort", "wsConnexionPort", "takenPoints", "tuioTimerElapsing", "wsTimerElapsing", "directionChangeTresholdXY", "imagesToShow" };
   854                 String[] ints = { "tuioConnexionPort", "wsConnexionPort", "takenPoints", "tuioTimerElapsing", "wsTimerElapsing", "directionChangeTresholdXY", "imagesToShow" };
   773                 String[] floats = { "minDistHands", "minDist", "maxDistHands", "maxDist", "zeroPoint", "directionChangeTresholdZ" };
   855                 String[] floats = { "minDistHands", "minDist", "maxDistHands", "maxDist", "zeroPoint", "directionChangeTresholdZ" };
   774 
   856 
  1127         /*
  1209         /*
  1128          * Ouvre le readme du Middleware.
  1210          * Ouvre le readme du Middleware.
  1129          */
  1211          */
  1130         private void MiddlewareReadmeMenu_Click(object sender, RoutedEventArgs e)
  1212         private void MiddlewareReadmeMenu_Click(object sender, RoutedEventArgs e)
  1131         {
  1213         {
  1132             OpenFile((String)config["readmeMiddleware"]);
  1214             if (projectName.Equals("TraKERS"))
       
  1215             {
       
  1216                 OpenFile((String)config["readmeTraKERSMiddleware"]);
       
  1217             }
       
  1218             else if (projectName.Equals("BBM"))
       
  1219             {
       
  1220                 OpenFile((String)config["readmeBBMMiddleware"]);
       
  1221             }
  1133         }
  1222         }
  1134 
  1223 
  1135         /*
  1224         /*
  1136          * Ouvre le readme du Front Processing.
  1225          * Ouvre le readme du Front Processing.
  1137          */
  1226          */
  1138         private void FrontProcessingReadmeMenu_Click(object sender, RoutedEventArgs e)
  1227         private void FrontProcessingReadmeMenu_Click(object sender, RoutedEventArgs e)
  1139         {
  1228         {
  1140             OpenFile((String)config["readmeFrontProcessing"]);
  1229             OpenFile((String)config["readmeTraKERSFrontProcessing"]);
  1141         }
  1230         }
  1142 
  1231 
  1143         /*
  1232         /*
  1144          * Ouvre la documentation du Front Processing.
  1233          * Ouvre la documentation du Front Processing.
  1145          */
  1234          */
  1146         private void FrontProcessingDocumentationMenu_Click(object sender, RoutedEventArgs e)
  1235         private void FrontProcessingDocumentationMenu_Click(object sender, RoutedEventArgs e)
  1147         {
  1236         {
  1148             OpenFile((String)config["docFrontProcessing"]);
  1237             OpenFile((String)config["docTraKERSFrontProcessing"]);
  1149         }
  1238         }
  1150         
  1239         
  1151         /*
  1240         /*
  1152          * Ouvre le readme du Front JS.
  1241          * Ouvre le readme du Front JS.
  1153          */
  1242          */
  1154         private void FrontJSReadmeMenu_Click(object sender, RoutedEventArgs e)
  1243         private void FrontJSReadmeMenu_Click(object sender, RoutedEventArgs e)
  1155         {
  1244         {
  1156             OpenFile((String)config["readmeFrontJS"]);
  1245             OpenFile((String)config["readmeTraKERSFrontJS"]);
  1157         }
  1246         }
  1158 
  1247 
  1159         /*
  1248         /*
  1160          * Ouvre la documentation du Front JS.
  1249          * Ouvre la documentation du Front JS.
  1161          */
  1250          */
  1162         private void FrontJSDocumentationMenu_Click(object sender, RoutedEventArgs e)
  1251         private void FrontJSDocumentationMenu_Click(object sender, RoutedEventArgs e)
  1163         {
  1252         {
  1164             OpenFile((String)config["docFrontJS"]);
  1253             OpenFile((String)config["docTraKERSFrontJS"]);
       
  1254         }
       
  1255 
       
  1256         /*
       
  1257          * Ouvre la documentation du Front IDILL.
       
  1258          */
       
  1259         private void FrontIDILLDocumentationMenu_Click(object sender, RoutedEventArgs e)
       
  1260         {
       
  1261             OpenFile((String)config["docBBMFrontIDILL"]);
  1165         }
  1262         }
  1166 
  1263 
  1167         /*
  1264         /*
  1168          * Ouvre le fichier des paramètres.
  1265          * Ouvre le fichier des paramètres.
  1169          */
  1266          */
  1170         private void ParamMenu_Click(object sender, RoutedEventArgs e)
  1267         private void ParamMenu_Click(object sender, RoutedEventArgs e)
  1171         {
  1268         {
  1172             OpenFile(".\\config.txt");
  1269             OpenFile(configPath);
  1173         }
  1270         }
  1174 
  1271 
  1175         /*
  1272         /*
  1176          * Code de l'exemple processing de manipulation de fluide.
  1273          * Code de l'exemple processing de manipulation de fluide.
  1177          */
  1274          */
  1327          */
  1424          */
  1328         private void WebMenuGesturesExe_Click(object sender, RoutedEventArgs e)
  1425         private void WebMenuGesturesExe_Click(object sender, RoutedEventArgs e)
  1329         {
  1426         {
  1330             OpenFile((String)config["exWGesturesExe"]);
  1427             OpenFile((String)config["exWGesturesExe"]);
  1331         }
  1428         }
       
  1429 
       
  1430         /*
       
  1431          * Ouvre la source du Front IDILL.
       
  1432          */
       
  1433         private void FrontIDILLMenuS_Click(object sender, RoutedEventArgs e)
       
  1434         {
       
  1435             OpenFile((String)config["frontIDILLS"]);
       
  1436         }
       
  1437 
       
  1438         /*
       
  1439          * Ouvre le Front IDILL.
       
  1440          */
       
  1441         private void FrontIDILLMenuExe_Click(object sender, RoutedEventArgs e)
       
  1442         {
       
  1443             OpenFile((String)config["frontIDILLExe"]);
       
  1444         }
  1332     }
  1445     }
  1333 }
  1446 }