pat=/(^|\(:nl:\))\(:markup:\)[^\S ]*\[([=@])((?: `\.!+.*?)+)\2\]/seimpat=/\(:markup(\s+([^ ]*?))?:\)[^\S ]*\[([=@])(.*?)\3\]/seipat=/\(:markup(\s+([^ ]*?))?:\)[^\S ]* (.*?)\(:markupend:\)/seipat=/\(:source\s+(info|langs)\s*:\)/iepat=/\(:source(\s+.*?)?\s*:\)[^\S ]*\[([=@])(.*?)\2\]/seipat=/\(:code(\s+.*?)?\s*:\)[^\S ]*\[([=@])(.*?)\2\]/seipat=/\(:code(\s+.*?)?\s*:\)[^\S ]* (.*?)\(:codee?nd:\)/seipat=/\(:source(\s+.*?)?\s*:\)[^\S ]* (.*?)\(:sourcee?nd:\)/seipat=/^\(:closeall:\)$/epat=/( [^\S ]*)?\[([=@])(.*?)\2\]/sepat=/\$\[(?>([^\]]+))\]/epat=/\{\*\$/epat=/\{(!?[-\w.\/]*)(\$\w+)\}/epat=/\(:(if[^ ]*?):\)(.*?)(?=\(:if[^ ]*?:\)|$)/seipat=/\(:RSS\s*(.*?)\s*:\)/epat=/\(:redirect\s+(\S.*?):\)/eipat=/\(:include\s+(\S.*?):\)/eipat=/\(:nogroupfooter:\)/eipat=/\(:nogroupheader:\)/eipat=/\(:groupfooter:\)/eipat=/\(:groupheader:\)/eipat=/\[\^#([A-Za-z][-.:\w]*)\^\]/epat=/\[\[#([A-Za-z][-.:\w]*)\s*\|\s*#\]\]/epat=/\\(?>(\\*)) /epat=/\(:([#\*])?toc(?:-(float|hide))?(?:\s+anchors=(v)isible)?(?:\s+(.*?))?(?:\s+(Q))?:\)(.*)$/sepat=/(^|\(:nl:\))\(:markup:\)[^\S ]*\[([=@])((?: `\.!+.*?)+)\2\]/seimpat=/\(:markup(\s+([^ ]*?))?:\)[^\S ]*\[([=@])(.*?)\3\]/seipat=/\(:markup(\s+([^ ]*?))?:\)[^\S ]* (.*?)\(:markupend:\)/seipat=/\(:source\s+(info|langs)\s*:\)/iepat=/\(:source(\s+.*?)?\s*:\)[^\S ]*\[([=@])(.*?)\2\]/seipat=/\(:code(\s+.*?)?\s*:\)[^\S ]*\[([=@])(.*?)\2\]/seipat=/\(:code(\s+.*?)?\s*:\)[^\S ]* (.*?)\(:codee?nd:\)/seipat=/\(:source(\s+.*?)?\s*:\)[^\S ]* (.*?)\(:sourcee?nd:\)/seipat=/^\(:closeall:\)$/epat=/( [^\S ]*)?\[([=@])(.*?)\2\]/sepat=/\$\[(?>([^\]]+))\]/epat=/\{\*\$/epat=/\{(!?[-\w.\/]*)(\$\w+)\}/epat=/\(:(if[^ ]*?):\)(.*?)(?=\(:if[^ ]*?:\)|$)/seipat=/\(:RSS\s*(.*?)\s*:\)/epat=/\(:redirect\s+(\S.*?):\)/eipat=/\(:include\s+(\S.*?):\)/eipat=/\(:nogroupfooter:\)/eipat=/\(:nogroupheader:\)/eipat=/\(:groupfooter:\)/eipat=/\(:groupheader:\)/eipat=/\[\^#([A-Za-z][-.:\w]*)\^\]/epat=/\[\[#([A-Za-z][-.:\w]*)\s*\|\s*#\]\]/epat=/\\(?>(\\*)) /epat=/\(:([#\*])?toc(?:-(float|hide))?(?:\s+anchors=(v)isible)?(?:\s+(.*?))?(?:\s+(Q))?:\)(.*)$/sepat=/^(?=%define=)((?:%%|%[A-Za-z][-,=:#\w\s'"().]*%)\s*)+$/epat=/\(:attachlist\s*(.*?):\)/eipat=/\(:searchresults(\s+.*?)?:\)/eipat=/\(:input\s+(\w+)(.*?):\)/eipat=/\(:varindex:\)/eipat=/\(:notitle:\)/eipat=/\(:(no)?spacewikiwords:\)/eipat=/\(:(no)?linebreaks:\)/eipat=/^\(:messages:\)/eipat=/\(:pagelist(\s+.*?)?:\)/eipat=/\(:searchbox(\s.*?)?:\)/epat=/\(:nofooter:\)/eipat=/\(:noright:\)/eipat=/\(:noaction:\)/eipat=/\(:noheader:\)/eipat=/\(:(no)?linkwikiwords:\)/eipat=/\(:nosidebar:\)/eipat=/\(:toc-page\s+(.*?)(?:\s+self=([01]))?:\)/epat=/\(:toc-back(?:\s+(.*?))?:\)/epat=/\(:no(action|tab)s?:\)/eipat=/\(:noleft:\)/eipat=/\(:description\s+(.+?):\)/eipat=/\(:title\s(.*?):\)/eipat=/\(:keywords?\s+(.+?):\)/eipat=/\[(([-+])+)(.*?)\1\]/epat=/<<\|([^|]+|\[\[(.+?)\]\])\|>>/epat=/^(!+|Q?:)#(#?)/epat=/\^\|([^|]+|\[\[(.+?)\]\])\|\^/epat=/\b([Mm]ini:)([^\s"\|\[\]]+)("([^"]*)")?/epat=/<\|([^|]+|\[\[(.+?)\]\])\|>/epat=/(?>\[\[([^|\]]+))\|\s*\+\s*]]/epat=/(?>\[\[([^|\]]+))\|\s*#\s*\]\]/epat=/\[\[##([A-Za-z][-.:\w]*)\]\]/epat=/(?>\[\[#([A-Za-z][-.:\w]*))\]\]/epat=/(?>\[\[([^|\]]*)\|\s*)(.*?)\s*\]\]((?:-?[[:alnum:]]+)*)/epat=/\[\[!(.*?)\]\]/epat=/(?>\[\[([^\]]+?)\s*-+>\s*)(.*?)\]\]((?:-?[[:alnum:]]+)*)/epat=/(?>\[\[\s*(.*?)\]\])((?:-?[[:alnum:]]+)*)/epat=/\bmailto:([^\s<>"{}|\\^`()[\]']*[^\s.,?!<>"{}|\\^`()[\]'])/epat=/\b(?>(http:|https:|mailto:|ftp:|news:|gopher:|nap:|file:|<:page>|AttachClip:|Attach:|PmWiki:|Cookbook:|Wiki:|UseMod:|Meatball:|Wikipedia:|PITS:|Path:))([^\s<>"{}|\\^`()[\]']+\.(?:gif|jpg|jpeg|png|GIF|JPG|JPEG|PNG))("([^"]*)")?/epat=/\b(?>(http:|https:|mailto:|ftp:|news:|gopher:|nap:|file:|<:page>|AttachClip:|Attach:|PmWiki:|Cookbook:|Wiki:|UseMod:|Meatball:|Wikipedia:|PITS:|Path:))[^\s<>"{}|\\^`()[\]']*[^\s.,?!<>"{}|\\^`()[\]']/epat=/\$([[:upper:]][[:alnum:]]*(?:[[:upper:]][[:lower:]0-9]|[[:lower:]0-9][[:upper:]])[[:alnum:]]*)\b/epat=/`(([[:upper:]][\w]*(?:-\w+)*([\/.]))?([[:upper:]][[:alnum:]]*(?:[[:upper:]][[:lower:]0-9]|[[:lower:]0-9][[:upper:]])[[:alnum:]]*))/epat=/\b([[:upper:]][\w]*(?:-\w+)*([\/.]))?([[:upper:]][[:alnum:]]*(?:[[:upper:]][[:lower:]0-9]|[[:lower:]0-9][[:upper:]])[[:alnum:]]*)/epat=/^\(:(table|cell|cellnr|tableend|div\d*(?:end)?)(\s.*?)?:\)/iepat=/^(\s+)/epat=/^((?>(\s+|%%|%[A-Za-z][-,=:#\w\s'".]*%)*)(\d+L))(\s*\|\s?)?(.*)$/epat=/^(!{1,6})\s?(.*)$/epat=/^\|\|.*\|\|.*$/epat=/^\|\|(.*)$/epat=/^(?=\s*\S)(<:([^>]+)>)?/epat=/(\d+L)/epat=/(\d.*?)/epat=/(^|\(:nl:\))\(:markup:\)[^\S ]*\[([=@])((?: `\.!+.*?)+)\2\]/seimpat=/\(:markup(\s+([^ ]*?))?:\)[^\S ]*\[([=@])(.*?)\3\]/seipat=/\(:markup(\s+([^ ]*?))?:\)[^\S ]* (.*?)\(:markupend:\)/seipat=/\(:source\s+(info|langs)\s*:\)/iepat=/\(:source(\s+.*?)?\s*:\)[^\S ]*\[([=@])(.*?)\2\]/seipat=/\(:code(\s+.*?)?\s*:\)[^\S ]*\[([=@])(.*?)\2\]/seipat=/\(:code(\s+.*?)?\s*:\)[^\S ]* (.*?)\(:codee?nd:\)/seipat=/\(:source(\s+.*?)?\s*:\)[^\S ]* (.*?)\(:sourcee?nd:\)/seipat=/^\(:closeall:\)$/epat=/( [^\S ]*)?\[([=@])(.*?)\2\]/sepat=/\$\[(?>([^\]]+))\]/epat=/\{\*\$/epat=/\{(!?[-\w.\/]*)(\$\w+)\}/epat=/\(:(if[^ ]*?):\)(.*?)(?=\(:if[^ ]*?:\)|$)/seipat=/\(:RSS\s*(.*?)\s*:\)/epat=/\(:redirect\s+(\S.*?):\)/eipat=/\(:include\s+(\S.*?):\)/eipat=/\(:nogroupfooter:\)/eipat=/\(:nogroupheader:\)/eipat=/\(:groupfooter:\)/eipat=/\(:groupheader:\)/eipat=/\[\^#([A-Za-z][-.:\w]*)\^\]/epat=/\[\[#([A-Za-z][-.:\w]*)\s*\|\s*#\]\]/epat=/\\(?>(\\*)) /epat=/\(:([#\*])?toc(?:-(float|hide))?(?:\s+anchors=(v)isible)?(?:\s+(.*?))?(?:\s+(Q))?:\)(.*)$/sepat=/^(?=%define=)((?:%%|%[A-Za-z][-,=:#\w\s'"().]*%)\s*)+$/epat=/\(:attachlist\s*(.*?):\)/eipat=/\(:searchresults(\s+.*?)?:\)/eipat=/\(:input\s+(\w+)(.*?):\)/eipat=/\(:varindex:\)/eipat=/\(:notitle:\)/eipat=/\(:(no)?spacewikiwords:\)/eipat=/\(:(no)?linebreaks:\)/eipat=/^\(:messages:\)/eipat=/\(:pagelist(\s+.*?)?:\)/eipat=/\(:searchbox(\s.*?)?:\)/epat=/\(:nofooter:\)/eipat=/\(:noright:\)/eipat=/\(:noaction:\)/eipat=/\(:noheader:\)/eipat=/\(:(no)?linkwikiwords:\)/eipat=/\(:nosidebar:\)/eipat=/\(:toc-page\s+(.*?)(?:\s+self=([01]))?:\)/epat=/\(:toc-back(?:\s+(.*?))?:\)/epat=/\(:no(action|tab)s?:\)/eipat=/\(:noleft:\)/eipat=/\(:description\s+(.+?):\)/eipat=/\(:title\s(.*?):\)/eipat=/\(:keywords?\s+(.+?):\)/eipat=/\[(([-+])+)(.*?)\1\]/epat=/<<\|([^|]+|\[\[(.+?)\]\])\|>>/epat=/^(!+|Q?:)#(#?)/epat=/\^\|([^|]+|\[\[(.+?)\]\])\|\^/epat=/\b([Mm]ini:)([^\s"\|\[\]]+)("([^"]*)")?/epat=/<\|([^|]+|\[\[(.+?)\]\])\|>/epat=/(?>\[\[([^|\]]+))\|\s*\+\s*]]/epat=/(?>\[\[([^|\]]+))\|\s*#\s*\]\]/epat=/\[\[##([A-Za-z][-.:\w]*)\]\]/epat=/(?>\[\[#([A-Za-z][-.:\w]*))\]\]/epat=/(?>\[\[([^|\]]*)\|\s*)(.*?)\s*\]\]((?:-?[[:alnum:]]+)*)/epat=/\[\[!(.*?)\]\]/epat=/(?>\[\[([^\]]+?)\s*-+>\s*)(.*?)\]\]((?:-?[[:alnum:]]+)*)/epat=/(?>\[\[\s*(.*?)\]\])((?:-?[[:alnum:]]+)*)/epat=/\bmailto:([^\s<>"{}|\\^`()[\]']*[^\s.,?!<>"{}|\\^`()[\]'])/epat=/\b(?>(http:|https:|mailto:|ftp:|news:|gopher:|nap:|file:|<:page>|AttachClip:|Attach:|PmWiki:|Cookbook:|Wiki:|UseMod:|Meatball:|Wikipedia:|PITS:|Path:))([^\s<>"{}|\\^`()[\]']+\.(?:gif|jpg|jpeg|png|GIF|JPG|JPEG|PNG))("([^"]*)")?/epat=/\b(?>(http:|https:|mailto:|ftp:|news:|gopher:|nap:|file:|<:page>|AttachClip:|Attach:|PmWiki:|Cookbook:|Wiki:|UseMod:|Meatball:|Wikipedia:|PITS:|Path:))[^\s<>"{}|\\^`()[\]']*[^\s.,?!<>"{}|\\^`()[\]']/epat=/\$([[:upper:]][[:alnum:]]*(?:[[:upper:]][[:lower:]0-9]|[[:lower:]0-9][[:upper:]])[[:alnum:]]*)\b/epat=/`(([[:upper:]][\w]*(?:-\w+)*([\/.]))?([[:upper:]][[:alnum:]]*(?:[[:upper:]][[:lower:]0-9]|[[:lower:]0-9][[:upper:]])[[:alnum:]]*))/epat=/\b([[:upper:]][\w]*(?:-\w+)*([\/.]))?([[:upper:]][[:alnum:]]*(?:[[:upper:]][[:lower:]0-9]|[[:lower:]0-9][[:upper:]])[[:alnum:]]*)/epat=/^\(:(table|cell|cellnr|tableend|div\d*(?:end)?)(\s.*?)?:\)/iepat=/^(\s+)/epat=/^((?>(\s+|%%|%[A-Za-z][-,=:#\w\s'".]*%)*)(\d+L))(\s*\|\s?)?(.*)$/epat=/^(!{1,6})\s?(.*)$/epat=/^\|\|.*\|\|.*$/epat=/^\|\|(.*)$/epat=/^(?=\s*\S)(<:([^>]+)>)?/epat=/(\d+L)/epat=/(\d.*?)/epat=/(^|\(:nl:\))\(:markup:\)[^\S ]*\[([=@])((?: `\.!+.*?)+)\2\]/seimpat=/\(:markup(\s+([^ ]*?))?:\)[^\S ]*\[([=@])(.*?)\3\]/seipat=/\(:markup(\s+([^ ]*?))?:\)[^\S ]* (.*?)\(:markupend:\)/seipat=/\(:source\s+(info|langs)\s*:\)/iepat=/\(:source(\s+.*?)?\s*:\)[^\S ]*\[([=@])(.*?)\2\]/seipat=/\(:code(\s+.*?)?\s*:\)[^\S ]*\[([=@])(.*?)\2\]/seipat=/\(:code(\s+.*?)?\s*:\)[^\S ]* (.*?)\(:codee?nd:\)/seipat=/\(:source(\s+.*?)?\s*:\)[^\S ]* (.*?)\(:sourcee?nd:\)/seipat=/^\(:closeall:\)$/epat=/( [^\S ]*)?\[([=@])(.*?)\2\]/sepat=/\$\[(?>([^\]]+))\]/epat=/\{\*\$/epat=/\{(!?[-\w.\/]*)(\$\w+)\}/epat=/\(:(if[^ ]*?):\)(.*?)(?=\(:if[^ ]*?:\)|$)/seipat=/\(:RSS\s*(.*?)\s*:\)/epat=/\(:redirect\s+(\S.*?):\)/eipat=/\(:include\s+(\S.*?):\)/eipat=/\(:nogroupfooter:\)/eipat=/\(:nogroupheader:\)/eipat=/\(:groupfooter:\)/eipat=/\(:groupheader:\)/eipat=/\[\^#([A-Za-z][-.:\w]*)\^\]/epat=/\[\[#([A-Za-z][-.:\w]*)\s*\|\s*#\]\]/epat=/\\(?>(\\*)) /epat=/\(:([#\*])?toc(?:-(float|hide))?(?:\s+anchors=(v)isible)?(?:\s+(.*?))?(?:\s+(Q))?:\)(.*)$/sepat=/^(?=%define=)((?:%%|%[A-Za-z][-,=:#\w\s'"().]*%)\s*)+$/epat=/\(:attachlist\s*(.*?):\)/eipat=/\(:searchresults(\s+.*?)?:\)/eipat=/\(:input\s+(\w+)(.*?):\)/eipat=/\(:varindex:\)/eipat=/\(:notitle:\)/eipat=/\(:(no)?spacewikiwords:\)/eipat=/\(:(no)?linebreaks:\)/eipat=/^\(:messages:\)/eipat=/\(:pagelist(\s+.*?)?:\)/eipat=/\(:searchbox(\s.*?)?:\)/epat=/\(:nofooter:\)/eipat=/\(:noright:\)/eipat=/\(:noaction:\)/eipat=/\(:noheader:\)/eipat=/\(:(no)?linkwikiwords:\)/eipat=/\(:nosidebar:\)/eipat=/\(:toc-page\s+(.*?)(?:\s+self=([01]))?:\)/epat=/\(:toc-back(?:\s+(.*?))?:\)/epat=/\(:no(action|tab)s?:\)/eipat=/\(:noleft:\)/eipat=/\(:description\s+(.+?):\)/eipat=/\(:title\s(.*?):\)/eipat=/\(:keywords?\s+(.+?):\)/eipat=/\[(([-+])+)(.*?)\1\]/epat=/<<\|([^|]+|\[\[(.+?)\]\])\|>>/epat=/^(!+|Q?:)#(#?)/epat=/\^\|([^|]+|\[\[(.+?)\]\])\|\^/epat=/\b([Mm]ini:)([^\s"\|\[\]]+)("([^"]*)")?/epat=/<\|([^|]+|\[\[(.+?)\]\])\|>/epat=/(?>\[\[([^|\]]+))\|\s*\+\s*]]/epat=/(?>\[\[([^|\]]+))\|\s*#\s*\]\]/epat=/\[\[##([A-Za-z][-.:\w]*)\]\]/epat=/(?>\[\[#([A-Za-z][-.:\w]*))\]\]/epat=/(?>\[\[([^|\]]*)\|\s*)(.*?)\s*\]\]((?:-?[[:alnum:]]+)*)/epat=/\[\[!(.*?)\]\]/epat=/(?>\[\[([^\]]+?)\s*-+>\s*)(.*?)\]\]((?:-?[[:alnum:]]+)*)/epat=/(?>\[\[\s*(.*?)\]\])((?:-?[[:alnum:]]+)*)/epat=/\bmailto:([^\s<>"{}|\\^`()[\]']*[^\s.,?!<>"{}|\\^`()[\]'])/epat=/\b(?>(http:|https:|mailto:|ftp:|news:|gopher:|nap:|file:|<:page>|AttachClip:|Attach:|PmWiki:|Cookbook:|Wiki:|UseMod:|Meatball:|Wikipedia:|PITS:|Path:))([^\s<>"{}|\\^`()[\]']+\.(?:gif|jpg|jpeg|png|GIF|JPG|JPEG|PNG))("([^"]*)")?/epat=/\b(?>(http:|https:|mailto:|ftp:|news:|gopher:|nap:|file:|<:page>|AttachClip:|Attach:|PmWiki:|Cookbook:|Wiki:|UseMod:|Meatball:|Wikipedia:|PITS:|Path:))[^\s<>"{}|\\^`()[\]']*[^\s.,?!<>"{}|\\^`()[\]']/epat=/\$([[:upper:]][[:alnum:]]*(?:[[:upper:]][[:lower:]0-9]|[[:lower:]0-9][[:upper:]])[[:alnum:]]*)\b/epat=/`(([[:upper:]][\w]*(?:-\w+)*([\/.]))?([[:upper:]][[:alnum:]]*(?:[[:upper:]][[:lower:]0-9]|[[:lower:]0-9][[:upper:]])[[:alnum:]]*))/epat=/\b([[:upper:]][\w]*(?:-\w+)*([\/.]))?([[:upper:]][[:alnum:]]*(?:[[:upper:]][[:lower:]0-9]|[[:lower:]0-9][[:upper:]])[[:alnum:]]*)/epat=/^\(:(table|cell|cellnr|tableend|div\d*(?:end)?)(\s.*?)?:\)/iepat=/^(\s+)/epat=/^((?>(\s+|%%|%[A-Za-z][-,=:#\w\s'".]*%)*)(\d+L))(\s*\|\s?)?(.*)$/epat=/^(!{1,6})\s?(.*)$/epat=/^\|\|.*\|\|.*$/epat=/^\|\|(.*)$/epat=/^(?=\s*\S)(<:([^>]+)>)?/epat=/(\d+L)/epat=/(\d.*?)/epat=/(^|\(:nl:\))\(:markup:\)[^\S ]*\[([=@])((?: `\.!+.*?)+)\2\]/seimpat=/\(:markup(\s+([^ ]*?))?:\)[^\S ]*\[([=@])(.*?)\3\]/seipat=/\(:markup(\s+([^ ]*?))?:\)[^\S ]* (.*?)\(:markupend:\)/seipat=/\(:source\s+(info|langs)\s*:\)/iepat=/\(:source(\s+.*?)?\s*:\)[^\S ]*\[([=@])(.*?)\2\]/seipat=/\(:code(\s+.*?)?\s*:\)[^\S ]*\[([=@])(.*?)\2\]/seipat=/\(:code(\s+.*?)?\s*:\)[^\S ]* (.*?)\(:codee?nd:\)/seipat=/\(:source(\s+.*?)?\s*:\)[^\S ]* (.*?)\(:sourcee?nd:\)/seipat=/^\(:closeall:\)$/epat=/( [^\S ]*)?\[([=@])(.*?)\2\]/sepat=/\$\[(?>([^\]]+))\]/epat=/\{\*\$/epat=/\{(!?[-\w.\/]*)(\$\w+)\}/epat=/\(:(if[^ ]*?):\)(.*?)(?=\(:if[^ ]*?:\)|$)/seipat=/\(:RSS\s*(.*?)\s*:\)/epat=/\(:redirect\s+(\S.*?):\)/eipat=/\(:include\s+(\S.*?):\)/eipat=/\(:nogroupfooter:\)/eipat=/\(:nogroupheader:\)/eipat=/\(:groupfooter:\)/eipat=/\(:groupheader:\)/eipat=/\[\^#([A-Za-z][-.:\w]*)\^\]/epat=/\[\[#([A-Za-z][-.:\w]*)\s*\|\s*#\]\]/epat=/\\(?>(\\*)) /epat=/\(:([#\*])?toc(?:-(float|hide))?(?:\s+anchors=(v)isible)?(?:\s+(.*?))?(?:\s+(Q))?:\)(.*)$/sepat=/^(?=%define=)((?:%%|%[A-Za-z][-,=:#\w\s'"().]*%)\s*)+$/epat=/\(:attachlist\s*(.*?):\)/eipat=/\(:searchresults(\s+.*?)?:\)/eipat=/\(:input\s+(\w+)(.*?):\)/eipat=/\(:varindex:\)/eipat=/\(:notitle:\)/eipat=/\(:(no)?spacewikiwords:\)/eipat=/\(:(no)?linebreaks:\)/eipat=/^\(:messages:\)/eipat=/\(:pagelist(\s+.*?)?:\)/eipat=/\(:searchbox(\s.*?)?:\)/epat=/\(:nofooter:\)/eipat=/\(:noright:\)/eipat=/\(:noaction:\)/eipat=/\(:noheader:\)/eipat=/\(:(no)?linkwikiwords:\)/eipat=/\(:nosidebar:\)/eipat=/\(:toc-page\s+(.*?)(?:\s+self=([01]))?:\)/epat=/\(:toc-back(?:\s+(.*?))?:\)/epat=/\(:no(action|tab)s?:\)/eipat=/\(:noleft:\)/eipat=/\(:description\s+(.+?):\)/eipat=/\(:title\s(.*?):\)/eipat=/\(:keywords?\s+(.+?):\)/eipat=/\[(([-+])+)(.*?)\1\]/epat=/<<\|([^|]+|\[\[(.+?)\]\])\|>>/epat=/^(!+|Q?:)#(#?)/epat=/\^\|([^|]+|\[\[(.+?)\]\])\|\^/epat=/\b([Mm]ini:)([^\s"\|\[\]]+)("([^"]*)")?/epat=/<\|([^|]+|\[\[(.+?)\]\])\|>/epat=/(?>\[\[([^|\]]+))\|\s*\+\s*]]/epat=/(?>\[\[([^|\]]+))\|\s*#\s*\]\]/epat=/\[\[##([A-Za-z][-.:\w]*)\]\]/epat=/(?>\[\[#([A-Za-z][-.:\w]*))\]\]/epat=/(?>\[\[([^|\]]*)\|\s*)(.*?)\s*\]\]((?:-?[[:alnum:]]+)*)/epat=/\[\[!(.*?)\]\]/epat=/(?>\[\[([^\]]+?)\s*-+>\s*)(.*?)\]\]((?:-?[[:alnum:]]+)*)/epat=/(?>\[\[\s*(.*?)\]\])((?:-?[[:alnum:]]+)*)/epat=/\bmailto:([^\s<>"{}|\\^`()[\]']*[^\s.,?!<>"{}|\\^`()[\]'])/epat=/\b(?>(http:|https:|mailto:|ftp:|news:|gopher:|nap:|file:|<:page>|AttachClip:|Attach:|PmWiki:|Cookbook:|Wiki:|UseMod:|Meatball:|Wikipedia:|PITS:|Path:))([^\s<>"{}|\\^`()[\]']+\.(?:gif|jpg|jpeg|png|GIF|JPG|JPEG|PNG))("([^"]*)")?/epat=/\b(?>(http:|https:|mailto:|ftp:|news:|gopher:|nap:|file:|<:page>|AttachClip:|Attach:|PmWiki:|Cookbook:|Wiki:|UseMod:|Meatball:|Wikipedia:|PITS:|Path:))[^\s<>"{}|\\^`()[\]']*[^\s.,?!<>"{}|\\^`()[\]']/epat=/\$([[:upper:]][[:alnum:]]*(?:[[:upper:]][[:lower:]0-9]|[[:lower:]0-9][[:upper:]])[[:alnum:]]*)\b/epat=/`(([[:upper:]][\w]*(?:-\w+)*([\/.]))?([[:upper:]][[:alnum:]]*(?:[[:upper:]][[:lower:]0-9]|[[:lower:]0-9][[:upper:]])[[:alnum:]]*))/epat=/\b([[:upper:]][\w]*(?:-\w+)*([\/.]))?([[:upper:]][[:alnum:]]*(?:[[:upper:]][[:lower:]0-9]|[[:lower:]0-9][[:upper:]])[[:alnum:]]*)/epat=/^\(:(table|cell|cellnr|tableend|div\d*(?:end)?)(\s.*?)?:\)/iepat=/^(\s+)/epat=/^((?>(\s+|%%|%[A-Za-z][-,=:#\w\s'".]*%)*)(\d+L))(\s*\|\s?)?(.*)$/epat=/^(!{1,6})\s?(.*)$/epat=/^\|\|.*\|\|.*$/epat=/^\|\|(.*)$/epat=/^(?=\s*\S)(<:([^>]+)>)?/epat=/(\d+L)/epat=/(\d.*?)/epat=/(^|\(:nl:\))\(:markup:\)[^\S ]*\[([=@])((?: `\.!+.*?)+)\2\]/seimpat=/\(:markup(\s+([^ ]*?))?:\)[^\S ]*\[([=@])(.*?)\3\]/seipat=/\(:markup(\s+([^ ]*?))?:\)[^\S ]* (.*?)\(:markupend:\)/seipat=/\(:source\s+(info|langs)\s*:\)/iepat=/\(:source(\s+.*?)?\s*:\)[^\S ]*\[([=@])(.*?)\2\]/seipat=/\(:code(\s+.*?)?\s*:\)[^\S ]*\[([=@])(.*?)\2\]/seipat=/\(:code(\s+.*?)?\s*:\)[^\S ]* (.*?)\(:codee?nd:\)/seipat=/\(:source(\s+.*?)?\s*:\)[^\S ]* (.*?)\(:sourcee?nd:\)/seipat=/^\(:closeall:\)$/epat=/( [^\S ]*)?\[([=@])(.*?)\2\]/sepat=/\$\[(?>([^\]]+))\]/epat=/\{\*\$/epat=/\{(!?[-\w.\/]*)(\$\w+)\}/epat=/\(:(if[^ ]*?):\)(.*?)(?=\(:if[^ ]*?:\)|$)/seipat=/\(:RSS\s*(.*?)\s*:\)/epat=/\(:redirect\s+(\S.*?):\)/eipat=/\(:include\s+(\S.*?):\)/eipat=/\(:nogroupfooter:\)/eipat=/\(:nogroupheader:\)/eipat=/\(:groupfooter:\)/eipat=/\(:groupheader:\)/eipat=/\[\^#([A-Za-z][-.:\w]*)\^\]/epat=/\[\[#([A-Za-z][-.:\w]*)\s*\|\s*#\]\]/epat=/\\(?>(\\*)) /epat=/\(:([#\*])?toc(?:-(float|hide))?(?:\s+anchors=(v)isible)?(?:\s+(.*?))?(?:\s+(Q))?:\)(.*)$/sepat=/^(?=%define=)((?:%%|%[A-Za-z][-,=:#\w\s'"().]*%)\s*)+$/epat=/\(:attachlist\s*(.*?):\)/eipat=/\(:searchresults(\s+.*?)?:\)/eipat=/\(:input\s+(\w+)(.*?):\)/eipat=/\(:varindex:\)/eipat=/\(:notitle:\)/eipat=/\(:(no)?spacewikiwords:\)/eipat=/\(:(no)?linebreaks:\)/eipat=/^\(:messages:\)/eipat=/\(:pagelist(\s+.*?)?:\)/eipat=/\(:searchbox(\s.*?)?:\)/epat=/\(:nofooter:\)/eipat=/\(:noright:\)/eipat=/\(:noaction:\)/eipat=/\(:noheader:\)/eipat=/\(:(no)?linkwikiwords:\)/eipat=/\(:nosidebar:\)/eipat=/\(:toc-page\s+(.*?)(?:\s+self=([01]))?:\)/epat=/\(:toc-back(?:\s+(.*?))?:\)/epat=/\(:no(action|tab)s?:\)/eipat=/\(:noleft:\)/eipat=/\(:description\s+(.+?):\)/eipat=/\(:title\s(.*?):\)/eipat=/\(:keywords?\s+(.+?):\)/eipat=/\[(([-+])+)(.*?)\1\]/epat=/<<\|([^|]+|\[\[(.+?)\]\])\|>>/epat=/^(!+|Q?:)#(#?)/epat=/\^\|([^|]+|\[\[(.+?)\]\])\|\^/epat=/\b([Mm]ini:)([^\s"\|\[\]]+)("([^"]*)")?/epat=/<\|([^|]+|\[\[(.+?)\]\])\|>/epat=/(?>\[\[([^|\]]+))\|\s*\+\s*]]/epat=/(?>\[\[([^|\]]+))\|\s*#\s*\]\]/epat=/\[\[##([A-Za-z][-.:\w]*)\]\]/epat=/(?>\[\[#([A-Za-z][-.:\w]*))\]\]/epat=/(?>\[\[([^|\]]*)\|\s*)(.*?)\s*\]\]((?:-?[[:alnum:]]+)*)/epat=/\[\[!(.*?)\]\]/epat=/(?>\[\[([^\]]+?)\s*-+>\s*)(.*?)\]\]((?:-?[[:alnum:]]+)*)/epat=/(?>\[\[\s*(.*?)\]\])((?:-?[[:alnum:]]+)*)/epat=/\bmailto:([^\s<>"{}|\\^`()[\]']*[^\s.,?!<>"{}|\\^`()[\]'])/epat=/\b(?>(http:|https:|mailto:|ftp:|news:|gopher:|nap:|file:|<:page>|AttachClip:|Attach:|PmWiki:|Cookbook:|Wiki:|UseMod:|Meatball:|Wikipedia:|PITS:|Path:))([^\s<>"{}|\\^`()[\]']+\.(?:gif|jpg|jpeg|png|GIF|JPG|JPEG|PNG))("([^"]*)")?/epat=/\b(?>(http:|https:|mailto:|ftp:|news:|gopher:|nap:|file:|<:page>|AttachClip:|Attach:|PmWiki:|Cookbook:|Wiki:|UseMod:|Meatball:|Wikipedia:|PITS:|Path:))[^\s<>"{}|\\^`()[\]']*[^\s.,?!<>"{}|\\^`()[\]']/epat=/\$([[:upper:]][[:alnum:]]*(?:[[:upper:]][[:lower:]0-9]|[[:lower:]0-9][[:upper:]])[[:alnum:]]*)\b/epat=/`(([[:upper:]][\w]*(?:-\w+)*([\/.]))?([[:upper:]][[:alnum:]]*(?:[[:upper:]][[:lower:]0-9]|[[:lower:]0-9][[:upper:]])[[:alnum:]]*))/epat=/\b([[:upper:]][\w]*(?:-\w+)*([\/.]))?([[:upper:]][[:alnum:]]*(?:[[:upper:]][[:lower:]0-9]|[[:lower:]0-9][[:upper:]])[[:alnum:]]*)/epat=/^\(:(table|cell|cellnr|tableend|div\d*(?:end)?)(\s.*?)?:\)/iepat=/^(\s+)/epat=/^((?>(\s+|%%|%[A-Za-z][-,=:#\w\s'".]*%)*)(\d+L))(\s*\|\s?)?(.*)$/epat=/^(!{1,6})\s?(.*)$/epat=/^\|\|.*\|\|.*$/epat=/^\|\|(.*)$/epat=/^(?=\s*\S)(<:([^>]+)>)?/epat=/(\d+L)/epat=/(\d.*?)/epat=/(^|\(:nl:\))\(:markup:\)[^\S ]*\[([=@])((?: `\.!+.*?)+)\2\]/seimpat=/\(:markup(\s+([^ ]*?))?:\)[^\S ]*\[([=@])(.*?)\3\]/seipat=/\(:markup(\s+([^ ]*?))?:\)[^\S ]* (.*?)\(:markupend:\)/seipat=/\(:source\s+(info|langs)\s*:\)/iepat=/\(:source(\s+.*?)?\s*:\)[^\S ]*\[([=@])(.*?)\2\]/seipat=/\(:code(\s+.*?)?\s*:\)[^\S ]*\[([=@])(.*?)\2\]/seipat=/\(:code(\s+.*?)?\s*:\)[^\S ]* (.*?)\(:codee?nd:\)/seipat=/\(:source(\s+.*?)?\s*:\)[^\S ]* (.*?)\(:sourcee?nd:\)/seipat=/^\(:closeall:\)$/epat=/( [^\S ]*)?\[([=@])(.*?)\2\]/sepat=/\$\[(?>([^\]]+))\]/epat=/\{\*\$/epat=/\{(!?[-\w.\/]*)(\$\w+)\}/epat=/\(:(if[^ ]*?):\)(.*?)(?=\(:if[^ ]*?:\)|$)/seipat=/\(:RSS\s*(.*?)\s*:\)/epat=/\(:redirect\s+(\S.*?):\)/eipat=/\(:include\s+(\S.*?):\)/eipat=/\(:nogroupfooter:\)/eipat=/\(:nogroupheader:\)/eipat=/\(:groupfooter:\)/eipat=/\(:groupheader:\)/eipat=/\[\^#([A-Za-z][-.:\w]*)\^\]/epat=/\[\[#([A-Za-z][-.:\w]*)\s*\|\s*#\]\]/epat=/\\(?>(\\*)) /epat=/\(:([#\*])?toc(?:-(float|hide))?(?:\s+anchors=(v)isible)?(?:\s+(.*?))?(?:\s+(Q))?:\)(.*)$/sepat=/^(?=%define=)((?:%%|%[A-Za-z][-,=:#\w\s'"().]*%)\s*)+$/epat=/\(:attachlist\s*(.*?):\)/eipat=/\(:searchresults(\s+.*?)?:\)/eipat=/\(:input\s+(\w+)(.*?):\)/eipat=/\(:varindex:\)/eipat=/\(:notitle:\)/eipat=/\(:(no)?spacewikiwords:\)/eipat=/\(:(no)?linebreaks:\)/eipat=/^\(:messages:\)/eipat=/\(:pagelist(\s+.*?)?:\)/eipat=/\(:searchbox(\s.*?)?:\)/epat=/\(:nofooter:\)/eipat=/\(:noright:\)/eipat=/\(:noaction:\)/eipat=/\(:noheader:\)/eipat=/\(:(no)?linkwikiwords:\)/eipat=/\(:nosidebar:\)/eipat=/\(:toc-page\s+(.*?)(?:\s+self=([01]))?:\)/epat=/\(:toc-back(?:\s+(.*?))?:\)/epat=/\(:no(action|tab)s?:\)/eipat=/\(:noleft:\)/eipat=/\(:description\s+(.+?):\)/eipat=/\(:title\s(.*?):\)/eipat=/\(:keywords?\s+(.+?):\)/eipat=/\[(([-+])+)(.*?)\1\]/epat=/<<\|([^|]+|\[\[(.+?)\]\])\|>>/epat=/^(!+|Q?:)#(#?)/epat=/\^\|([^|]+|\[\[(.+?)\]\])\|\^/epat=/\b([Mm]ini:)([^\s"\|\[\]]+)("([^"]*)")?/epat=/<\|([^|]+|\[\[(.+?)\]\])\|>/epat=/(?>\[\[([^|\]]+))\|\s*\+\s*]]/epat=/(?>\[\[([^|\]]+))\|\s*#\s*\]\]/epat=/\[\[##([A-Za-z][-.:\w]*)\]\]/epat=/(?>\[\[#([A-Za-z][-.:\w]*))\]\]/epat=/(?>\[\[([^|\]]*)\|\s*)(.*?)\s*\]\]((?:-?[[:alnum:]]+)*)/epat=/\[\[!(.*?)\]\]/epat=/(?>\[\[([^\]]+?)\s*-+>\s*)(.*?)\]\]((?:-?[[:alnum:]]+)*)/epat=/(?>\[\[\s*(.*?)\]\])((?:-?[[:alnum:]]+)*)/epat=/\bmailto:([^\s<>"{}|\\^`()[\]']*[^\s.,?!<>"{}|\\^`()[\]'])/epat=/\b(?>(http:|https:|mailto:|ftp:|news:|gopher:|nap:|file:|<:page>|AttachClip:|Attach:|PmWiki:|Cookbook:|Wiki:|UseMod:|Meatball:|Wikipedia:|PITS:|Path:))([^\s<>"{}|\\^`()[\]']+\.(?:gif|jpg|jpeg|png|GIF|JPG|JPEG|PNG))("([^"]*)")?/epat=/\b(?>(http:|https:|mailto:|ftp:|news:|gopher:|nap:|file:|<:page>|AttachClip:|Attach:|PmWiki:|Cookbook:|Wiki:|UseMod:|Meatball:|Wikipedia:|PITS:|Path:))[^\s<>"{}|\\^`()[\]']*[^\s.,?!<>"{}|\\^`()[\]']/epat=/\$([[:upper:]][[:alnum:]]*(?:[[:upper:]][[:lower:]0-9]|[[:lower:]0-9][[:upper:]])[[:alnum:]]*)\b/epat=/`(([[:upper:]][\w]*(?:-\w+)*([\/.]))?([[:upper:]][[:alnum:]]*(?:[[:upper:]][[:lower:]0-9]|[[:lower:]0-9][[:upper:]])[[:alnum:]]*))/epat=/\b([[:upper:]][\w]*(?:-\w+)*([\/.]))?([[:upper:]][[:alnum:]]*(?:[[:upper:]][[:lower:]0-9]|[[:lower:]0-9][[:upper:]])[[:alnum:]]*)/epat=/^\(:(table|cell|cellnr|tableend|div\d*(?:end)?)(\s.*?)?:\)/iepat=/^(\s+)/epat=/^((?>(\s+|%%|%[A-Za-z][-,=:#\w\s'".]*%)*)(\d+L))(\s*\|\s?)?(.*)$/epat=/^(!{1,6})\s?(.*)$/epat=/^\|\|.*\|\|.*$/epat=/^\|\|(.*)$/epat=/^(?=\s*\S)(<:([^>]+)>)?/epat=/(\d+L)/epat=/(\d.*?)/e

pat=/(^|\(:nl:\))\(:markup:\)[^\S ]*\[([=@])((?: `\.!+.*?)+)\2\]/seimpat=/\(:markup(\s+([^ ]*?))?:\)[^\S ]*\[([=@])(.*?)\3\]/seipat=/\(:markup(\s+([^ ]*?))?:\)[^\S ]* (.*?)\(:markupend:\)/seipat=/\(:source\s+(info|langs)\s*:\)/iepat=/\(:source(\s+.*?)?\s*:\)[^\S ]*\[([=@])(.*?)\2\]/seipat=/\(:code(\s+.*?)?\s*:\)[^\S ]*\[([=@])(.*?)\2\]/seipat=/\(:code(\s+.*?)?\s*:\)[^\S ]* (.*?)\(:codee?nd:\)/seipat=/\(:source(\s+.*?)?\s*:\)[^\S ]* (.*?)\(:sourcee?nd:\)/seipat=/^\(:closeall:\)$/epat=/( [^\S ]*)?\[([=@])(.*?)\2\]/sepat=/\$\[(?>([^\]]+))\]/epat=/\{\*\$/epat=/\{(!?[-\w.\/]*)(\$\w+)\}/epat=/\(:(if[^ ]*?):\)(.*?)(?=\(:if[^ ]*?:\)|$)/seipat=/\(:RSS\s*(.*?)\s*:\)/epat=/\(:redirect\s+(\S.*?):\)/eipat=/\(:include\s+(\S.*?):\)/eipat=/\(:nogroupfooter:\)/eipat=/\(:nogroupheader:\)/eipat=/\(:groupfooter:\)/eipat=/\(:groupheader:\)/eipat=/\[\^#([A-Za-z][-.:\w]*)\^\]/epat=/\[\[#([A-Za-z][-.:\w]*)\s*\|\s*#\]\]/epat=/\\(?>(\\*)) /epat=/\(:([#\*])?toc(?:-(float|hide))?(?:\s+anchors=(v)isible)?(?:\s+(.*?))?(?:\s+(Q))?:\)(.*)$/sepat=/^(?=%define=)((?:%%|%[A-Za-z][-,=:#\w\s'"().]*%)\s*)+$/epat=/\(:attachlist\s*(.*?):\)/eipat=/\(:searchresults(\s+.*?)?:\)/eipat=/\(:input\s+(\w+)(.*?):\)/eipat=/\(:varindex:\)/eipat=/\(:notitle:\)/eipat=/\(:(no)?spacewikiwords:\)/eipat=/\(:(no)?linebreaks:\)/eipat=/^\(:messages:\)/eipat=/\(:pagelist(\s+.*?)?:\)/eipat=/\(:searchbox(\s.*?)?:\)/epat=/\(:nofooter:\)/eipat=/\(:noright:\)/eipat=/\(:noaction:\)/eipat=/\(:noheader:\)/eipat=/\(:(no)?linkwikiwords:\)/eipat=/\(:nosidebar:\)/eipat=/\(:toc-page\s+(.*?)(?:\s+self=([01]))?:\)/epat=/\(:toc-back(?:\s+(.*?))?:\)/epat=/\(:no(action|tab)s?:\)/eipat=/\(:noleft:\)/eipat=/\(:description\s+(.+?):\)/eipat=/\(:title\s(.*?):\)/eipat=/\(:keywords?\s+(.+?):\)/eipat=/\[(([-+])+)(.*?)\1\]/epat=/<<\|([^|]+|\[\[(.+?)\]\])\|>>/epat=/^(!+|Q?:)#(#?)/epat=/\^\|([^|]+|\[\[(.+?)\]\])\|\^/epat=/\b([Mm]ini:)([^\s"\|\[\]]+)("([^"]*)")?/epat=/<\|([^|]+|\[\[(.+?)\]\])\|>/epat=/(?>\[\[([^|\]]+))\|\s*\+\s*]]/epat=/(?>\[\[([^|\]]+))\|\s*#\s*\]\]/epat=/\[\[##([A-Za-z][-.:\w]*)\]\]/epat=/(?>\[\[#([A-Za-z][-.:\w]*))\]\]/epat=/(?>\[\[([^|\]]*)\|\s*)(.*?)\s*\]\]((?:-?[[:alnum:]]+)*)/epat=/\[\[!(.*?)\]\]/epat=/(?>\[\[([^\]]+?)\s*-+>\s*)(.*?)\]\]((?:-?[[:alnum:]]+)*)/epat=/(?>\[\[\s*(.*?)\]\])((?:-?[[:alnum:]]+)*)/epat=/\bmailto:([^\s<>"{}|\\^`()[\]']*[^\s.,?!<>"{}|\\^`()[\]'])/epat=/\b(?>(http:|https:|mailto:|ftp:|news:|gopher:|nap:|file:|<:page>|AttachClip:|Attach:|PmWiki:|Cookbook:|Wiki:|UseMod:|Meatball:|Wikipedia:|PITS:|Path:))([^\s<>"{}|\\^`()[\]']+\.(?:gif|jpg|jpeg|png|GIF|JPG|JPEG|PNG))("([^"]*)")?/epat=/\b(?>(http:|https:|mailto:|ftp:|news:|gopher:|nap:|file:|<:page>|AttachClip:|Attach:|PmWiki:|Cookbook:|Wiki:|UseMod:|Meatball:|Wikipedia:|PITS:|Path:))[^\s<>"{}|\\^`()[\]']*[^\s.,?!<>"{}|\\^`()[\]']/epat=/\$([[:upper:]][[:alnum:]]*(?:[[:upper:]][[:lower:]0-9]|[[:lower:]0-9][[:upper:]])[[:alnum:]]*)\b/epat=/`(([[:upper:]][\w]*(?:-\w+)*([\/.]))?([[:upper:]][[:alnum:]]*(?:[[:upper:]][[:lower:]0-9]|[[:lower:]0-9][[:upper:]])[[:alnum:]]*))/epat=/\b([[:upper:]][\w]*(?:-\w+)*([\/.]))?([[:upper:]][[:alnum:]]*(?:[[:upper:]][[:lower:]0-9]|[[:lower:]0-9][[:upper:]])[[:alnum:]]*)/epat=/^\(:(table|cell|cellnr|tableend|div\d*(?:end)?)(\s.*?)?:\)/iepat=/^(\s+)/epat=/^((?>(\s+|%%|%[A-Za-z][-,=:#\w\s'".]*%)*)(\d+L))(\s*\|\s?)?(.*)$/epat=/^(!{1,6})\s?(.*)$/epat=/^\|\|.*\|\|.*$/epat=/^\|\|(.*)$/epat=/^(?=\s*\S)(<:([^>]+)>)?/epat=/(\d+L)/epat=/(\d.*?)/epat=/(^|\(:nl:\))\(:markup:\)[^\S ]*\[([=@])((?: `\.!+.*?)+)\2\]/seimpat=/\(:markup(\s+([^ ]*?))?:\)[^\S ]*\[([=@])(.*?)\3\]/seipat=/\(:markup(\s+([^ ]*?))?:\)[^\S ]* (.*?)\(:markupend:\)/seipat=/\(:source\s+(info|langs)\s*:\)/iepat=/\(:source(\s+.*?)?\s*:\)[^\S ]*\[([=@])(.*?)\2\]/seipat=/\(:code(\s+.*?)?\s*:\)[^\S ]*\[([=@])(.*?)\2\]/seipat=/\(:code(\s+.*?)?\s*:\)[^\S ]* (.*?)\(:codee?nd:\)/seipat=/\(:source(\s+.*?)?\s*:\)[^\S ]* (.*?)\(:sourcee?nd:\)/seipat=/^\(:closeall:\)$/epat=/( [^\S ]*)?\[([=@])(.*?)\2\]/sepat=/\$\[(?>([^\]]+))\]/epat=/\{\*\$/epat=/\{(!?[-\w.\/]*)(\$\w+)\}/epat=/\(:(if[^ ]*?):\)(.*?)(?=\(:if[^ ]*?:\)|$)/seipat=/\(:RSS\s*(.*?)\s*:\)/epat=/\(:redirect\s+(\S.*?):\)/eipat=/\(:include\s+(\S.*?):\)/eipat=/\(:nogroupfooter:\)/eipat=/\(:nogroupheader:\)/eipat=/\(:groupfooter:\)/eipat=/\(:groupheader:\)/eipat=/\[\^#([A-Za-z][-.:\w]*)\^\]/epat=/\[\[#([A-Za-z][-.:\w]*)\s*\|\s*#\]\]/epat=/\\(?>(\\*)) /epat=/\(:([#\*])?toc(?:-(float|hide))?(?:\s+anchors=(v)isible)?(?:\s+(.*?))?(?:\s+(Q))?:\)(.*)$/sepat=/^(?=%define=)((?:%%|%[A-Za-z][-,=:#\w\s'"().]*%)\s*)+$/epat=/\(:attachlist\s*(.*?):\)/eipat=/\(:searchresults(\s+.*?)?:\)/eipat=/\(:input\s+(\w+)(.*?):\)/eipat=/\(:varindex:\)/eipat=/\(:notitle:\)/eipat=/\(:(no)?spacewikiwords:\)/eipat=/\(:(no)?linebreaks:\)/eipat=/^\(:messages:\)/eipat=/\(:pagelist(\s+.*?)?:\)/eipat=/\(:searchbox(\s.*?)?:\)/epat=/\(:nofooter:\)/eipat=/\(:noright:\)/eipat=/\(:noaction:\)/eipat=/\(:noheader:\)/eipat=/\(:(no)?linkwikiwords:\)/eipat=/\(:nosidebar:\)/eipat=/\(:toc-page\s+(.*?)(?:\s+self=([01]))?:\)/epat=/\(:toc-back(?:\s+(.*?))?:\)/epat=/\(:no(action|tab)s?:\)/eipat=/\(:noleft:\)/eipat=/\(:description\s+(.+?):\)/eipat=/\(:title\s(.*?):\)/eipat=/\(:keywords?\s+(.+?):\)/eipat=/\[(([-+])+)(.*?)\1\]/epat=/<<\|([^|]+|\[\[(.+?)\]\])\|>>/epat=/^(!+|Q?:)#(#?)/epat=/\^\|([^|]+|\[\[(.+?)\]\])\|\^/epat=/\b([Mm]ini:)([^\s"\|\[\]]+)("([^"]*)")?/epat=/<\|([^|]+|\[\[(.+?)\]\])\|>/epat=/(?>\[\[([^|\]]+))\|\s*\+\s*]]/epat=/(?>\[\[([^|\]]+))\|\s*#\s*\]\]/epat=/\[\[##([A-Za-z][-.:\w]*)\]\]/epat=/(?>\[\[#([A-Za-z][-.:\w]*))\]\]/epat=/(?>\[\[([^|\]]*)\|\s*)(.*?)\s*\]\]((?:-?[[:alnum:]]+)*)/epat=/\[\[!(.*?)\]\]/epat=/(?>\[\[([^\]]+?)\s*-+>\s*)(.*?)\]\]((?:-?[[:alnum:]]+)*)/epat=/(?>\[\[\s*(.*?)\]\])((?:-?[[:alnum:]]+)*)/epat=/\bmailto:([^\s<>"{}|\\^`()[\]']*[^\s.,?!<>"{}|\\^`()[\]'])/epat=/\b(?>(http:|https:|mailto:|ftp:|news:|gopher:|nap:|file:|<:page>|AttachClip:|Attach:|PmWiki:|Cookbook:|Wiki:|UseMod:|Meatball:|Wikipedia:|PITS:|Path:))([^\s<>"{}|\\^`()[\]']+\.(?:gif|jpg|jpeg|png|GIF|JPG|JPEG|PNG))("([^"]*)")?/epat=/\b(?>(http:|https:|mailto:|ftp:|news:|gopher:|nap:|file:|<:page>|AttachClip:|Attach:|PmWiki:|Cookbook:|Wiki:|UseMod:|Meatball:|Wikipedia:|PITS:|Path:))[^\s<>"{}|\\^`()[\]']*[^\s.,?!<>"{}|\\^`()[\]']/epat=/\$([[:upper:]][[:alnum:]]*(?:[[:upper:]][[:lower:]0-9]|[[:lower:]0-9][[:upper:]])[[:alnum:]]*)\b/epat=/`(([[:upper:]][\w]*(?:-\w+)*([\/.]))?([[:upper:]][[:alnum:]]*(?:[[:upper:]][[:lower:]0-9]|[[:lower:]0-9][[:upper:]])[[:alnum:]]*))/epat=/\b([[:upper:]][\w]*(?:-\w+)*([\/.]))?([[:upper:]][[:alnum:]]*(?:[[:upper:]][[:lower:]0-9]|[[:lower:]0-9][[:upper:]])[[:alnum:]]*)/epat=/^\(:(table|cell|cellnr|tableend|div\d*(?:end)?)(\s.*?)?:\)/iepat=/^(\s+)/epat=/^((?>(\s+|%%|%[A-Za-z][-,=:#\w\s'".]*%)*)(\d+L))(\s*\|\s?)?(.*)$/epat=/^(!{1,6})\s?(.*)$/epat=/^\|\|.*\|\|.*$/epat=/^\|\|(.*)$/epat=/^(?=\s*\S)(<:([^>]+)>)?/epat=/(\d+L)/epat=/(\d.*?)/eMiles Framework

Historique de Main.Miles

Cacher les modifications mineures - Affichage de la sortie

21 juillet 2009 à 14h53 par 93.121.200.89 -
Ligne 12 ajoutée:
>>teal background-color:white border:'1px solid black'<<
Lignes 16-18 modifiées:

----
en:
>><<

21 juillet 2009 à 14h51 par 93.121.200.89 -
Lignes 12-15 modifiées:
[[http://dreamshield.developpez.com/miles/milesbin.zip|Framework Miles (Binaire uniquement)]] (archive .zip)
[[http://dreamshield.codeplex.com/SourceControl/ListDownloadableCommits.aspx#DownloadLatest|Framework Miles (Source uniquement)]] (via [[http://dreamshield.codeplex.com|CodePlex]])
[[http://dreamshield.developpez.com/miles/documentation.zip|Documentation]] (archive .zip, documentation au format [[http://fr.wikipedia.org/wiki/Microsoft_Compressed_HTML|CHM]])
en:
* [[http://dreamshield.developpez.com/miles/milesbin.zip|Framework Miles (Binaire uniquement)]] (archive .zip)
* [[http://dreamshield.codeplex.com/SourceControl/ListDownloadableCommits.aspx#DownloadLatest|Framework Miles (Source uniquement)]] (via [[http://dreamshield.codeplex.com|CodePlex]])
* [[http://dreamshield.developpez.com/miles/documentation.zip|Documentation]] (archive .zip, documentation au format [[http://fr.wikipedia.org/wiki/Microsoft_Compressed_HTML|CHM]])

----
21 juillet 2009 à 14h50 par 93.121.200.89 -
Lignes 10-12 modifiées:
Le Framework Miles est disponible dans un téléchargement séparé pour DreamShield. Le téléchargement contient également le code source de Miles. Utilisez les liens ci-dessous pour vous le procurer :

[[http://dreamshield.developpez.com/miles/miles.zip|Framework Miles]] (archive .zip)
en:
Le Framework Miles est disponible dans un téléchargement séparé pour DreamShield.

[[http://dreamshield.developpez.com/miles/milesbin.zip|Framework Miles (Binaire uniquement)]] (archive .zip)
[[http://dreamshield.codeplex.com/SourceControl/ListDownloadableCommits.aspx#DownloadLatest|Framework Miles (Source uniquement)]] (via [[http://dreamshield.codeplex.com|CodePlex]])
29 juin 2009 à 16h47 par 89.156.65.200 -
Ligne 292 ajoutée:
----
22 avril 2009 à 02h16 par 93.121.200.89 -
Lignes 4-5 modifiées:
>>frame font-size=smaller width=400px<<
en:

>>frame font-size=larger width=400px<<
19 avril 2009 à 17h00 par 93.121.200.89 -
Ligne 27 ajoutée:
%rframe width=300px% [[(Attach:)miles-plugin.jpg | Attach:miles-plugin.jpg]] | Incorporation du plugin à l'installation
Lignes 30-31 modifiées:
[[Mini:miles-plugin.jpg]]
en:
19 avril 2009 à 16h59 par 93.121.200.89 -
Lignes 4-11 modifiées:
>>rframe font-size=smaller clear=right<<
!! Sommaire
* [[#downloadanduse | Téléchargement et utilisation]]
* [[#plugin_base | Création du plugin]]
* [[#custom_pages | Pages personnalisées]]
** [[#fully_customized_page | Page personnalisée]]
** [[#check_serial | Vérification d'une clef de produit]]
** [[#splash_setup | Image au démarrage de l'installation]]
en:
>>frame font-size=smaller width=400px<<
(:toc:)
Ligne 8 modifiée:
!! Téléchargement et utilisation [[#downloadanduse]]
en:
! Téléchargement et utilisation [[#downloadanduse]]
Ligne 31 modifiée:
!! Création du plugin [[#plugin_base]]
en:
! Création du plugin [[#plugin_base]]
Lignes 65-66 modifiées:
!! Pages personnalisées [[#custom_pages]]
en:
! Pages personnalisées [[#custom_pages]]
Ligne 69 modifiée:
!!! Page personnalisée [[#fully_customized_page]]
en:
!! Page personnalisée [[#fully_customized_page]]
Ligne 158 modifiée:
!!! Vérification d'une clef de produit [[#check_serial]]
en:
!! Vérification d'une clef de produit [[#check_serial]]
Ligne 240 modifiée:
!!! Image au démarrage de l'installation [[#splash_setup]]
en:
!! Image au démarrage de l'installation [[#splash_setup]]
16 mars 2009 à 23h57 par 93.121.200.89 -
Ligne 166 modifiée:
%rframe width=300px% Attach:check_serial.jpg | Page de vérification
en:
[[Mini:check_serial.jpg]]
Ligne 248 modifiée:
%rframe width=300px% Attach:splash_begin.jpg | Page de démarrage
en:
[[Mini:splash_begin.jpg]]
16 mars 2009 à 23h56 par 93.121.200.89 -
Ligne 166 modifiée:
[[Mini:check_serial.jpg]]
en:
%rframe width=300px% Attach:check_serial.jpg | Page de vérification
Ligne 248 modifiée:
[[Mini:splash_begin.jpg]]
en:
%rframe width=300px% Attach:splash_begin.jpg | Page de démarrage
11 mars 2009 à 14h44 par 93.121.200.89 -
Lignes 69-70 modifiées:
en:
Le code devra ensuite être complété en fonction de vos besoins. Les différents modules disponibles sont décrits dans les sections suivantes.
11 mars 2009 à 14h43 par 93.121.200.89 -
Lignes 294-295 modifiées:
en:
''note:'' Vous pouvez bien sur rajouter plusieurs plugins en rajoutant les autres à la suite de la fonction '''OnServerInitialized'''.
11 mars 2009 à 14h42 par 93.121.200.89 -
Ligne 136 modifiée:
public class UserPlugin : MilesRoot
en:
public class MyPlugin : MilesRoot
Ligne 226 modifiée:
public class UserPlugin : MilesRoot
en:
public class MyPlugin : MilesRoot
Lignes 247-294 modifiées:
en:
[[Mini:splash_begin.jpg]]
Pour cela il vous suffit d'aller dans la classe '''MyPlugin''' et d'y rajouter la fonction suivante :
(:source lang=csharp:)[@
public virtual void RegisterSplash()
{
/* il faut charger votre image à partir des ressources de votre assembly, ou via n'importe quel autre moyen compatible */
System.Drawing.Bitmap image = new System.Drawing.Bitmap(GetType().Assembly.GetManifestResourceStream("MilesCustomPage.3ds_max_concept_car.jpg"));
PageSetupSplash sp = new PageSetupSplash(Server,image);
Server.RegisterPlugin(sp.Plugin);
}
@]
Il vous suffit ensuite d'enregistrer votre plugin dans '''MyPlugin'''. Le code complet sera le suivant :
(:source lang=csharp:)[@
using System;
using DreamShield.Extentions;
using DreamShield.Deployment.Installers.DreamPlugins;
using DreamShield.Deployment.Miles;
using DreamShield.Deployment.Miles.CustomPage;
using DreamShield.Deployment.Miles.IO;
using System.IO;
using System.Xml;
using DreamShield.Deployment.Miles.CustomPage.StandardPages;

namespace MilesCustomPage
{
/// <summary>
/// Description of UserPlugin.
/// </summary>
[Extention(BaseDreamPluginContainer.DreamPluginExtentionGuid, "{77B51474-B088-4d40-ACD3-9B2F6450C466}")]
public class MyPlugin : MilesRoot
{
protected override void OnServerInitialized()
{
base.OnServerInitialized();

RegisterSplash();
}

public virtual void RegisterSplash()
{
System.Drawing.Bitmap image = new System.Drawing.Bitmap(GetType().Assembly.GetManifestResourceStream("MilesCustomPage.3ds_max_concept_car.jpg"));
PageSetupSplash sp = new PageSetupSplash(Server,image);
Server.RegisterPlugin(sp.Plugin);
}
}
}
@]
11 mars 2009 à 14h36 par 93.121.200.89 -
Ligne 11 ajoutée:
** [[#splash_setup | Image au démarrage de l'installation]]
Lignes 245-247 ajoutées:
!!! Image au démarrage de l'installation [[#splash_setup]]
Il est possible d'afficher une image comme première page de l'installation, avant la page par défaut d'acceuil.
11 mars 2009 à 14h11 par 93.121.200.89 -
Lignes 78-79 modifiées:
(:source lang=csharp:)
[@
en:
(:source lang=csharp:) [@
Lignes 82-83 modifiées:
(:source lang=csharp:)
[@
en:
(:source lang=csharp:) [@
Lignes 89-90 modifiées:
(:source lang=csharp:)
[@
en:
(:source lang=csharp:) [@
Lignes 121-122 modifiées:
(:source lang=csharp:)
[@
en:
(:source lang=csharp:) [@
11 mars 2009 à 14h10 par 93.121.200.89 -
11 mars 2009 à 14h08 par 93.121.200.89 -
Ligne 9 ajoutée:
** [[#fully_customized_page | Page personnalisée]]
Lignes 73-88 modifiées:
!!! Vérification d'une clef de produit [[#check_serial]]
Création d'une page personnalisées qui demande à l'utilisateur pendant l'installation de rentrer une clef de produit.
[[Mini:check_serial.jpg]]
'''Première étape''' : Créer une classe qui va remplir la fonction de "vérificateur de licence". Cette classe aura pour fonction de valider la clef rentrée par l'utilisateur, autorisant ou non l'installation à se poursuivre.
(:source lang=csharp:) [@
using System;
using DreamShield.Deployment.Miles.CustomPage.StandardPages;

namespace MilesCustomPage
{
/// <summary>
/// Description of SerialVerificationClass.
/// </summary>
public class SerialVerificationClass : PageVerifySerialNumber.IPageVerifySerialNumber_Validator
{
public SerialVerificationClass()
en:
!!! Page personnalisée [[#fully_customized_page]]
Création d'une page entièrement personnalisée.
La création d'une page entièrement personnalisée avec Miles est aussi simple que de créer un nouveau contrôle utilisateur (UserControl) à l'aide du Framework .NET.
Pour créer une page personnalisée, vous devez donc créer un nouveau contrôle personnalisé (dans notre exemple il sera nommé '''UserControl1''') dans votre assembly d'extension. (Par défaut les pages de l'assistant d'installation DreamShield ont une taille de 488x283 et un fond transparent pour s'intégrer au skin. Il est donc préférable de respecter ces paramètres).
Dans votre contrôle personnalisé, rajoutez un using vers le namespace ''DreamShield.Deployment.Miles.CustomPage'' puis rajoutez un champ comme suit :
(:source lang=csharp:)
[@
public CustomPagePlugin PagePlugin = null;
@]
Ce champ permettra de communiquer avec les autres plugins si nécessaire. Par exemple, pour définir une variable globale qui sera utilisée par tous les autres plugins (et échanger simplement des informations entre plusieurs plugins personnalisés), vous procéderez comme suit :
(:source lang=csharp:)
[@
PagePlugin.GlobalInstallerVariables["myvalue"] = textBox1.Text;
...
string myvalue = PagePlugin.GlobalInstallerVariables["myvalue"] as string;
@]

Ensuite, dans la classe '''MyPlugin''' rajoutez une fonction '''RegisterCustomPage''' comme suit :
(:source lang=csharp:)
[@
public virtual void RegisterCustomPage()
Lignes 95-120 ajoutées:
/* création de la page personnalisée */
UserControl1 customPage = new UserControl1();
/* création du plugin de page personnalisée */
CustomPagePlugin plugin = new CustomPagePlugin(
/* premier argument invariant */
Server,
/* position où rajouter la page. Les valeurs de l'énumération WizardPagesId contiennent
* toutes les pages par défaut. Ici, la page personnalisée est rajoutée à la position de la page de
* de sélection du mode d'installation (Installation personnalisée ou standard) */
WizardPagesID.InstallationModePage,
/* false : indique que la page doit être rajoutée avant la position définie précédemment
* true : la page aurait été rajoutée après la position */
false,
/* id de la page, peut être laissé vide */
"",
/* page personnalisée */
customPage);
/* Il est possible de définir quelles actions seront possibles à partir de la page personnalisée, ie.
* Précédent - Suivant - Annuler. Ici, on désactive la possibilité d'annuler sur cette page.
* les propriétés et méthodes de plugin offrent tout un panel de personnalisations et d'évènements
* accessibles pour une page de l'assistant */
plugin.CanCancel = false;
/* définition du plugin, ainsi il sera accessible via la page personnalisée */
customPage.PagePlugin = plugin;
/* enregistrement du plugin */
Server.RegisterPlugin(customPage.PagePlugin);
Lignes 121-137 supprimées:

public bool CanContinueWithSerial(string serial)
{
return serial == "serial";
/* le serial dans cet exemple est "serial".
* c'est ici qu'il faut donc vérifier la clef rentrée par l'utilisateur et renvoyer true
* si la clef est valide, false sinon
*/
}

public void SerialAccepted(string serial)
{
/* l'installeur appelle cette fonction lorsque la clef rentrée par l'utilisateur a été validée
* et que la page suivante est affichée */
}
}
}
Lignes 123-139 modifiées:
Bien sur, la vérification de la clef est ici très basique, mais il vous est possible d'implémenter votre propre algorithme dans la fonction '''CanContinueWithSerial'''.
'''Attention''' : comme toute méthode de protection, celle ci n'est pas infaillible mais peut rebuter les utilisateurs de bases qui souhaiteraient utiliser le programme sans clef.

'''Deuxième étape''' : enregistrer la page dans votre plugin Miles. Pour cela, retournez dans la classe '''MyPlugin''' et rajoutez la ligne suivante à la fin de la fonction '''OnServerInitialized''' :
(:source lang=csharp:) [@
RegisterSerialPage();
@]
Et ensuite, rajoutez à la classe MyPlugin la fonction suivante :
(:source lang=csharp:) [@
public virtual void RegisterSerialPage()
{
PageVerifySerialNumber pg = new PageVerifySerialNumber(Server, new SerialVerificationClass());
Server.RegisterPlugin(pg.Plugin);
}
@]
La classe MyPlugin aura donc le code suivant :
(:source lang=csharp:) [@
en:
Le code complet de MyPlugin sera alors le suivant :
(:source lang=csharp:)
[@
Lignes 137-139 supprimées:
/// <summary>
/// Description of UserPlugin.
/// </summary>
Ligne 145 modifiée:
RegisterSerialPage();
en:
RegisterCustomPage();
Ligne 148 modifiée:
public virtual void RegisterSerialPage()
en:
public virtual void RegisterCustomPage()
Lignes 150-151 modifiées:
PageVerifySerialNumber pg = new PageVerifySerialNumber(Server, new SerialVerificationClass());
Server.RegisterPlugin(pg.Plugin);
en:
UserControl1 customPage = new UserControl1();
CustomPagePlugin plugin = new CustomPagePlugin(
Server,
WizardPagesID.InstallationModePage,
false,
"",
customPage);
plugin.CanCancel = false;
customPage.PagePlugin = plugin;
Server.RegisterPlugin(customPage.PagePlugin);
Lignes 164-248 modifiées:
''note:'' Vous pouvez bien sur rajouter plusieurs plugins en rajoutant les autres à la suite de la fonction '''OnServerInitialized'''.
en:
''note:'' Vous pouvez bien sur rajouter plusieurs plugins en rajoutant les autres à la suite de la fonction '''OnServerInitialized'''.

!!! Vérification d'une clef de produit [[#check_serial]]
Création d'une page personnalisées qui demande à l'utilisateur pendant l'installation de rentrer une clef de produit.
[[Mini:check_serial.jpg]]
'''Première étape''' : Créer une classe qui va remplir la fonction de "vérificateur de licence". Cette classe aura pour fonction de valider la clef rentrée par l'utilisateur, autorisant ou non l'installation à se poursuivre.
(:source lang=csharp:) [@
using System;
using DreamShield.Deployment.Miles.CustomPage.StandardPages;

namespace MilesCustomPage
{
public class SerialVerificationClass : PageVerifySerialNumber.IPageVerifySerialNumber_Validator
{
public SerialVerificationClass()
{
}

public bool CanContinueWithSerial(string serial)
{
return serial == "serial";
/* le serial dans cet exemple est "serial".
* c'est ici qu'il faut donc vérifier la clef rentrée par l'utilisateur et renvoyer true
* si la clef est valide, false sinon
*/
}

public void SerialAccepted(string serial)
{
/* l'installeur appelle cette fonction lorsque la clef rentrée par l'utilisateur a été validée
* et que la page suivante est affichée */
}
}
}
@]
Bien sur, la vérification de la clef est ici très basique, mais il vous est possible d'implémenter votre propre algorithme dans la fonction '''CanContinueWithSerial'''.
'''Attention''' : comme toute méthode de protection, celle ci n'est pas infaillible mais peut rebuter les utilisateurs de bases qui souhaiteraient utiliser le programme sans clef.

'''Deuxième étape''' : enregistrer la page dans votre plugin Miles. Pour cela, retournez dans la classe '''MyPlugin''' et rajoutez la ligne suivante à la fin de la fonction '''OnServerInitialized''' :
(:source lang=csharp:) [@
RegisterSerialPage();
@]
Et ensuite, rajoutez à la classe MyPlugin la fonction suivante :
(:source lang=csharp:) [@
public virtual void RegisterSerialPage()
{
PageVerifySerialNumber pg = new PageVerifySerialNumber(Server, new SerialVerificationClass());
Server.RegisterPlugin(pg.Plugin);
}
@]
La classe MyPlugin aura donc le code suivant :
(:source lang=csharp:) [@
using System;
using DreamShield.Extentions;
using DreamShield.Deployment.Installers.DreamPlugins;
using DreamShield.Deployment.Miles;
using DreamShield.Deployment.Miles.CustomPage;
using DreamShield.Deployment.Miles.IO;
using System.IO;
using System.Xml;
using DreamShield.Deployment.Miles.CustomPage.StandardPages;

namespace MilesCustomPage
{
[Extention(BaseDreamPluginContainer.DreamPluginExtentionGuid, "{77B51474-B088-4d40-ACD3-9B2F6450C466}")]
public class UserPlugin : MilesRoot
{
protected override void OnServerInitialized()
{
base.OnServerInitialized();

RegisterSerialPage();
}

public virtual void RegisterSerialPage()
{
PageVerifySerialNumber pg = new PageVerifySerialNumber(Server, new SerialVerificationClass());
Server.RegisterPlugin(pg.Plugin);
}
}
}
@]
''note:'' Vous pouvez bien sur rajouter plusieurs plugins en rajoutant les autres à la suite de la fonction '''OnServerInitialized'''.

Catégorie : [[!Tutoriaux]], [[!Miles]]
11 mars 2009 à 13h41 par 93.121.200.89 -
Ligne 56 modifiée:
public class UserPlugin : MilesRoot /* MilesRoot : classe qui permet de connecter les plugins Miles à l'installation */
en:
public class MyPlugin : MilesRoot /* MilesRoot : classe qui permet de connecter les plugins Miles à l'installation */
Lignes 74-158 ajoutées:
[[Mini:check_serial.jpg]]
'''Première étape''' : Créer une classe qui va remplir la fonction de "vérificateur de licence". Cette classe aura pour fonction de valider la clef rentrée par l'utilisateur, autorisant ou non l'installation à se poursuivre.
(:source lang=csharp:) [@
using System;
using DreamShield.Deployment.Miles.CustomPage.StandardPages;

namespace MilesCustomPage
{
/// <summary>
/// Description of SerialVerificationClass.
/// </summary>
public class SerialVerificationClass : PageVerifySerialNumber.IPageVerifySerialNumber_Validator
{
public SerialVerificationClass()
{
}

public bool CanContinueWithSerial(string serial)
{
return serial == "serial";
/* le serial dans cet exemple est "serial".
* c'est ici qu'il faut donc vérifier la clef rentrée par l'utilisateur et renvoyer true
* si la clef est valide, false sinon
*/
}

public void SerialAccepted(string serial)
{
/* l'installeur appelle cette fonction lorsque la clef rentrée par l'utilisateur a été validée
* et que la page suivante est affichée */
}
}
}
@]
Bien sur, la vérification de la clef est ici très basique, mais il vous est possible d'implémenter votre propre algorithme dans la fonction '''CanContinueWithSerial'''.
'''Attention''' : comme toute méthode de protection, celle ci n'est pas infaillible mais peut rebuter les utilisateurs de bases qui souhaiteraient utiliser le programme sans clef.

'''Deuxième étape''' : enregistrer la page dans votre plugin Miles. Pour cela, retournez dans la classe '''MyPlugin''' et rajoutez la ligne suivante à la fin de la fonction '''OnServerInitialized''' :
(:source lang=csharp:) [@
RegisterSerialPage();
@]
Et ensuite, rajoutez à la classe MyPlugin la fonction suivante :
(:source lang=csharp:) [@
public virtual void RegisterSerialPage()
{
PageVerifySerialNumber pg = new PageVerifySerialNumber(Server, new SerialVerificationClass());
Server.RegisterPlugin(pg.Plugin);
}
@]
La classe MyPlugin aura donc le code suivant :
(:source lang=csharp:) [@
using System;
using DreamShield.Extentions;
using DreamShield.Deployment.Installers.DreamPlugins;
using DreamShield.Deployment.Miles;
using DreamShield.Deployment.Miles.CustomPage;
using DreamShield.Deployment.Miles.IO;
using System.IO;
using System.Xml;
using DreamShield.Deployment.Miles.CustomPage.StandardPages;

namespace MilesCustomPage
{
/// <summary>
/// Description of UserPlugin.
/// </summary>
[Extention(BaseDreamPluginContainer.DreamPluginExtentionGuid, "{77B51474-B088-4d40-ACD3-9B2F6450C466}")]
public class UserPlugin : MilesRoot
{
protected override void OnServerInitialized()
{
base.OnServerInitialized();

RegisterSerialPage();
}

public virtual void RegisterSerialPage()
{
PageVerifySerialNumber pg = new PageVerifySerialNumber(Server, new SerialVerificationClass());
Server.RegisterPlugin(pg.Plugin);
}
}
}
@]
''note:'' Vous pouvez bien sur rajouter plusieurs plugins en rajoutant les autres à la suite de la fonction '''OnServerInitialized'''.
11 mars 2009 à 13h33 par 93.121.200.89 -
Lignes 8-9 modifiées:
* [[#perso | Personnalisation]]
* [[#launch | Distribution de l'installation]]
en:
* [[#custom_pages | Pages personnalisées]]
** [[#check_serial | Vérification d'une clef de produit]]
Lignes 66-73 modifiées:
@]
en:
@]

!! Pages personnalisées [[#custom_pages]]

Un point important de Miles est la création de pages personnalisées pour DreamShield. Il existe des pages préconçues pour remplir certaines fonctions, bien qu'il soit possible de créer n'importe quel type de page.

!!! Vérification d'une clef de produit [[#check_serial]]
Création d'une page personnalisées qui demande à l'utilisateur pendant l'installation de rentrer une clef de produit.
11 mars 2009 à 13h24 par 93.121.200.89 -
Ligne 38 modifiée:
[@
en:
(:source lang=csharp:) [@
11 mars 2009 à 13h13 par 93.121.200.89 -
Ligne 7 modifiée:
* [[#compile | Compilation du projet]]
en:
* [[#plugin_base | Création du plugin]]
Lignes 33-66 modifiées:
[[Mini:miles-plugin.jpg]]
en:
[[Mini:miles-plugin.jpg]]

!! Création du plugin [[#plugin_base]]
Maintenant que vous avez une bibliothèque de classes prête à personnaliser l'installation, il faut créer le plugin qui va s'intégrer à DreamShield (via Miles).
Pour cela, créez une nouvelle classe '''MyPlugin''' que vous compléterez ainsi :
[@
using System;
using DreamShield.Extentions;
using DreamShield.Deployment.Installers.DreamPlugins;
using DreamShield.Deployment.Miles;
using System.IO;
using System.Xml;

namespace MilesCustomPage
{
/// <summary>
/// Description of UserPlugin.
/// </summary>
[Extention(BaseDreamPluginContainer.DreamPluginExtentionGuid,
"{77B51474-B088-4d40-ACD3-9B2F6450C466}")
/* Le guid précédent doit être unique. Plusieurs outils existent pour créer des GUIDs uniques ...
* Il servira à l'installeur afin d'identifier de manière unique votre plugin */
]
public class UserPlugin : MilesRoot /* MilesRoot : classe qui permet de connecter les plugins Miles à l'installation */
{
protected override void OnServerInitialized()
{
base.OnServerInitialized();

/* Ici, il faudra rajouter les différents plugins que l'on veut connecter à DreamShield */
}
}
}
@]
11 mars 2009 à 13h08 par 93.121.200.89 -
Ligne 33 modifiée:
Attach:miles-plugin.jpg
en:
[[Mini:miles-plugin.jpg]]
11 mars 2009 à 13h08 par 93.121.200.89 -
Lignes 32-33 modifiées:
Ensuite, comme Assembly principale naviguez vers votre assembly fraichement crée et dans la liste juste en dessous, faites un clique droit puis "Ajouter une assembly managée" et là rajoutez l'assembly DreamShield.Deployment.Miles.dll. Et votre installation sera alors prête. Il ne reste plus qu'à créer les plugins ...
en:
Ensuite, comme Assembly principale naviguez vers votre assembly fraichement crée et dans la liste juste en dessous, faites un clique droit puis "Ajouter une assembly managée" et là rajoutez l'assembly DreamShield.Deployment.Miles.dll. Et votre installation sera alors prête. Il ne reste plus qu'à créer les plugins ...
Attach:miles-plugin.jpg
11 mars 2009 à 13h03 par 93.121.200.89 -
Ligne 14 ajoutée:
Ligne 17 ajoutée:
11 mars 2009 à 13h01 par 93.121.200.89 -
Lignes 20-21 modifiées:
-> Cette référence doit être copiée dans le dossier de sortie de votre assembly
-<
en:
Cette référence doit être copiée dans le dossier de sortie de votre assembly
Lignes 27-28 modifiées:
-> Ces références sont présentes dans le dossier d'installation de DreamShield mais '''ne doivent pas''' être copiées dans le dossier de sortie de votre assembly. (Elles constitue le runtime DreamShield qui sera automatiquement chargé par l'installeur).
-<
en:
Ces références sont présentes dans le dossier d'installation de DreamShield mais '''ne doivent pas''' être copiées dans le dossier de sortie de votre assembly. (Elles constitue le runtime DreamShield qui sera automatiquement chargé par l'installeur).
11 mars 2009 à 13h00 par 93.121.200.89 -
Ligne 21 ajoutée:
-<
Ligne 29 modifiée:
en:
-<
11 mars 2009 à 13h00 par 93.121.200.89 -
Ligne 20 supprimée:
<-
Ligne 28 modifiée:
<-
en:
11 mars 2009 à 12h59 par 93.121.200.89 -
Lignes 1-31 ajoutées:
(:title Miles Framework:)

Le Framework Miles est une librairie open-source qui permet de créer des extensions telles que des pages personnalisées pour les installations DreamShield. Au fil du temps il sera enrichit de différentes manières afin de proposer un moyen simple de personnaliser n'importe quel aspect des installations.
>>rframe font-size=smaller clear=right<<
!! Sommaire
* [[#downloadanduse | Téléchargement et utilisation]]
* [[#compile | Compilation du projet]]
* [[#perso | Personnalisation]]
* [[#launch | Distribution de l'installation]]
>><<

!! Téléchargement et utilisation [[#downloadanduse]]
Le Framework Miles est disponible dans un téléchargement séparé pour DreamShield. Le téléchargement contient également le code source de Miles. Utilisez les liens ci-dessous pour vous le procurer :
[[http://dreamshield.developpez.com/miles/miles.zip|Framework Miles]] (archive .zip)
[[http://dreamshield.developpez.com/miles/documentation.zip|Documentation]] (archive .zip, documentation au format [[http://fr.wikipedia.org/wiki/Microsoft_Compressed_HTML|CHM]])
Les premières étapes lors de la création d'un plugin basé sur Miles pour étendre une installation seront, après avoir [[Tutoriaux/MiseEnRouteRapide | crée un projet d'installation]], de procéder comme suit :
* Créer une nouvelle bibliothèque de classes avec un langage supporté par le framework .NET (C#,VB.Net,Delphi.Net,etc.)
* Rajouter les références suivantes au projet
** DreamShield.Deployment.Miles.dll (présent dans l'archive .zip de Miles)
-> Cette référence doit être copiée dans le dossier de sortie de votre assembly
<-
** DreamShield.Data.dll
** DreamShield.Deployment.dll
** DreamShield.Extentions.dll
** DreamShield.IO.Utils.dll
** DreamShield.Luna.dll
** DreamShield.Windows.Themes.dll
-> Ces références sont présentes dans le dossier d'installation de DreamShield mais '''ne doivent pas''' être copiées dans le dossier de sortie de votre assembly. (Elles constitue le runtime DreamShield qui sera automatiquement chargé par l'installeur).
<-
Après avoir créé vos éléments (ces tâches seront décrites dans les points suivants), vous pourrez alors compiler votre assembly. Ensuite, dans votre projet d'installation, vous devrez rajouter votre plugin. Pour se faire allez dans l'exploration de projet, rubrique "Assemblies d'installation et plugins". Sous extentions faites un click droit puis "Nouvelle extention d'installation" et donnez lui un nom.
Ensuite, comme Assembly principale naviguez vers votre assembly fraichement crée et dans la liste juste en dessous, faites un clique droit puis "Ajouter une assembly managée" et là rajoutez l'assembly DreamShield.Deployment.Miles.dll. Et votre installation sera alors prête. Il ne reste plus qu'à créer les plugins ...