From 43400208e5301c0cfc763ea1b1a7dddb79c72802 Mon Sep 17 00:00:00 2001 From: oceangoing <1821478380@qq.com> Date: Tue, 4 Apr 2023 16:38:44 +0800 Subject: [PATCH] =?UTF-8?q?style:=20=E6=A0=BC=E5=BC=8F=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .codeStyle/eclipse-codestyle.xml | 1196 +- .editorconfig | 19 + README.md | 12 +- db/lenos-mysql5.7.35.sql | 2504 ++- db/lenos-oracle.sql | 2504 ++- len-activiti/pom.xml | 156 +- .../com/len/actlistener/ActNodeListener.java | 39 +- .../len/actlistener/ActStartNodeListener.java | 16 +- .../len/actlistener/LeaveListenerImpl.java | 16 +- .../com/len/actlistener/ListenUserRole.java | 282 +- .../com/len/config/ActPropertiesConfig.java | 25 +- .../java/com/len/config/ActivitiConfig.java | 177 +- .../len/controller/ActivitiController.java | 760 +- .../len/controller/UserLeaveController.java | 967 +- .../main/java/com/len/entity/ActAssignee.java | 288 +- .../java/com/len/entity/ActDeployment.java | 33 +- .../main/java/com/len/entity/ActModel.java | 59 +- .../main/java/com/len/entity/BaseTask.java | 377 +- .../java/com/len/entity/LeaveOpinion.java | 32 +- .../com/len/entity/ProcessDefinition.java | 61 +- .../src/main/java/com/len/entity/Task.java | 53 +- .../main/java/com/len/entity/UserLeave.java | 198 +- .../com/len/mapper/ActAssigneeMapper.java | 4 +- .../com/len/service/ActAssigneeService.java | 6 +- .../com/len/service/UserLeaveService.java | 2 +- .../service/impl/ActAssigneeServiceImpl.java | 60 +- .../service/impl/UserLeaveServiceImpl.java | 14 +- .../java/com/len/util/AnimatedGifEncoder.java | 2435 ++- .../main/java/com/len/util/AssigneeType.java | 8 +- .../main/java/com/len/util/Base64Utils.java | 33 +- .../activiti/FilterServletOutputStream.java | 46 +- .../org/activiti/GenericResponseWrapper.java | 82 +- .../org/activiti/JsonpCallbackFilter.java | 75 +- .../image/HMProcessDiagramGenerator.java | 114 +- .../impl/DefaultProcessDiagramCanvas.java | 2581 ++- .../impl/DefaultProcessDiagramGenerator.java | 2176 +- .../org/activiti/rest/ActivitiService.java | 325 +- ...rocessDefinitionDiagramLayoutResource.java | 993 +- ...rocessDefinitionDiagramLayoutResource.java | 14 +- .../ProcessInstanceDiagramLayoutResource.java | 12 +- .../ProcessInstanceHighlightsResource.java | 504 +- .../editor/main/StencilsetRestResource.java | 29 +- .../model/ModelEditorJsonRestResource.java | 140 +- .../editor/model/ModelSaveRestResource.java | 198 +- .../activiti/rest/model/ActivitiProcess.java | 24 +- len-activiti/src/main/resources/bpmn/demo.xml | 350 +- .../resources/ftl/act/activiti/shinePics.html | 182 +- .../resources/ftl/act/deploy/act-node.ftl | 192 +- .../resources/ftl/act/leave/add-leave.ftl | 261 +- .../resources/ftl/act/leave/leaveDetail.ftl | 174 +- .../resources/ftl/act/leave/leaveList.ftl | 323 +- .../ftl/act/leave/update-leave-readonly.ftl | 248 +- .../resources/ftl/act/leave/update-leave.ftl | 273 +- .../ftl/act/task/task-agent-iframe.ftl | 139 +- .../resources/ftl/act/task/task-agent.ftl | 193 +- .../main/resources/ftl/act/task/taskList.ftl | 297 +- .../src/main/resources/ftl/actList.ftl | 275 +- .../src/main/resources/ftl/actModelList.ftl | 412 +- .../resources/mapper/ActAssigneeMapper.xml | 57 +- .../main/resources/mapper/UserLeaveMapper.xml | 66 +- .../src/main/resources/plugin/activiti.js | 52 +- .../resources/properties/activiti.properties | 1 - .../static/diagram-viewer/index.html | 237 +- .../static/diagram-viewer/js/ActivitiRest.js | 44 +- .../static/diagram-viewer/js/ActivityImpl.js | 196 +- .../static/diagram-viewer/js/Color.js | 1189 +- .../diagram-viewer/js/LineBreakMeasurer.js | 518 +- .../static/diagram-viewer/js/Polyline.js | 259 +- .../diagram-viewer/js/ProcessDiagramCanvas.js | 2104 +- .../js/ProcessDiagramGenerator.js | 919 +- .../js/jquery/jquery.asyncqueue.js | 160 +- .../static/diagram-viewer/js/jquery/jquery.js | 14779 +++++++------ .../js/jquery/jquery.progressbar.js | 232 +- .../static/diagram-viewer/js/jstools.js | 40 +- .../diagram-viewer/js/raphael_uncompressed.js | 11569 +++++----- .../static/diagram-viewer/js/textlayout.js | 853 +- .../resources/static/diagram-viewer/style.css | 140 +- .../resources/static/editor-app/app-cfg.js | 4 +- .../main/resources/static/editor-app/app.js | 814 +- .../properties-assignment-controller.js | 825 +- ...perties-condition-expression-controller.js | 60 +- .../properties-default-controllers.js | 140 +- .../properties-event-listeners-controller.js | 449 +- ...operties-execution-listeners-controller.js | 571 +- .../properties-fields-controller.js | 315 +- .../properties-form-properties-controller.js | 505 +- .../properties-in-parameters-controller.js | 266 +- ...operties-message-definitions-controller.js | 213 +- .../properties-message-scope-controller.js | 50 +- .../properties-multiinstance-controller.js | 21 +- .../properties-out-parameters-controller.js | 266 +- ...roperties-sequenceflow-order-controller.js | 208 +- ...roperties-signal-definitions-controller.js | 219 +- .../properties-signal-scope-controller.js | 50 +- .../properties-task-listeners-controller.js | 569 +- .../editor-app/configuration/properties.js | 156 +- .../properties/assignment-candidateGroup.html | 20 +- .../assignment-display-template.html | 14 +- .../properties/assignment-popup-popup.html | 30 +- .../properties/assignment-popup.html | 115 +- .../properties/assignment-write-template.html | 1 - .../properties/boolean-property-template.html | 5 +- ...condition-expression-display-template.html | 2 +- .../condition-expression-popup.html | 53 +- .../condition-expression-write-template.html | 1 - .../default-value-display-template.html | 3 +- .../event-listeners-display-template.html | 1 - .../properties/event-listeners-popup.html | 289 +- .../event-listeners-write-template.html | 1 - .../execution-listeners-display-template.html | 6 +- .../properties/execution-listeners-popup.html | 248 +- .../execution-listeners-write-template.html | 1 - .../properties/feedback-popup.html | 28 +- .../properties/fields-display-template.html | 1 - .../properties/fields-popup.html | 125 +- .../properties/fields-write-template.html | 1 - .../form-properties-display-template.html | 1 - .../properties/form-properties-popup.html | 290 +- .../form-properties-write-template.html | 1 - .../in-parameters-display-template.html | 1 - .../properties/in-parameters-popup.html | 96 +- .../in-parameters-write-template.html | 1 - .../properties/message-definitions-popup.html | 104 +- .../message-property-write-template.html | 7 +- ...multiinstance-property-write-template.html | 13 +- .../out-parameters-display-template.html | 1 - .../properties/out-parameters-popup.html | 96 +- .../out-parameters-write-template.html | 1 - .../sequenceflow-order-display-template.html | 1 - .../properties/sequenceflow-order-popup.html | 74 +- .../sequenceflow-order-write-template.html | 1 - .../signal-definitions-display-template.html | 1 - .../properties/signal-definitions-popup.html | 123 +- .../signal-definitions-write-template.html | 1 - .../signal-property-write-template.html | 7 +- .../string-property-write-mode-template.html | 13 +- ...subprocess-reference-display-template.html | 1 - .../subprocess-reference-popup.html | 78 +- .../subprocess-reference-write-template.html | 1 - .../task-listeners-display-template.html | 1 - .../properties/task-listeners-popup.html | 204 +- .../task-listeners-write-template.html | 1 - .../configuration/properties/text-popup.html | 17 +- .../text-property-write-template.html | 1 - .../configuration/toolbar-default-actions.js | 808 +- .../editor-app/configuration/toolbar.js | 306 +- .../editor-app/configuration/url-config.js | 22 +- .../static/editor-app/css/style-common.css | 1434 +- .../static/editor-app/css/style-editor.css | 57 +- .../resources/static/editor-app/css/style.css | 162 +- .../static/editor-app/editor-config.js | 14 +- .../static/editor-app/editor-controller.js | 80 +- .../static/editor-app/editor-utils.js | 220 +- .../resources/static/editor-app/editor.html | 249 +- .../static/editor-app/editor/css/editor.css | 155 +- .../editor-app/editor/i18n/translation_de.js | 114 +- .../editor/i18n/translation_en_us.js | 126 +- .../editor/i18n/translation_signavio_de.js | 48 +- .../editor/i18n/translation_signavio_en_us.js | 50 +- .../static/editor-app/editor/oryx.debug.js | 17726 ++++++++-------- .../resources/static/editor-app/eventbus.js | 222 +- .../fonts/activiti-admin-webfont.svg | 98 +- .../fonts/glyphicons-halflings-regular.svg | 633 +- .../static/editor-app/header-controller.js | 20 +- .../resources/static/editor-app/i18n/en.json | 541 +- .../angular-mocks_1.2.13/angular-mocks.js | 4112 ++-- .../angular-resource.js | 1063 +- .../angular-route_1.2.13/angular-route.js | 1576 +- .../angular-sanitize.js | 1026 +- .../angular-translate-loader-static-files.js | 50 +- .../angular-translate-storage-cookie.js | 26 +- .../angular-translate.js | 1900 +- .../daterangepicker-bs3.css | 292 +- .../daterangepicker.js | 2039 +- .../bootstrap_3.1.1/css/bootstrap-theme.css | 446 +- .../libs/bootstrap_3.1.1/css/bootstrap.css | 7247 ++++--- .../fonts/glyphicons-halflings-regular.svg | 633 +- .../libs/bootstrap_3.1.1/js/bootstrap.js | 2983 +-- .../libs/es5-shim-15.3.4.5/CONTRIBUTORS.md | 49 +- .../libs/es5-shim-15.3.4.5/README.md | 140 +- .../libs/es5-shim-15.3.4.5/es5-sham.js | 758 +- .../libs/es5-shim-15.3.4.5/es5-shim.js | 2238 +- .../es5-shim-15.3.4.5/tests/helpers/h-kill.js | 68 +- .../tests/helpers/h-matchers.js | 66 +- .../libs/es5-shim-15.3.4.5/tests/helpers/h.js | 4 +- .../libs/es5-shim-15.3.4.5/tests/index.html | 18 +- .../es5-shim-15.3.4.5/tests/index.min.html | 16 +- .../tests/lib/jasmine-html.js | 356 +- .../es5-shim-15.3.4.5/tests/lib/jasmine.css | 134 +- .../es5-shim-15.3.4.5/tests/lib/jasmine.js | 2842 ++- .../libs/es5-shim-15.3.4.5/tests/lib/json2.js | 357 +- .../es5-shim-15.3.4.5/tests/spec/s-array.js | 2486 +-- .../es5-shim-15.3.4.5/tests/spec/s-date.js | 303 +- .../tests/spec/s-function.js | 286 +- .../es5-shim-15.3.4.5/tests/spec/s-number.js | 22 +- .../es5-shim-15.3.4.5/tests/spec/s-object.js | 346 +- .../es5-shim-15.3.4.5/tests/spec/s-string.js | 396 +- .../libs/jquery.autogrow-textarea.js | 105 +- .../editor-app/libs/jquery_1.11.0/jquery.js | 15943 +++++++------- .../editor-app/libs/json3_3.2.6/lib/json3.js | 1743 +- .../libs/pagination/tm.pagination.js | 398 +- .../static/editor-app/libs/path_parser.js | 173 +- .../static/editor-app/libs/prototype-1.5.1.js | 6015 +++--- .../partials/root-stencil-item-template.html | 18 +- .../partials/stencil-item-template.html | 34 +- .../resources/static/editor-app/plugins.xml | 108 +- .../editor-app/popups/icon-template.html | 4 +- .../static/editor-app/popups/save-model.html | 84 +- .../editor-app/popups/select-shape.html | 36 +- .../editor-app/popups/unsaved-changes.html | 45 +- .../editor-app/select-shape-controller.js | 587 +- .../static/editor-app/stencil-controller.js | 2612 ++- .../static/editor-app/toolbar-controller.js | 328 +- .../src/main/resources/static/modeler.html | 71 +- .../src/main/resources/stencilset.json | 3745 ++-- .../src/test/java/com/len/AppTest.java | 48 +- .../src/test/java/com/len/JsonTest.java | 43 +- len-blog/pom.xml | 53 +- .../main/java/com/len/config/CorsConfig.java | 20 +- .../com/len/controller/ArticleController.java | 174 +- .../com/len/controller/AuthController.java | 107 +- .../len/controller/BlogAdminController.java | 237 +- .../controller/BlogCategoryController.java | 30 +- .../com/len/controller/TagController.java | 52 +- .../src/main/java/com/len/core/BlogRealm.java | 107 +- .../src/main/java/com/len/core/LenUser.java | 26 +- .../core/MyBasicHttpAuthenticationFilter.java | 66 +- .../len/core/exception/CustomException.java | 30 +- .../core/exception/UnauthorizedException.java | 6 +- .../java/com/len/entity/ArticleCategory.java | 94 +- .../java/com/len/entity/ArticleDetail.java | 46 +- .../main/java/com/len/entity/ArticleList.java | 38 +- .../main/java/com/len/entity/ArticleTag.java | 68 +- .../main/java/com/len/entity/BlogArticle.java | 86 +- .../java/com/len/entity/BlogCategory.java | 338 +- .../src/main/java/com/len/entity/BlogTag.java | 114 +- .../com/len/mapper/ArticleCategoryMapper.java | 4 +- .../com/len/mapper/BlogArticleMapper.java | 12 +- .../src/main/java/com/len/model/Article.java | 58 +- .../java/com/len/model/SimpleArticle.java | 4 +- .../src/main/java/com/len/model/VArticle.java | 8 +- .../len/service/ArticleCategoryService.java | 2 +- .../com/len/service/BlogArticleService.java | 18 +- .../impl/ArticleCategoryServiceImpl.java | 14 +- .../service/impl/ArticleTagServiceImpl.java | 4 +- .../service/impl/BlogArticleServiceImpl.java | 690 +- .../src/main/resources/ftl/articleList.ftl | 592 +- .../mapper/ArticleCategoryMapper.xml | 42 +- .../resources/mapper/ArticleTagMapper.xml | 16 +- .../resources/mapper/BlogArticleMapper.xml | 221 +- .../resources/mapper/BlogCategoryMapper.xml | 30 +- .../main/resources/mapper/BlogTagMapper.xml | 18 +- len-core/pom.xml | 74 +- .../java/com/len/base/BaseController.java | 197 +- .../main/java/com/len/base/BaseEntity.java | 13 +- .../main/java/com/len/base/BaseMapper.java | 8 +- .../main/java/com/len/base/BaseService.java | 6 +- .../main/java/com/len/base/CurrentMenu.java | 71 +- .../main/java/com/len/base/CurrentRole.java | 29 +- .../main/java/com/len/base/CurrentUser.java | 73 +- .../com/len/base/handler/ExecuteContext.java | 3 +- .../len/base/impl/AbstractServiceImpl.java | 86 +- .../com/len/cache/CacheManagerFactory.java | 67 +- .../com/len/cache/impl/config/LenProp.java | 68 +- .../cache/impl/config/PropertiesConfig.java | 24 +- .../main/java/com/len/enums/PanelEnum.java | 12 +- .../exception/CustomErrorViewResolver.java | 54 +- .../java/com/len/exception/LenException.java | 24 +- .../com/len/exception/ServiceException.java | 26 +- .../java/com/len/freemarker/LenInclude.java | 68 +- .../src/main/java/com/len/menu/LoginType.java | 22 +- .../main/java/com/len/redis/RedisService.java | 137 +- .../java/com/len/socket/WebSocketService.java | 104 +- .../com/len/util/ApplicationContextUtil.java | 28 +- .../src/main/java/com/len/util/BeanUtil.java | 50 +- .../src/main/java/com/len/util/Checkbox.java | 10 +- .../main/java/com/len/util/CommonUtil.java | 28 +- .../main/java/com/len/util/ContextUtil.java | 19 +- .../len/util/CustomUsernamePasswordToken.java | 23 +- .../src/main/java/com/len/util/FileUtil.java | 2 +- .../src/main/java/com/len/util/IpUtil.java | 32 +- .../src/main/java/com/len/util/JWTUtil.java | 182 +- .../src/main/java/com/len/util/JdbcUtil.java | 54 +- .../src/main/java/com/len/util/JsonUtil.java | 78 +- .../src/main/java/com/len/util/JwtToken.java | 66 +- .../main/java/com/len/util/LenResponse.java | 88 +- .../main/java/com/len/util/LocalLocale.java | 33 +- .../src/main/java/com/len/util/Md5Util.java | 23 +- .../src/main/java/com/len/util/MsHelper.java | 32 +- .../src/main/java/com/len/util/PageUtil.java | 116 +- .../src/main/java/com/len/util/Principal.java | 8 +- .../src/main/java/com/len/util/ReType.java | 103 +- .../main/java/com/len/util/SpringUtil.java | 70 +- .../src/main/java/com/len/util/TreeUtil.java | 32 +- .../main/java/com/len/util/UploadUtil.java | 137 +- .../src/main/java/com/len/util/UuidUtil.java | 6 +- .../java/com/len/util/VerifyCodeUtils.java | 578 +- .../com/len/validator/ValidatorUtils.java | 78 +- .../com/len/validator/group/AddGroup.java | 3 +- .../java/com/len/validator/group/Group.java | 3 +- .../com/len/validator/group/UpdateGroup.java | 3 +- len-core/src/test/java/com/len/AppTest.java | 48 +- len-sys/pom.xml | 52 +- .../len/controller/DashboardController.java | 176 +- .../com/len/controller/ErrorController.java | 22 +- .../com/len/controller/JobController.java | 192 +- .../com/len/controller/LogController.java | 76 +- .../com/len/controller/LoginController.java | 259 +- .../com/len/controller/MenuController.java | 137 +- .../com/len/controller/PersonController.java | 56 +- .../com/len/controller/RoleController.java | 165 +- .../com/len/controller/UserController.java | 336 +- .../java/com/len/core/annotation/Log.java | 33 +- .../com/len/core/annotation/LogAspect.java | 159 +- .../len/core/filter/CustomAdvicFilter.java | 14 +- .../com/len/core/filter/PermissionFilter.java | 34 +- .../len/core/filter/VerfityCodeFilter.java | 146 +- .../com/len/core/filter/VerifyCodeUtils.java | 601 +- .../core/init/job/DataSourceJobThread.java | 83 +- .../com/len/core/init/job/JobExecuteImpl.java | 17 +- .../CustomServletContextListener.java | 20 +- .../com/len/core/listener/LenospInit.java | 26 +- .../core/quartz/CustomQuartz/DataSchdule.java | 74 +- .../core/quartz/CustomQuartz/JobDemo1.java | 59 +- .../core/quartz/CustomQuartz/JobDemo2.java | 40 +- .../core/quartz/CustomQuartz/JobDemo3.java | 38 +- .../core/quartz/CustomQuartz/JobDemo4.java | 38 +- .../core/quartz/CustomQuartz/JobDemo5.java | 38 +- .../java/com/len/core/quartz/JobTask.java | 190 +- .../com/len/core/quartz/MyJobFactory.java | 21 +- .../len/core/quartz/MySchedulerListener.java | 21 +- .../java/com/len/core/shiro/LoginRealm.java | 122 +- .../java/com/len/core/shiro/Principal.java | 58 +- .../shiro/RetryLimitCredentialsMatcher.java | 133 +- .../src/main/java/com/len/entity/SysDept.java | 37 +- .../main/java/com/len/entity/SysEmployee.java | 153 +- .../src/main/java/com/len/entity/SysJob.java | 58 +- .../src/main/java/com/len/entity/SysLog.java | 227 +- .../src/main/java/com/len/entity/SysMenu.java | 96 +- .../main/java/com/len/entity/SysPanelOpt.java | 39 +- .../src/main/java/com/len/entity/SysRole.java | 8 +- .../main/java/com/len/entity/SysRoleMenu.java | 10 +- .../main/java/com/len/entity/SysRoleUser.java | 10 +- .../java/com/len/entity/SysShortcuts.java | 25 +- .../src/main/java/com/len/entity/SysUser.java | 44 +- .../java/com/len/entity/SysUserDepart.java | 22 +- .../java/com/len/mapper/SysMenuMapper.java | 88 +- .../com/len/mapper/SysRoleMenuMapper.java | 30 +- .../com/len/mapper/SysRoleUserMapper.java | 6 +- .../java/com/len/mapper/SysUserMapper.java | 33 +- .../com/len/service/DashboardService.java | 36 +- .../main/java/com/len/service/JobService.java | 58 +- .../java/com/len/service/MenuService.java | 84 +- .../java/com/len/service/RoleMenuService.java | 6 +- .../java/com/len/service/RoleService.java | 6 +- .../java/com/len/service/SysUserService.java | 78 +- .../service/impl/DashboardServiceImpl.java | 131 +- .../len/service/impl/EmployeeServiceImpl.java | 3 +- .../com/len/service/impl/JobServiceImpl.java | 108 +- .../com/len/service/impl/MenuServiceImpl.java | 478 +- .../len/service/impl/RoleMenuServiceImpl.java | 32 +- .../com/len/service/impl/RoleServiceImpl.java | 104 +- .../len/service/impl/RoleUserServiceImpl.java | 3 +- .../len/service/impl/SysUserServiceImpl.java | 438 +- len-sys/src/main/resources/ftl/login.ftl | 143 +- len-sys/src/main/resources/ftl/login2.html | 265 +- .../src/main/resources/ftl/main/dashboard.ftl | 24 +- .../ftl/main/dashboard_static_copy.ftl | 250 +- len-sys/src/main/resources/ftl/main/main.ftl | 214 +- .../main/resources/ftl/system/base/bar.ftl | 10 +- .../resources/ftl/system/base/blockInput.ftl | 22 +- .../main/resources/ftl/system/base/btn.ftl | 6 +- .../resources/ftl/system/base/formBtn.ftl | 18 +- .../resources/ftl/system/base/formHead.ftl | 12 +- .../resources/ftl/system/base/lineInput.ftl | 26 +- .../resources/ftl/system/base/queryBox.ftl | 10 +- .../main/resources/ftl/system/base/readme.md | 16 +- .../main/resources/ftl/system/base/searth.ftl | 2 +- .../main/resources/ftl/system/base/upload.ftl | 56 +- .../main/resources/ftl/system/base/zoom.ftl | 42 +- .../src/main/resources/ftl/system/job/add.ftl | 190 +- .../main/resources/ftl/system/job/jobList.ftl | 259 +- .../main/resources/ftl/system/job/update.ftl | 191 +- .../main/resources/ftl/system/log/logList.ftl | 188 +- .../main/resources/ftl/system/menu/add.ftl | 487 +- .../resources/ftl/system/menu/menuList.ftl | 172 +- .../main/resources/ftl/system/menu/update.ftl | 486 +- .../main/resources/ftl/system/person/me.ftl | 334 +- .../main/resources/ftl/system/role/add.ftl | 204 +- .../resources/ftl/system/role/roleList.ftl | 155 +- .../main/resources/ftl/system/role/update.ftl | 250 +- .../main/resources/ftl/system/user/add.ftl | 370 +- .../main/resources/ftl/system/user/add2.ftl | 340 +- .../ftl/system/user/resetPassword.ftl | 159 +- .../main/resources/ftl/system/user/update.ftl | 312 +- .../resources/ftl/system/user/userList.ftl | 208 +- .../resources/i18n/message_en_US.properties | 5 +- .../resources/i18n/message_zh_CN.properties | 3 - .../main/resources/mapper/SysDeptMapper.xml | 22 +- .../resources/mapper/SysEmployeeMapper.xml | 44 +- .../main/resources/mapper/SysJobMapper.xml | 46 +- .../main/resources/mapper/SysLogMapper.xml | 38 +- .../main/resources/mapper/SysMenuMapper.xml | 152 +- .../main/resources/mapper/SysRoleMapper.xml | 38 +- .../resources/mapper/SysRoleMenuMapper.xml | 46 +- .../resources/mapper/SysRoleUserMapper.xml | 46 +- .../main/resources/mapper/SysUserMapper.xml | 262 +- .../main/resources/plugin/build/css/admin.css | 204 +- .../main/resources/plugin/build/css/app.css | 356 +- .../plugin/build/css/themes/blue.css | 66 +- .../plugin/build/css/themes/default.css | 7 +- .../plugin/build/css/themes/orange.css | 70 +- .../main/resources/plugin/build/js/admin.js | 95 +- .../src/main/resources/plugin/build/js/app.js | 438 +- .../resources/plugin/build/js/dashboard.js | 812 +- .../resources/plugin/build/js/kitconfig.js | 12 +- .../resources/plugin/build/js/layrouter.js | 162 +- .../main/resources/plugin/build/js/loader.js | 62 +- .../main/resources/plugin/build/js/message.js | 106 +- .../main/resources/plugin/build/js/navbar.js | 442 +- .../resources/plugin/build/js/nprogress.js | 960 +- .../resources/plugin/build/js/onelevel.js | 226 +- .../main/resources/plugin/build/js/pjax.js | 1895 +- .../src/main/resources/plugin/build/js/spa.js | 76 +- .../src/main/resources/plugin/build/js/tab.js | 744 +- .../resources/plugin/build/js/treeselect.js | 397 +- .../main/resources/plugin/build/js/utils.js | 498 +- .../main/resources/plugin/build/js/ztree.js | 7514 +++---- .../src/main/resources/plugin/html/icon.html | 1393 +- .../resources/plugin/layui/font/iconfont.svg | 950 +- .../plugin/layui/modules/treeTable.js | 4522 ++-- .../src/main/resources/plugin/lenos/main.css | 156 +- .../plugins/font-awesome/css/font-awesome.css | 2290 +- .../fonts/fontawesome-webfont.svg | 4045 ++-- .../plugin/plugins/sideshow/css/component.css | 18 +- .../plugin/plugins/sideshow/css/demo.css | 30 +- .../fonts/codropsicons/codropsicons.svg | 43 +- .../sideshow/fonts/codropsicons/license.txt | 8 +- .../plugin/plugins/sideshow/js/demo-1.js | 371 +- .../plugin/plugins/sideshow/js/demo-2.js | 154 +- .../plugin/plugins/sideshow/js/demo-3.js | 256 +- .../plugin/plugins/sideshow/js/demo-4.js | 200 +- .../plugin/plugins/sideshow/js/rAF.js | 46 +- .../plugin/plugins/sortable/Sortable.js | 7573 +++---- .../src/main/resources/plugin/tools/main.js | 80 +- .../src/main/resources/plugin/tools/moment.js | 9105 ++++---- .../src/main/resources/plugin/tools/tool.js | 812 +- .../resources/plugin/tools/update-setting.js | 12 +- .../resources/plugin/x-admin/css/font.css | 26 +- .../resources/plugin/x-admin/css/xadmin.css | 517 +- .../plugin/x-admin/fonts/iconfont.svg | 932 +- .../resources/plugin/x-admin/js/xadmin.js | 256 +- .../plugin/ztree/css/awesomeStyle/awesome.css | 547 +- .../ztree/css/awesomeStyle/awesome.less | 557 +- .../ztree/css/metroStyle/metroStyle.css | 441 +- .../ztree/css/zTreeStyle/zTreeStyle.css | 430 +- .../plugin/ztree/js/jquery.ztree.all.js | 6902 +++--- .../plugin/ztree/js/jquery.ztree.core.js | 3730 ++-- .../plugin/ztree/js/jquery.ztree.excheck.js | 1042 +- .../plugin/ztree/js/jquery.ztree.exedit.js | 1987 +- .../plugin/ztree/js/jquery.ztree.exhide.js | 521 +- len-sys/src/test/java/com/len/AppTest.java | 48 +- len-web/pom.xml | 136 +- .../src/main/java/com/len/LenApplication.java | 14 +- .../java/com/len/config/BeanFactoryImpl.java | 10 +- .../main/java/com/len/config/BeanName.java | 8 +- .../java/com/len/config/FreeMarkerConfig.java | 94 +- .../com/len/config/FreemarkerShiroConfig.java | 14 +- .../main/java/com/len/config/LenFilter.java | 93 +- .../main/java/com/len/config/LogConfig.java | 8 +- .../com/len/config/MyBatisPlusConfig.java | 37 +- .../config/MyModularRealmAuthenticator.java | 54 +- .../java/com/len/config/PageHelperConfig.java | 2 +- .../main/java/com/len/config/ShiroConfig.java | 358 +- .../com/len/config/ShiroSessionManager.java | 34 +- .../java/com/len/config/SocketConfig.java | 8 +- .../java/com/len/config/SwaggerConfig.java | 36 +- .../com/len/config/TransactionalConfig.java | 70 +- .../java/com/len/config/WebMvcConfig.java | 84 +- .../java/com/len/config/ZBeanFactory.java | 26 +- len-web/src/main/java/test/ActivitiDemo.java | 597 +- .../src/main/java/test/ActivitiGateWay.java | 292 +- .../src/main/java/test/ActivitiVariable.java | 204 +- len-web/src/main/java/test/BlogTest.java | 68 +- len-web/src/main/java/test/BootTest.java | 43 +- len-web/src/main/java/test/MybatisApp.java | 8 +- .../main/len-web\350\257\264\346\230\216.md" | 107 +- .../main/resources/application-mysql-dev.yml | 62 +- .../main/resources/application-oracle-dev.yml | 68 +- .../src/main/resources/application-prod.yml | 74 +- .../resources/application-sqlserver-dev.yml | 64 +- .../src/main/resources/application-test.yml | 70 +- .../resources/auto-config/mybatis-config.xml | 94 +- .../src/main/resources/ehcache/ehcache.xml | 38 +- len-web/src/main/resources/len.properties | 4 - len-web/src/main/resources/log4j.properties | 2 +- len-web/src/main/resources/quartz.properties | 24 +- pom.xml | 910 +- 498 files changed, 124570 insertions(+), 116590 deletions(-) create mode 100644 .editorconfig diff --git a/.codeStyle/eclipse-codestyle.xml b/.codeStyle/eclipse-codestyle.xml index b620a30..9a8dcc1 100644 --- a/.codeStyle/eclipse-codestyle.xml +++ b/.codeStyle/eclipse-codestyle.xml @@ -1,603 +1,603 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..adf4cc5 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,19 @@ +# EditorConfig is awesome: https://EditorConfig.org +root = true + +[*] +indent_style = tab +charset = utf-8 +end_of_line = lf +insert_final_newline = true + +[*.{json,yml}] +indent_style = space +indent_size = 2 + +[*.md] +insert_final_newline = false + + + + diff --git a/README.md b/README.md index ef2fa90..623d543 100644 --- a/README.md +++ b/README.md @@ -18,27 +18,37 @@

# 简介 + lenosp是一个基于spring boot的脚手架,并提供完善社区文档教程,中小企业可以用来快速迭代。 + # 体验 + [http://42.192.219.164:8081/login](http://42.192.219.164:8081/login) 体验账户:admin,所有账户密码:123456 测试环境,所有业务增删改不会持久化,默认显示成功 # 架构 - # 模块 + ![输入图片说明](image/moduleimage.png) + # 里程碑 + 完善当前单体应用,趋于稳定,可供中小企业快速迭代。 # 功能 + xxx # 关于我们 + 本项目是郑州程序员组织成员开发迭代 + # 加入开源组织 + ![输入图片说明](image/image.png) # 社区 + 文档地址:https://www.kancloud.cn/zhuxm/zzdevelop/3141950 \ No newline at end of file diff --git a/db/lenos-mysql5.7.35.sql b/db/lenos-mysql5.7.35.sql index 6f19d94..8a0ac0e 100644 --- a/db/lenos-mysql5.7.35.sql +++ b/db/lenos-mysql5.7.35.sql @@ -15,1362 +15,1992 @@ */ SET NAMES utf8mb4; -SET FOREIGN_KEY_CHECKS = 0; +SET +FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for act_assignee -- ---------------------------- DROP TABLE IF EXISTS `act_assignee`; -CREATE TABLE `act_assignee` ( - `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, - `sid` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '节点id', - `assignee` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '办理人', - `role_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '候选组(角色)', - `assignee_type` int(11) NOT NULL COMMENT '办理人类型1办理人2候选人3组', - `activti_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '节点名称', - PRIMARY KEY (`id`) USING BTREE +CREATE TABLE `act_assignee` +( + `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `sid` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '节点id', + `assignee` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '办理人', + `role_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '候选组(角色)', + `assignee_type` int(11) NOT NULL COMMENT '办理人类型1办理人2候选人3组', + `activti_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '节点名称', + PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for act_evt_log -- ---------------------------- DROP TABLE IF EXISTS `act_evt_log`; -CREATE TABLE `act_evt_log` ( - `LOG_NR_` bigint(20) NOT NULL AUTO_INCREMENT, - `TYPE_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `TIME_STAMP_` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), - `USER_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `DATA_` longblob NULL, - `LOCK_OWNER_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `LOCK_TIME_` timestamp(3) NULL DEFAULT NULL, - `IS_PROCESSED_` tinyint(4) NULL DEFAULT 0, - PRIMARY KEY (`LOG_NR_`) USING BTREE +CREATE TABLE `act_evt_log` +( + `LOG_NR_` bigint(20) NOT NULL AUTO_INCREMENT, + `TYPE_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TIME_STAMP_` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP (3), + `USER_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `DATA_` longblob NULL, + `LOCK_OWNER_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `LOCK_TIME_` timestamp(3) NULL DEFAULT NULL, + `IS_PROCESSED_` tinyint(4) NULL DEFAULT 0, + PRIMARY KEY (`LOG_NR_`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for act_ge_bytearray -- ---------------------------- DROP TABLE IF EXISTS `act_ge_bytearray`; -CREATE TABLE `act_ge_bytearray` ( - `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `REV_` int(11) NULL DEFAULT NULL, - `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `DEPLOYMENT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `BYTES_` longblob NULL, - `GENERATED_` tinyint(4) NULL DEFAULT NULL, - PRIMARY KEY (`ID_`) USING BTREE, - INDEX `ACT_FK_BYTEARR_DEPL`(`DEPLOYMENT_ID_`) USING BTREE, - CONSTRAINT `ACT_FK_BYTEARR_DEPL` FOREIGN KEY (`DEPLOYMENT_ID_`) REFERENCES `act_re_deployment` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT +CREATE TABLE `act_ge_bytearray` +( + `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `REV_` int(11) NULL DEFAULT NULL, + `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `DEPLOYMENT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `BYTES_` longblob NULL, + `GENERATED_` tinyint(4) NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_FK_BYTEARR_DEPL`(`DEPLOYMENT_ID_`) USING BTREE, + CONSTRAINT `ACT_FK_BYTEARR_DEPL` FOREIGN KEY (`DEPLOYMENT_ID_`) REFERENCES `act_re_deployment` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of act_ge_bytearray -- ---------------------------- -INSERT INTO `act_ge_bytearray` VALUES ('142518', 20, 'source', NULL, 0x7B227265736F757263654964223A22313432353137222C2270726F70657274696573223A7B2270726F636573735F6964223A2270726F636573735F6C65617665222C226E616D65223A22E8AFB7E58187E6B581E7A88B222C22646F63756D656E746174696F6E223A22222C2270726F636573735F617574686F72223A22222C2270726F636573735F76657273696F6E223A22222C2270726F636573735F6E616D657370616365223A22687474703A2F2F7777772E61637469766974692E6F72672F70726F63657373646566222C22657865637574696F6E6C697374656E657273223A22222C226576656E746C697374656E657273223A22222C227369676E616C646566696E6974696F6E73223A22222C226D657373616765646566696E6974696F6E73223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22247B666C61673D3D747275657D227D2C227374656E63696C223A7B226964223A2242504D4E4469616772616D227D2C226368696C64536861706573223A5B7B227265736F757263654964223A227369642D41343530344644322D303230342D343246352D393036312D344134323938324442343938222C2270726F70657274696573223A7B226F766572726964656964223A227374617274222C226E616D65223A227374617274222C22646F63756D656E746174696F6E223A22222C22657865637574696F6E6C697374656E657273223A22222C22696E69746961746F72223A22222C22666F726D6B6579646566696E6974696F6E223A22222C22666F726D70726F70657274696573223A22227D2C227374656E63696C223A7B226964223A2253746172744E6F6E654576656E74227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D30443235384332342D314631392D343233332D413937362D413044384342394441454143227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A36302C2279223A3235382E373033373033393938313833387D2C2275707065724C656674223A7B2278223A33302C2279223A3232382E373033373033393938313833387D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D34363841393635452D393339422D343733312D413232392D353137384436413042423834222C2270726F70657274696573223A7B226F766572726964656964223A227573657231222C226E616D65223A22E7BB8FE79086E5AEA1E689B9222C22646F63756D656E746174696F6E223A22222C226173796E6368726F6E6F7573646566696E6974696F6E223A2266616C7365222C226578636C7573697665646566696E6974696F6E223A2266616C7365222C22657865637574696F6E6C697374656E657273223A22222C226D756C7469696E7374616E63655F74797065223A224E6F6E65222C226D756C7469696E7374616E63655F63617264696E616C697479223A22222C226D756C7469696E7374616E63655F636F6C6C656374696F6E223A22222C226D756C7469696E7374616E63655F7661726961626C65223A22222C226D756C7469696E7374616E63655F636F6E646974696F6E223A22222C226973666F72636F6D70656E736174696F6E223A2266616C7365222C22757365727461736B61737369676E6D656E74223A7B2261737369676E6D656E74223A7B2261737369676E6565223A223062373632356665646161303565383566323832343836653163396339316239222C2263616E64696461746547726F757073223A5B7B2276616C7565223A226533343665393633363834383463386661376632313763653535306130313836222C226E616D6556616C7565223A22E589AFE7BB8FE79086222C222424686173684B6579223A2231494C227D5D7D7D2C22666F726D6B6579646566696E6974696F6E223A22222C2264756564617465646566696E6974696F6E223A22222C227072696F72697479646566696E6974696F6E223A22222C22666F726D70726F70657274696573223A22222C227461736B6C697374656E657273223A6E756C6C7D2C227374656E63696C223A7B226964223A22557365725461736B227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D30413541464638362D414541342D343231322D423146342D393237354134343036433244227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3231392E39393939393939393939393939342C2279223A3238332E373033373033393938313833387D2C2275707065724C656674223A7B2278223A3132302C2279223A3230332E373033373033393938313833387D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D30443235384332342D314631392D343233332D413937362D413044384342394441454143222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D34363841393635452D393339422D343733312D413232392D353137384436413042423834227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3131392E31393533313234393939393939372C2279223A3234332E373033373033393938313833387D2C2275707065724C656674223A7B2278223A36302E363438343337352C2279223A3234332E373033373033393938313833387D7D2C22646F636B657273223A5B7B2278223A31352C2279223A31342E3939393939393939393939393939367D2C7B2278223A34392E39393939393939393939393939372C2279223A34307D5D2C22746172676574223A7B227265736F757263654964223A227369642D34363841393635452D393339422D343733312D413232392D353137384436413042423834227D7D2C7B227265736F757263654964223A227369642D37363845453443392D333233432D343744422D423438302D344230323746333136433835222C2270726F70657274696573223A7B226F766572726964656964223A227573657232222C226E616D65223A22E4BABAE4BA8BE5AEA1E689B9222C22646F63756D656E746174696F6E223A22222C226173796E6368726F6E6F7573646566696E6974696F6E223A2266616C7365222C226578636C7573697665646566696E6974696F6E223A2266616C7365222C22657865637574696F6E6C697374656E657273223A22222C226D756C7469696E7374616E63655F74797065223A224E6F6E65222C226D756C7469696E7374616E63655F63617264696E616C697479223A22222C226D756C7469696E7374616E63655F636F6C6C656374696F6E223A22222C226D756C7469696E7374616E63655F7661726961626C65223A22222C226D756C7469696E7374616E63655F636F6E646974696F6E223A22222C226973666F72636F6D70656E736174696F6E223A2266616C7365222C22757365727461736B61737369676E6D656E74223A7B2261737369676E6D656E74223A7B2261737369676E6565223A223938623035316230333638316465363032383939336135643134616339336362227D7D2C22666F726D6B6579646566696E6974696F6E223A22222C2264756564617465646566696E6974696F6E223A22222C227072696F72697479646566696E6974696F6E223A22222C22666F726D70726F70657274696573223A22222C227461736B6C697374656E657273223A6E756C6C7D2C227374656E63696C223A7B226964223A22557365725461736B227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D33334642463234452D464537302D343730412D394442352D394231383831453133383437227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3631302E3039303838323633363434362C2279223A3238332E373033373033313034313134327D2C2275707065724C656674223A7B2278223A3531302E30393038383236333634343631372C2279223A3230332E37303337303331303431313432337D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D35353636443037362D414234432D344134322D393938462D323533373738394638313831222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C226173796E6368726F6E6F7573646566696E6974696F6E223A2266616C7365222C226578636C7573697665646566696E6974696F6E223A2266616C7365222C2273657175656E6365666C6F776F72646572223A22227D2C227374656E63696C223A7B226964223A224578636C757369766547617465776179227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D46423539344242452D383030352D344544432D423343382D393738314544323236433935227D2C7B227265736F757263654964223A227369642D34373638373538312D333535422D343335342D383433432D433330343233333238364146227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3735352E353435343431333138323233312C2279223A3236332E373033373033393938313833387D2C2275707065724C656674223A7B2278223A3731352E353435343431333138323233312C2279223A3232332E373033373033393938313833387D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D33334642463234452D464537302D343730412D394442352D394231383831453133383437222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D35353636443037362D414234432D344134322D393938462D323533373738394638313831227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3731352E313133303933303035303039392C2279223A3234342E31343432323136333535323135377D2C2275707065724C656674223A7B2278223A3631302E3537383039383232383233392C2279223A3234332E383437313639393931393532327D7D2C22646F636B657273223A5B7B2278223A34392E39393939393939393939393939352C2279223A33392E3939393939393939393939393938367D2C7B2278223A32302E352C2279223A32302E357D5D2C22746172676574223A7B227265736F757263654964223A227369642D35353636443037362D414234432D344134322D393938462D323533373738394638313831227D7D2C7B227265736F757263654964223A227369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C226173796E6368726F6E6F7573646566696E6974696F6E223A2266616C7365222C226578636C7573697665646566696E6974696F6E223A2266616C7365222C2273657175656E6365666C6F776F72646572223A22227D2C227374656E63696C223A7B226964223A224578636C757369766547617465776179227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D41453541454438342D303734362D343738372D393836462D364137393237433334433334227D2C7B227265736F757263654964223A227369642D35313046453036322D433042432D343643382D394231372D384133383037324132424336227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3431302E353435343431333138323233312C2279223A3236332E373033373033393938313833387D2C2275707065724C656674223A7B2278223A3337302E353435343431333138323233312C2279223A3232332E373033373033393938313833387D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D42324633433135342D434432322D343230412D424538422D363836444534373531423731222C2270726F70657274696573223A7B226F766572726964656964223A2275736572222C226E616D65223A22E8B083E695B4222C22646F63756D656E746174696F6E223A22222C226173796E6368726F6E6F7573646566696E6974696F6E223A2266616C7365222C226578636C7573697665646566696E6974696F6E223A2266616C7365222C22657865637574696F6E6C697374656E657273223A22222C226D756C7469696E7374616E63655F74797065223A224E6F6E65222C226D756C7469696E7374616E63655F63617264696E616C697479223A22222C226D756C7469696E7374616E63655F636F6C6C656374696F6E223A22222C226D756C7469696E7374616E63655F7661726961626C65223A22222C226D756C7469696E7374616E63655F636F6E646974696F6E223A22222C226973666F72636F6D70656E736174696F6E223A2266616C7365222C22757365727461736B61737369676E6D656E74223A22222C22666F726D6B6579646566696E6974696F6E223A22222C2264756564617465646566696E6974696F6E223A22222C227072696F72697479646566696E6974696F6E223A22222C22666F726D70726F70657274696573223A22222C227461736B6C697374656E657273223A6E756C6C7D2C227374656E63696C223A7B226964223A22557365725461736B227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D39394343413337462D413233352D343835332D383437322D444532333341443245443332227D2C7B227265736F757263654964223A227369642D30344339463239412D304242352D343639312D383034432D373634453445304132373136227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3434302E35343534343133313832323332352C2279223A3434382E373033373036363437323739327D2C2275707065724C656674223A7B2278223A3334302E3534353434313331383232332C2279223A3336382E373033373036363437323739327D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D46313234303339432D394237422D344134382D384531332D413635353335384246443345222C2270726F70657274696573223A7B226F766572726964656964223A22656E64222C226E616D65223A22656E64222C22646F63756D656E746174696F6E223A22222C22657865637574696F6E6C697374656E657273223A22227D2C227374656E63696C223A7B226964223A22456E644E6F6E654576656E74227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3930382E353435343431333138323233322C2279223A3235372E373033373033393938313833387D2C2275707065724C656674223A7B2278223A3838302E353435343431333138323233322C2279223A3232392E373033373033393938313833387D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D34373638373538312D333535422D343335342D383433432D433330343233333238364146222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22E5908CE6848F222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22247B666C61673D3D747275657D222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D46313234303339432D394237422D344134382D384531332D413635353335384246443345227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3837392E3932343335323534333835352C2279223A3234342E313431393535363839373437337D2C2275707065724C656674223A7B2278223A3735352E363139363535303932353931322C2279223A3234332E37343938323733303636323033327D7D2C22646F636B657273223A5B7B2278223A32302E352C2279223A32302E3530303030303030303030303030347D2C7B2278223A31342C2279223A31347D5D2C22746172676574223A7B227265736F757263654964223A227369642D46313234303339432D394237422D344134382D384531332D413635353335384246443345227D7D2C7B227265736F757263654964223A227369642D46423539344242452D383030352D344544432D423343382D393738314544323236433935222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22E4B88DE5908CE6848F222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22247B666C61673D3D66616C73657D222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365222C2273686F776469616D6F6E646D61726B6572223A66616C73657D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D42324633433135342D434432322D343230412D424538422D363836444534373531423731227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3733362E303435343431333138323233312C2279223A3430382E373033373036363437323739327D2C2275707065724C656674223A7B2278223A3434312E313234353432383830373233312C2279223A3236342E343831303438303538363234377D7D2C22646F636B657273223A5B7B2278223A32302E352C2279223A32302E3530303030303030303030303030347D2C7B2278223A3733362E303435343431333138323233312C2279223A3430382E373033373036363437323739327D2C7B2278223A39392C2279223A34302E3030303030303030303030303033367D5D2C22746172676574223A7B227265736F757263654964223A227369642D42324633433135342D434432322D343230412D424538422D363836444534373531423731227D7D2C7B227265736F757263654964223A227369642D39394343413337462D413233352D343835332D383437322D444532333341443245443332222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22E9878DE696B0E794B3E8AFB7222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22247B666C61673D3D747275657D222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365222C2273686F776469616D6F6E646D61726B6572223A66616C73657D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D34363841393635452D393339422D343733312D413232392D353137384436413042423834227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3334302E3534353434313331383232332C2279223A3430382E373033373036363437323739337D2C2275707065724C656674223A7B2278223A3136392E39393939393939393939393939372C2279223A3238342E363634363432313339373631367D7D2C22646F636B657273223A5B7B2278223A302E393939393939393939393939393939392C2279223A34302E30303030303030303030303030397D2C7B2278223A3136392E39393939393939393939393939372C2279223A3430382E373033373036363437323739337D2C7B2278223A34392E39393939393939393939393939372C2279223A34307D5D2C22746172676574223A7B227265736F757263654964223A227369642D34363841393635452D393339422D343733312D413232392D353137384436413042423834227D7D2C7B227265736F757263654964223A227369642D39353037343945412D344242362D343237362D423637412D444530334533344130353733222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C226173796E6368726F6E6F7573646566696E6974696F6E223A2266616C7365222C226578636C7573697665646566696E6974696F6E223A2266616C7365222C2273657175656E6365666C6F776F72646572223A22227D2C227374656E63696C223A7B226964223A224578636C757369766547617465776179227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D38344442433035362D303639312D343733452D383243462D443332354546373336413732227D2C7B227265736F757263654964223A227369642D30443039333043392D394241312D344636382D383545412D333834453136423430394130227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3330342E39393939393939393939393939342C2279223A3236332E373033373033393938313833387D2C2275707065724C656674223A7B2278223A3236342E39393939393939393939393939342C2279223A3232332E373033373033393938313833387D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D30344339463239412D304242352D343639312D383034432D373634453445304132373136222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22E58F96E6B688E8AFB7E58187222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22247B666C61673D3D66616C73657D222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365222C2273686F776469616D6F6E646D61726B6572223A66616C73657D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D46313234303339432D394237422D344134382D384531332D413635353335384246443345227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3839342E353435343431333138323233322C2279223A3439342E373033373036363437323739327D2C2275707065724C656674223A7B2278223A3339302E35343534343133313832323331342C2279223A3235382E343330323636363433303536327D7D2C22646F636B657273223A5B7B2278223A35302E3030303030303030303030303131342C2279223A37397D2C7B2278223A3339302E35343534343133313832323331342C2279223A3439342E373033373036363437323739327D2C7B2278223A3839342E353435343431333138323233322C2279223A3439342E373033373036363437323739327D2C7B2278223A31342C2279223A31347D5D2C22746172676574223A7B227265736F757263654964223A227369642D46313234303339432D394237422D344134382D384531332D413635353335384246443345227D7D2C7B227265736F757263654964223A227369642D30413541464638362D414541342D343231322D423146342D393237354134343036433244222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D39353037343945412D344242362D343237362D423637412D444530334533344130353733227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3236342E363438343436383730303037352C2279223A3234342E313133343337353334343137367D2C2275707065724C656674223A7B2278223A3232302E36323838393638373939393234352C2279223A3234332E39323238373637313139357D7D2C22646F636B657273223A5B7B2278223A34392E3939393939393939393939393938362C2279223A33392E3939393939393939393939393938367D2C7B2278223A32302E352C2279223A32302E357D5D2C22746172676574223A7B227265736F757263654964223A227369642D39353037343945412D344242362D343237362D423637412D444530334533344130353733227D7D2C7B227265736F757263654964223A227369642D37463032463244352D413642412D343233342D413732342D334638393844323335413442222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365222C2273686F776469616D6F6E646D61726B6572223A66616C73657D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3339302E353435343431333138323233312C2279223A3232332E34303037363130373131373438387D2C2275707065724C656674223A7B2278223A3339302E353435343431333138323233312C2279223A3137322E363031353334383239363530357D7D2C22646F636B657273223A5B7B2278223A3230352E38303433363431303339333632382C2279223A3137312E303333383031323134313530327D2C7B2278223A32302C2279223A32307D5D2C22746172676574223A7B227265736F757263654964223A227369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535227D7D2C7B227265736F757263654964223A227369642D30353145353938322D454646442D343337372D423137392D333730343841323346433232222C2270726F70657274696573223A7B226F766572726964656964223A226368696C64222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C226173796E6368726F6E6F7573646566696E6974696F6E223A2266616C7365222C226578636C7573697665646566696E6974696F6E223A2266616C7365222C22657865637574696F6E6C697374656E657273223A22222C226D756C7469696E7374616E63655F74797065223A224E6F6E65222C226D756C7469696E7374616E63655F63617264696E616C697479223A22222C226D756C7469696E7374616E63655F636F6C6C656374696F6E223A22222C226D756C7469696E7374616E63655F7661726961626C65223A22222C226D756C7469696E7374616E63655F636F6E646974696F6E223A22222C2269737472616E73616374696F6E223A2266616C7365227D2C227374656E63696C223A7B226964223A2253756250726F63657373227D2C226368696C64536861706573223A5B7B227265736F757263654964223A227369642D39443541314632382D393042372D343644322D414637462D353446464637383631343146222C2270726F70657274696573223A7B226F766572726964656964223A22737374617274222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22657865637574696F6E6C697374656E657273223A22222C22696E69746961746F72223A22222C22666F726D6B6579646566696E6974696F6E223A22222C22666F726D70726F70657274696573223A22227D2C227374656E63696C223A7B226964223A2253746172744E6F6E654576656E74227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D33453941414432332D343444412D344138352D383242442D443643383330413443343938227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A34382E3531383531383436343031303338342C2279223A3130312E30353130343034353136333330337D2C2275707065724C656674223A7B2278223A31382E3531383531383436343031303338342C2279223A37312E30353130343034353136333330337D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D32333041443633362D423038332D344132412D383446342D464445353430464443314333222C2270726F70657274696573223A7B226F766572726964656964223A22616C6C6D616E61676572222C226E616D65223A22E680BBE7BB8FE79086E5AEA1E689B9222C22646F63756D656E746174696F6E223A22222C226173796E6368726F6E6F7573646566696E6974696F6E223A2266616C7365222C226578636C7573697665646566696E6974696F6E223A2266616C7365222C22657865637574696F6E6C697374656E657273223A22222C226D756C7469696E7374616E63655F74797065223A224E6F6E65222C226D756C7469696E7374616E63655F63617264696E616C697479223A22222C226D756C7469696E7374616E63655F636F6C6C656374696F6E223A22222C226D756C7469696E7374616E63655F7661726961626C65223A22222C226D756C7469696E7374616E63655F636F6E646974696F6E223A22222C226973666F72636F6D70656E736174696F6E223A2266616C7365222C22757365727461736B61737369676E6D656E74223A7B2261737369676E6D656E74223A7B2261737369676E6565223A226438313861633661383663663161363464323138346266303639396436376138227D7D2C22666F726D6B6579646566696E6974696F6E223A22222C2264756564617465646566696E6974696F6E223A22222C227072696F72697479646566696E6974696F6E223A22222C22666F726D70726F70657274696573223A22222C227461736B6C697374656E657273223A6E756C6C7D2C227374656E63696C223A7B226964223A22557365725461736B227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D34454238313431392D314141372D343937452D413545452D453541454631374335453042227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3138392E39393939393939393939393939372C2279223A3132362E30353130343034353136333330337D2C2275707065724C656674223A7B2278223A38392E39393939393939393939393939372C2279223A34362E30353130343034353136333330337D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D31434331333342322D343442312D343833302D394335392D374433353634433933334641222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C226173796E6368726F6E6F7573646566696E6974696F6E223A2266616C7365222C226578636C7573697665646566696E6974696F6E223A2266616C7365222C2273657175656E6365666C6F776F72646572223A22227D2C227374656E63696C223A7B226964223A224578636C757369766547617465776179227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D41323335414337362D354242452D344133382D383243342D313045453831414638343635227D2C7B227265736F757263654964223A227369642D44413934353339452D463639342D343041312D424534412D424343433144394244313144227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3237352C2279223A3130362E30353130343034353136333330337D2C2275707065724C656674223A7B2278223A3233342E39393939393939393939393939372C2279223A36362E30353130343034353136333330337D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D46363844434341302D463741342D343444342D394534342D353641363832443837454341222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22657865637574696F6E6C697374656E657273223A22227D2C227374656E63696C223A7B226964223A22456E644E6F6E654576656E74227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3334382C2279223A3130302E30353130343034353136333330347D2C2275707065724C656674223A7B2278223A3332302C2279223A37322E30353130343034353136333330347D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D36393442374132412D393841442D343530442D383146452D313135424335363237354244222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22657865637574696F6E6C697374656E657273223A22227D2C227374656E63696C223A7B226964223A22456E644E6F6E654576656E74227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3236392C2279223A3136337D2C2275707065724C656674223A7B2278223A3234312C2279223A3133357D7D2C22646F636B657273223A5B5D7D5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D37463032463244352D413642412D343233342D413732342D334638393844323335413442227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3539362E333439383035343232313539342C2279223A3137322E31303230383039303332363630387D2C2275707065724C656674223A7B2278223A3138342E37343130373732313432383638362C2279223A312E34323130383534373135323032303034652D31347D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D33453941414432332D343444412D344138352D383242442D443643383330413443343938222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D32333041443633362D423038332D344132412D383446342D464445353430464443314333227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3237332E38323738383237343432393137342C2279223A38362E30353130343034353136333330347D2C2275707065724C656674223A7B2278223A3233342E323333353534303139323935382C2279223A38362E30353130343034353136333330347D7D2C22646F636B657273223A5B7B2278223A31352C2279223A31357D2C7B2278223A35302C2279223A34307D5D2C22746172676574223A7B227265736F757263654964223A227369642D32333041443633362D423038332D344132412D383446342D464445353430464443314333227D7D2C7B227265736F757263654964223A227369642D41453541454438342D303734362D343738372D393836462D364137393237433334433334222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22E5908CE6848F222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22247B666C61673D3D747275657D222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D37363845453443392D333233432D343744422D423438302D344230323746333136433835227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3530392E35363538353533373434373936372C2279223A3234342E3134363035383632333436327D2C2275707065724C656674223A7B2278223A3431302E3533343738323038383137322C2279223A3234332E383533313435353137393831367D7D2C22646F636B657273223A5B7B2278223A32302E352C2279223A32302E357D2C7B2278223A34392E39393939393939393939393939352C2279223A33392E3939393939393939393939393938367D5D2C22746172676574223A7B227265736F757263654964223A227369642D37363845453443392D333233432D343744422D423438302D344230323746333136433835227D7D2C7B227265736F757263654964223A227369642D41323335414337362D354242452D344133382D383243342D313045453831414638343635222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22E5908CE6848F222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22247B666C61673D3D747275657D222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D46363844434341302D463741342D343444342D394534342D353641363832443837454341227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3530342E32343839303939393834363832362C2279223A38362E34323734383336353430383030367D2C2275707065724C656674223A7B2278223A3435392E36333934393434333031303534362C2279223A38362E31343333343732343931383630327D7D2C22646F636B657273223A5B7B2278223A32302E3530303030303030303030303031342C2279223A32302E357D2C7B2278223A31342C2279223A31347D5D2C22746172676574223A7B227265736F757263654964223A227369642D46363844434341302D463741342D343444342D394534342D353641363832443837454341227D7D2C7B227265736F757263654964223A227369642D44413934353339452D463639342D343041312D424534412D424343433144394244313144222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22E4B88DE5908CE6848F222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22247B666C61673D3D66616C73657D222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D36393442374132412D393841442D343530442D383146452D313135424335363237354244227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3434302E30383436333334333233383532362C2279223A3133342E333339333232313439353833337D2C2275707065724C656674223A7B2278223A3433392E38353834353834393631383834362C2279223A3130362E303930353433323636373635397D7D2C22646F636B657273223A5B7B2278223A32302E3530303030303030303030303031342C2279223A32302E357D2C7B2278223A31342C2279223A31347D5D2C22746172676574223A7B227265736F757263654964223A227369642D36393442374132412D393841442D343530442D383146452D313135424335363237354244227D7D2C7B227265736F757263654964223A227369642D35313046453036322D433042432D343643382D394231372D384133383037324132424336222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22E4B88DE5908CE6848F222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22247B666C61673D3D66616C73657D222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D42324633433135342D434432322D343230412D424538422D363836444534373531423731227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3339302E39383338303830363836333436332C2279223A3336372E38363338363638373439393039357D2C2275707065724C656674223A7B2278223A3339302E36363935373435363738313135342C2279223A3236342E34383130343334333933333531377D7D2C22646F636B657273223A5B7B2278223A32302E352C2279223A32302E3530303030303030303030303030347D2C7B2278223A35302E3030303030303030303030303131342C2279223A34307D5D2C22746172676574223A7B227265736F757263654964223A227369642D42324633433135342D434432322D343230412D424538422D363836444534373531423731227D7D2C7B227265736F757263654964223A227369642D38344442433035362D303639312D343733452D383243462D443332354546373336413732222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22E4B88DE5908CE6848F222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22247B666C61673D3D66616C73657D222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3337302E363730303939393039323233372C2279223A3234342E31303931303034353732383030387D2C2275707065724C656674223A7B2278223A3330352E33373533343134303839393932352C2279223A3234332E37393833303735333930383735357D7D2C22646F636B657273223A5B7B2278223A32302E352C2279223A32302E357D2C7B2278223A32302C2279223A32307D5D2C22746172676574223A7B227265736F757263654964223A227369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535227D7D2C7B227265736F757263654964223A227369642D30443039333043392D394241312D344636382D383545412D333834453136423430394130222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22E5908CE6848F222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22247B666C61673D3D747275657D222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365222C2273686F776469616D6F6E646D61726B6572223A66616C73657D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D30353145353938322D454646442D343337372D423137392D333730343841323346433232227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3238342E323935353338353539393932382C2279223A3232342E34393134393033323031333735337D2C2275707065724C656674223A7B2278223A3139332E35383236343937343733333034362C2279223A3137322E313532383934353937323330387D7D2C22646F636B657273223A5B7B2278223A32302E31363137303636333435343032382C2279223A312E323837353339313237343833333730337D2C7B2278223A362E3530383031393933353239333633372C2279223A3137302E38303635303532363235393035357D5D2C22746172676574223A7B227265736F757263654964223A227369642D30353145353938322D454646442D343337372D423137392D333730343841323346433232227D7D2C7B227265736F757263654964223A227369642D34454238313431392D314141372D343937452D413545452D453541454631374335453042222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D31434331333342322D343442312D343833302D394335392D374433353634433933334641227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3431392E333839353234303834323934342C2279223A38362E34363037373339383738363638347D2C2275707065724C656674223A7B2278223A3337352E333639393734303934323739332C2279223A38362E32373032313331363533393932347D7D2C22646F636B657273223A5B7B2278223A35302C2279223A34307D2C7B2278223A32302E3530303030303030303030303031342C2279223A32302E357D5D2C22746172676574223A7B227265736F757263654964223A227369642D31434331333342322D343442312D343833302D394335392D374433353634433933334641227D7D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A313230302C2279223A313035307D2C2275707065724C656674223A7B2278223A302C2279223A307D7D2C227374656E63696C736574223A7B2275726C223A227374656E63696C736574732F62706D6E322E302F62706D6E322E302E6A736F6E222C226E616D657370616365223A22687474703A2F2F6C656E6F73702E636E23227D2C227373657874656E73696F6E73223A5B5D7D, NULL); -INSERT INTO `act_ge_bytearray` VALUES ('142519', 14, 'source-extra', NULL, 0x89504E470D0A1A0A0000000D49484452000003BF00000221080600000086FB0D1D000000206348524D00007A26000080840000FA00000080E8000075300000EA6000003A98000017709CBA513C0000000467414D410000B18E7CFB5193000000017352474200AECE1CE900000006624B474400FF00FF00FFA0BDA793000000097048597300000EC400000EC401952B0E1B000020004944415478DAECDD097854D5F9C7F17726FB4A080989088208B20B620444145454A854AD08844544C5B58A50A46E55B0EE555BFBB7D52A5A5141826241C50A8A821659944D0908B21804214080908410B2FECF7B3213424820099964327C3FCF739FC9EC933377EEBDBF7B368700A7A0952B575E565454342E3737B77B767676A3C2C24207A50200288FC3E190D0D0D08C9090901F9C4EE7DF3B77EE3C935201807AB83DA708702AF9F2CB2F3B040505CD34C1F7EC264D9A38A3A2A2A4418306620E66281C0040B90A0B0B25333353D2D3D365E7CE9D66175294626E4EECD9B3E7B7940E00107E01AFF3BFFFFDEFB70505051F9C79E69901CD9A35B367F20100A8AA6DDBB6C9962D5B0A222222EE3CEFBCF326532200503FF85104385582AFB978AF73E7CE41717171045F0040B5698BA1989818A709C1FDEFBCF3CE6D93274F5E4DA90000E117A873F3E6CD6B6B2E3EEBD2A54BA81EB0000070B2020303253A3ADAB975EBD67EC3860DFB70EAD4A9BB291500F06E7474C4A9708032F9ACB3CE0A22F802006A527878B898FD4BB0F10EA50100845FA04E7DF6D9675D9C4EE739CD9A35F3A7340000354DC790F0F3F36BF5F9E79FF7A0340080F00BD41987C331F0F4D34F2FA48F2F00C0539A366D1AEC743A8750120040F805EA8C9F9F5FBFE8E8E8284A0200E029515151FE26FCF6A7240080F00BD49982828273E8EB0B00F0A4888808C9CFCF6F4D490000E117A84B814E27AB3900C0830753C5FB1976360040F8050000000080F00B0000000000E1170000000000C22F0000000000845F0000000000E1170000000000C22F0000000000845F000000000008BF0000000000107E010000000020FC020000000040F8050000000080F00B0000000020FC020000000040F8050000000080F00B0000000000E1170000000000C22F0000000000845F000000000008BF0000000000107E0100000000845F000000000008BF0000000000107E010000000020FC020000000040F8050000000080F00B0000000000E1170000000000C22F0000000080F00B0000000000E1170000000000C22F0000000000845F000000000008BF0000000000107E0100000000A80C7F8A00404D397CF8B07CB7E53BC94ECB16E761CEADD5967CFF7C713472C8392DCE91D3224EA34000000008BF003C65EFBEBDB2227985EC8DD92B07CE3A2087430E5328B52430275022D32365F5CAD5B2AFCD3EE910DF814201000020FC02A8695AE3BB3A79B56C3D73AB6487675320B52C373857D2E2D3242B324B6483485C789CC484C75030000000A5D02E11C0494BD99A227B62F6107CEB584E688EEC6BBC4F92372553180000006550F30BE0A4EDDABD4BD25BA69FF07121BB43242C254CFC33FCA5C8AF4872E27224F3EC4C29F42FA4106B48465486C4FE144B410000009441CD2F8093969B937BC23EBE213B43A4C10F0D24E04080388A1CE2CC774AE8AFA1D2E8BB46E22870508835F55D04E78A338F4D3B000000E117409D08DF126E436F59FE59FE12921A420101000080F00BA09E6F68729DE29F5D712F8B808C000A09000000845F00F5DB099B35D3E517000000845F000000000008BF0000000000107E01D4AD82A00229721455787F6120ED9E01000040F805E0035B9A43A71D2AF72E3BDF6FE31CCA08000000845F00F5DF810E07A420A4E098DB33DA66485E833C0A08000000845F00BEEB8423410300000035C09F2200E06901990112B93E52FC0EF91D735FE44F91E2CC734A668B4C4EC701000080F00BA0FE711439246C6B98846F09AFB886B750247C73B804EF0A9603ED0E486E542E0507000000C22F80FA21E0408034D8D0C05E566A6394E52FD1CBA325FB8C6CC96895412D3000000008BF00BC3FF8C62C8FB1B5BA55E1AE29F6CFF6977D5DF65190000000A831D4AD00A871B68973E1493E1F3849D9D9D9140200002841CD2F801A971B9D2B3B2FDF4941A0CE7CFFFDF7F2CC33CFC8030F3C209D3B77A64000000035BF0000DFB27CF972F9BFFFFB3FE9DFBFBFFCF39FFF9475EBD651280000809A5F0080EFF8EAABAF64DAB4693266CC185BE3DBBE7D7B79E18517E4E1871F96962D5B7AF4BDD7AF5F2FFEFEFE76294F7A7ABAA4A6A64ABF7EFDCABDFF89279E90112346488B162D243F3FBFC2D7010000845F00C0296CD1A24536F86A536777D04D484890912347DA26D07FFEF39F253E3EDE63EFBF74E9521B70BB74E952729BBE5F70707049385EB162C551E177E1C285F6322B2B4BC2C3C3ED750DC89B376F96DB6FBFDD7E7E000040F80500C0FAF0C30F65EEDCB947055FB7DEBD7B8B9F9F9F3CF5D453F2C8238F486C6CACC73E8706DF3E7DFA9404DAB4B43449494991EDDBB74BD3A64D252C2CECA8C7BB1F7BE79D77CA2BAFBC229B366DB24DB5274F9E2C39393925CF030000845FC0EBA4E6EE93CFD3BF936F337E941FB3B7CA9EBC74C92ECC91206780C4044449FBD0E6D235BC8D0C88EE29F181D11418709266CD9A25F3E7CF978913275658B3DBAB572FC9CBCB93C71F7FDCE301D85D9B5B9ABB29B39B06DB3973E6484C4C8CBD7EE18517DAE769D8BDEAAAABECDF5A53FCEBAFBFDAFF8B26D00000107E01AFF1F9FEE53275F767F2EBE13DD23DB29D5CD5E80219D774B00DB8A1CE601B80F7E765CA4F87B6C9E28C6419B1FE717BDFA0D84BE49A46BD2840A01A66CE9C295F7FFDB54C9A34E98481F6924B2E916DDBB6D900FCE4934F4A444484473E93D6FE6A187707DBD5AB57CBB5D75E6B9B33BB6953E8EBAFBF5E9292926C736777EDAE865C0DC09F7CF289ADFD8D8A8AF268F9EDDBB7CF8E8CAD8B968D5ED760AE9F4FCBA759B366D2B1634739F7DC733DDA641C0000C22F500F68D87D74EB1BB6C6F7BEA689727183CEE2E7F03BE6711A80438382E5F4A058B924AAAB3C7CC648F9FAC0F7F2E2AFEF49D2EEF9F24CCB3BA4791007974065BDF6DA6BB69970556A72B5FFAF863B0DBF1A98DDFD716B8ABBEFAEF6ED7DFAE9A7ED6D6FBDF596DC7DF7DDE53E5E3F8B8662773F6177C0D4D7F164F0D5A0ABC15B6B97BB76ED2ADDBA7593C18307DBF70C0D0DB59F2B33335376ECD8214B962CB127195AB76E6D1FE3E981C3000020FC025E68CEBEC5F2D42FEFC8CDF157C94D71FDCB0DBDC7A34159977776CF93A13F3E26F7371B4E2D3050C9E0BB65CB161B7CAB5A837BDB6DB7D9E76B1F60ED23AC61AFA6681F5FADBD2D5DCB6B77B6C769B65CBA9FB09B06664F282828B0A177F1E2C572F5D557CBD8B163252020E098C7E949015DF4A4828E9A7DEBADB7CA82050BE4B9E79E93EEDDBB4B6262628D9F38000080F00B78A905E92BE5F9ED49F272AB3F4897F0D627F55A3734BE5212C2DBCA9D9B5E90C385793238F6120A182887F6DBD5397CB579AE4E5F54DDA6CB1A805F7AE92579F1C51765C28409E506C0EAD2BEBD5A233D65CA14DBF4594780D69AD4F2E8FD5AFBAABEF8E20B3B389706650D98354DCB4CFFDF56AD5AD9105B95D0AF0386F5EDDBD7F69D9E3D7BB6AD351F3F7EBC47FB4E030050D39C140150755AE3FBD82F53645A9B474E3AF8BAB50B6D6E5FEFE59DB3E4C3BD8B2864A09CE0ABE1EDF0E1C3D5AAF12DEB8E3BEEB0A15783A0BE764DD1A0AB4D9E478D1A2503060CB0AF5F7AB0ABD221596DDDBA55DAB66D2B43860CB101586B81753A249DF7D71D8C6B22F86A60D5E6CDDAF4BBBAB5DD5ADBABB5BE1A84B5E67CCF9E3DAC980000C22FE0ABB48FAF36757EB1E53DB6FF6E4DD2D77BA5D5787976DB34D992B383C2064A05CA175E78C136DBD59ADA9A6872ABC1D7DDEC57A717D2D7AE09DAE7576B48DDB47677F9F2E576202BBDCF1D7C1F7BEC315BCB1B141464FBFAEAC0525A9BAA35C53ADAB3F613D6FFF964E9FFA5270DAEB8E20A1BC66B82865F1D955A3F5F45B5DA0000781B9A3D0355F450CA64DBC7B7A66A7CCBD21AE03B9B5C2B0FFFFC9A4C6F378902C7292F3B3BDB0E50A50151FB9E6A58D580A873E39675FBEDB71FD37FB6A2C76AE08D8E8E967BEEB9479E79E6193BBAB2BEBE36F1ADD60ED5045977B82D4D0791D2D19C6FB8E10679F3CD374BC2EF79E79D6743A44E83A4B5B2A56978D6E7FDED6F7F3BE9F2D33EBEDAD4B9A6826FE900AC7D9CF5F5B5961B00006FE74711C0978D1C3972524D8E4CAAD3197D99BE429E6A719BF83B3CF7F3E91CD64ADEDE3D5742FD82A56DE8195E5FCE3AF0D09E26347FF4168D7736F6991179DDC157A7DCD166CA818181F676ADF9D5DB3232326CB82D2C2CB4B7AF5DBB567EFBDBDF8AD379A461D3F3CF3F7F54F35C7DDE75D75D279D3A752A09AD3ACFAE4E2FB471E3463BAD4FE9E757D639E79C639B2F974743F6E8D1A34BA63FD2F7D4C7EAFBE86D1AD84B2FEEEFCFFDFF56978EEAFCDE7BEFC99831636AB45FB39B86EA37DE78C396A5A7A765AA0FDBC177DE79E731B64000E0BD68F60C5481CEE3ABD3190539033CFE5E0F341B6EA740AA0DB366CDB2CD326BAAD9274E4D35BD1E6960D5BEBDCD9B372FB746D63D28944ED5E3A64D705F7EF9E592EB8B162D929F7EFAA9E4BAD6CC6A70BEF4D24B8F7A2D0D863AF2B3865F13607CA64CB556569B27D7E488D6A569590E1C3850A64D9BC60F0000E0F568F60C5492CEE3BBF570AA9D9AA836F48CEC248FA6FCDBF631AEE9BEC56569CD903B0068EDD5E5975F2E6DDAB4F19AA94CF6A6EC95C0B04089882D1EE068C5FB2BA4F979CD25A665CC318FCDD89521E93BD2E58C738FAE312FCC2F94ECF46C098F09AFD27B17E416885F60F9B5FC8BDF5A2CDD8776AFF07EF7635AF66829F16DE2E5D735BFCAE99D4EB7B7EFDBB64FA29B45FBD46FC4BD1E69D0D240AA4D77ABBB1E69F0D5019534E00E1A34A8C2A6C8DA6459477DD6DA536D826BCB7CF162B9E69A6BE4B4D34EB35306951ECC4A3FCB5D77DD556E2DA87E6E0DC08F3FFEB87DEE95575EE935651A1212629B4957A54C75902B1D304BFB357BD225975C623FA74EEFE49EA71800006F44B367F8B49A6CF63C6BEFD712E1172A97459D576B9F7F67EE5EF935374DBA869FEDD1F7F9E0830F8A036261A1ECDCB9D3D696CD9D3B57525252EC4177A3468D8EDB0FD2D3CD9E43A342E5F5E1AF4BE7DF7616FF407F59F8CA42E93EBCFCA96016BDB1481C0E87C49D1D27DF257D678370DACF69F2DFA7FE2B7987F34A42F1C17D0725E5DB14D9BB75AFECFC71A7FCFCEDCFB274EA527BDFBACFD649E6EE4CF965D52FF2E3FC1FE5AC9E67D9DBD37F4D97E0C823A163F7C6DD927B28571A366D58725BD9C72C7B779974BEBAF8734FB9698A240C4A10A79F535E1BF29A741FD6DD7ED69A5657CD9EDDEB9186CD5F7EF9C5AE475F7EF9A5FCFAEBAF366C9E683D72DBB163873CFBECB3B629F2E0C1838FDB045943A0F69F3D74E890ECDDBB578A8A8AECEDAB57AF9675EBD6D941A6DCB769D3639D4AE878D308858585D9FBFFFDEF7FDBA6C975DD7CDC5DA6FA3FBACB544784D6323A51997EF3CD37B6D9748F1E3D3CFA19F5FBD1ED466666A69C7DF6D972AAA2D93300783F6A7E814AFA36E347B9AAD105B5FA9EDD22DAC9F43D5FC8E8F801B5FEFFEA7432CB962DB38B860077AD93F687ACEE8040D5A12155C36FB7A1DD2420284036FE6FA35CF5F0557260E7011B3283C2824A1EABB5B45AF37BD9BD97C9FA05EB8B83A6BFD3D6B286350A930B6FBAF048C8890EB30139796EB274B9A68B048707DB00DCFEF2F6F2DDBEEFA4E505C5A167DDE7EB4A9EB362E60A896F1B2F0E677160CDDC93693F83FB319B166DB2AFABEFAF35CD1AB60BF30A256D4B9AFD3FA29A4495D4126B6076BF8E2FD340F4D5575FD94583AA06CB8484840AD7239DF647FBF85E7DF5D5951EA0496B797FF8E10769D7AE9D242727DBDBB41678FFFEFD257D817544650DB6DAD7F74434243FF4D043F2E8A38FDACFA8359BDE242B2BABA44CF5FFD2705B5E996A595C7041ED6CB3F47BFDECB3CF6A7C502D000008BF401DF8317BABDCD72CB156DFF3EC9066E67D53EAFC7FD75A277710D683EDF6EDDBDB26A17AE98941744AD3A6C26BE7AD953697B4B181B6A8B0487E4DFE55367EBD519A7569265D071EE9EFB974DA52B9F28F57DAE6CD8BDF5C2CCD3A3713FF207FF9E4F14FA4C3951D6C20D530ECD6E0B406E217E0671FA3A1B420AFC006D91DC93B6C4D6D79F475DCB45659436C930E4DECF5B8D671D2A84523FBB706DFCC5D99367C854485D8DB97BEB3D47E367D4FB7C9C326CBF09787DB80EFEBB43FAE3BB4E91CBD3A48D2C5175F5CB21EB983EFD0A143AB1C3875B4E1BFFEF5AFB6E9B20E92654F8694EA27ABC15B1F53D91337B1B1B1B609F49FFFFC67FB9AC7AB2DAE4B7A92CA5DA61AEE3B77EE5C52A65A9E3A276F6D68D2A4891D5C0B0000C22FE003F6E4A54B6C40ED8E66DA3020420EEECD909933677AD5C1F6AA55ABECE20E099EAC5DD2B07A5AFBD36C8D6C695A935ABAFF6ECA772936B86A88DCF4CD2619F4C220C93F9C2F5FBFF6B50CFCCB401B9A678C9B216DFAB4B18159AF6B18D6C09B919A216929693694EAFBE86B9FDDBBB8F966E99A5FADD19DF7DC3C1BBAD5AE0DBB243C3ADC86E07DBFEC939C8C1CE93BAEAFBD4F6BA4835A06D960ADB5C1FA180DBE9BBFD92CD16714F7F5D5D7BA72C295351E7CB566D09BD699F2688DB0F6CDD5C5AEEB0D1BDA75AB3AC157E908CE3A4AF2CA952B8F1AE04A454646DAD7D44058153AD0D61FFFF8471BAA75D0A9B8B838AF2ED383070F1E55A6DAA45EFB4ED7463F5C3D99A1DF290000845FC0076417E648A8B3760780D2F78B48CE970F967CE0BD2705CCC1F5B7DF7E2B2DFAB5F0C8EB6B48AD88BB49AB6A717E0BB979CACDB2E1AB0D72FE90F3252B2DCB2EFD1FE85FF298A12F0D95590FCDB2E1579B1CFFF8C58FB649B23647D6005A999A5FED3FAC81556913EB3697B6B14177CB922DB2F797BD4707BC3D99F6F597BFB75CCE4F3CDFBE47A7AB8AA7D739907A40125F4A94C090C01A2F330D7FEE9313F5853651D690AA73C7569736B95DB06081ED835A7ADDD01A609DFEA83A7470291DFC4AFBDAD637DAD759478B764FE9E4495AB3AE35FB0000107E011FA041B4B603B0BE5F66477F19D8E41A8FBE8F7B509D13D19A24F7E0416E5A1BA6FD0DD324CD239F4D436AD69E2C1B4A5337A4DA5193D5C1BD07E5F48EA71FF5D8ED6BB6DBD0AACD8CB5FF6F5078906D32AD7FFB07FBDBA6D2DABFD7AD63FF8E92B5374B5AF56A6503ACD6CC96AEF9D57EC01A608F0ADCF98525B5C13BD7ED94D006A1F6B5F5EFC8F8C892C76918D6C1B734F0260C4E3826E436886FE091E0AB74D0A1BA1CF0AA3AB4E6579B2B6BD3FAEA3631D626CD5A7B5C3AF82ABDADEC7A5B591B366CB08339697FF7BAA8F9AD4C99EAEF5297B2FFB79E04D0FED0B54183AFB78C0E0F0000E1173849DAE4599B3E370FAABDA93CF6E7654A58A348B9FED2EBEBEC00BB74E0D54BEDFFA835491A06B47FA1F6D59C3F7FBEC7C26F6CCBE2699E34446AB3620D99DAFC58A73ADAB3F9C808D35A433CFBE1D9B66FF0B9D79D5BD20F57BD3DFA6D19F9FAC8639A4E977EAE8EECDCF692B63628BB9B43EFDFBE5F0EEE3F2851A71F69EEAECDB0DDAF53BAE6578372E99A5F1D304B97997F3C7EF363AD9DAEEAF44B27A273D99E4C0D6A6D84DFF2D623779F5F0DC1D569FAFCE1871F96F4F72D4DFBACBFF2CA2B72DF7DF755E9F5F4F3FCE52F7F915B6EB9457AF6EC5927DB9DCAFC36DD4BD932D526DBB515D8B5C9B3367D060080F00BF88076A1CDEDA057B5197E7F3AB4CDBC6F8B5AFF5FB506CD3D58901E546B8D8E1E4C6BDF5E3DB8D683ECDAE01EE04AFBE416362DB4CD95577EB0D2DEA7FD6D359CEA3CBAC3FE31CCD6108FF9EF187BA9E15547856E7D51EB0A5F5B43AED6E06E5EBCD986081D195A03F0E1ECC3B27BD36E1BB6B5E638A441C851CFD39AE7F26A7E752E621D3DFA8421614FA6ED1F5C12B0566C3D6A102D5F76A2F548FBD83EF2C823767E5F559500AC53FF7CF2C927929B9B7BE44445A9E6CF3AF5918E7EDCB163C74ABD9E36E77FE6996764C4881175167CCBDD69FBFBDB305F99DFA696A706F8DAE8F3ABE5AFFDAE010020FC023EA05B643B599C912CFD1AD6DEA8AFDF66FE68A73BAA6D1A7CDDD3D2E8F4295DBB76F5F8A8CE65E564E6D8519AC7CE1D2B2B3E582105F9C561DC3DBAF3EA0F57CB75CF5C676B4E6D58D9BC473E7BE133898C8B9433BB9D59612DEF8EB53B6CAD704E568E0DB9EEE0ACCEEC7E667140DD9D696B6D75A02A7D7C695AEBEC56BAE6B72C6D429D7B3057F20EE515071513E2B7FFB05D56CF5E2D17DD7A917D7FA503616D5BBDAD64102D5F0CBC55598F3440E908CB1A807500A7CA4E9DF3AF7FFDCB3EBEF4FBEA929E9E5EB24EBFF4D24BF2EAABAF9EF8044566A67D7F9D63D8DBA639D2E05BD932D5A0AF0375D5C648D5DA5C5DA79A020080F00BF880CBA3CE9737523F9182A202F173D4CE3CB79FEF5F2E6FB579A8D6FE47AD35D211717BF7EE6D2F6BAB86B7DCD014112CE3BF1C6FFF3EEB82B3E4F3BF7D2EDF7FF47D49903CADDD69F6EFDE77F6B697B167C54ABF3FF62B996A68CD276B6C13650DB6DACFD75D5B9B9B9D2B118D23242236A224C86A1F5FED1BEC6E7EAC4D98B546D686F08C1C3B976F74B3E8634F12E415D8F0AA531C1D539651A17664670DE5EE707CCDE3D794D4F2F6BAA5972C9DBAD4F651D6E9927CC9C9AE473A82B8CEB3FBF8E38FDB66CC1A428F67CE9C39B6E6B1749F570D7E3AF54F4A4A8AADFDB4272B3232E4F5D75F97D1A34757F85AEE1A5F1D39DA9B826F75CA5483F1F4E9D3252F2FCFA327AFF4C482866C3D69010000E117F001F181D1B6C9F3D707BE974BA2BA7AFCFD1667AC91D88006727A50ACC7DF4BC385060EAD21AAED1ADECAD0409BF8F7C44A3DCECD3DAA7265680D6FB7A1DDAAFCB97A0CEF61E707AE887E86D29FA374F3E68A6AA6EBB39A5C8FF475DC4DA035BCE97CB5E5CDD1AB35BB1A7E4BD7FA6A9FE7DB6EBBCD7E86FBEFBFDF8E22ADC1577DFDF5D7D2AF5F3F69DAB4E931AFA5415B836FEBD6AD2B5DE3ECCD651A1D1D2D6DDBB6952FBFFCD2CECBED293AC2768B162D6AA57935000027C34911009537A2F115F2FCF6245BFBEB69FA3E898D6B67D0A2DFFDEE7776901C6F0CBEDEEC78C1F75454D3EB91BB06586B15274F9E5CD20FBDB4BFFFFDEF72E8D0A192EBFADE43860CB1832F69F3E061C3861D350AB106E9679F7DF698D7D1DB35F8EA28D9B7DE7A6BB941BB3E96A99E34F8E8A38FCA1D08AC26E828CF3A2897BE0F0000845FC0875CDE30411AFA47C89BBB3EF5E8FBBCB37B9E0439026440F405143A4E691A80274E9C689B2F970DC01A8A5353538F1AE44AE7E42D3DD2B5D6986A4DAED682BAE99CC23A3856E900A7A34C3769D244EEB8E30EAF09BE3541FB50EB805D3367CEF4C8EBCF9E3DDB96715D4CAD050000E117F0B067CFBC43FE9DFA89ACCEDAE891D7D711A55FD9315B9E3CF3B65AEB5B0C78B3A8A82879F4D1476DBFDE175F7CD106606DEEFCC20B2F940C68E576EFBDF71EF37CADFDDDB7EFC808DBFAFCA953A7DADBDC0361694DB137D5F8D624AD95DDB469937CFA69CD9EB4D3E6CE3A8A36B5BE0080FA823EBF4015691FDC87CEB841C66E7949A6B579A446FBE4FE7A788FDCB9E905B9BFD9706919DC84C2065C748027ED03AC8157C3EAEF7FFF7B3B98536568AD6F458FD551A2B5C9F38409137C32F82AFDBFC68E1D2B93264DB2D7FBF7EF5F23C157C3B4965BE966E5000078336A7E816A1810DD53C6341928C3373C5E6335C05AE3ABAF3734F632B9A6512F0A192843FBBD8E1F3FDE86D5E79E7BCE36573E19494949B6F657039CAFF777D713001A7E972C59226FBFFD76B5CB4E9FA7E5366FDE3C5B6EDA2C1D0000C22FE0E3AE8BE92DF7354D94DB363E27AFA7CE39A941B0B48FEF2D3F3D6303F5EDA75D43E102C709C05A8BA9CD947524E8EA86B869D3A6C9BA75EBEC6B9D2A03BD6900D6FED35A13AC271134C09637885879F4715ADB3B6EDC385BE61AA409BE0080FA8666CFC049D01AE073C35ACB4329936556DAD7B6B9F2C50D3A57FAF93A9DD1DF7E7DDFFC109D32B5ED233475062A1980EFB9E71E79EDB5D76C087BF8E1876D18AEAC59B366C99A356BEC734FB526BB1A7C870F37DBA98B2FB62700B4165707AC4A4848B0D33FE9B450DAC45C036E6666A61D504C6B8B57AD5A6507CFFAC31FFE600710030080F00B9C82B4CFEF5B6D1E92B9FB97C91BA99FC8A35BDFB001F8A2C8CE72766853890D88925067B06417E6C8FEBC4CD99CB343966424CBE7FB97DB797CDDCD9C19DC0AA81A9DCB5703B0865FED0F5C999A480DBE5A83A9A33B9FCA7D5535C83EF0C003B6D9F7CA952BE5ABAFBE92EDDBB7DB01C434F86AD9E809051D01BB63C78E72F5D557338F2F0080F00BA058BF86DDED929ABBCF06E18FF62E9235DBB6485A5EBA1C2ECC932067809D26A95D680BE916D1CE06E69A1C2C0B385503F0942953E4F1C71FB773021F2FA0CD9F3F5F3EFBEC33F9F39FFF5CA59A625FA64DA1756AA8D2D343010040F8055029F181D1322AAEBF5D0078DEA851A36C935DED035C5100D69ACD8F3EFAC8D676D2571500805313035E0100EA3DADB91C3C78B09D0F78CB962D47DDB77CF972DBBF558371F3E6CD292C000008BF0000D45FBD7AF5B28339697F5E1DC9592D5BB64CDE78E30D5BE34B9F5500004E6D347B0600F88CDEBD7B4B585898FCF5AF7F95B8B838D9B56B971DA1B865CB96140E0000A7386A7E01003E45A7ED39F7DC736DF367BD6CDFBE3D8502000008BF0000DFA3B5BEA52F01000008BF00009F939F9F6F2F030202280C000040F80500F8A68C8C0C7B1919194961000000C22F00C03715161616EFE49CECE6000000E1170000000040F80500A07E4A4F4FB7975151511406000020FC02007C535E5E9EBD64C02B000040F8050078B5ACAC2C993061C231B7A7A5A5C9A041832435359542020000845F0040FDB57AF56A090F0F97B3CE3AABA409B3DB942953E4F1C71F97F8F8F80A9F4FCD2F000028CB9F220000789B175E7841DE7CF34D69DBB6AD3CF9E493929C9C6CC370AB56ADE4C61B6F94EDDBB7CBA64D9B64C08001E53E3F3333D35E46444450980000C0A2E61700E075AEBAEA2A19376E9C6DDAAC7FDF7FFFFDF2DC73CF499B366D6C20EED1A3877CF3CD37153EBFA0A0C05EFAF9F95198000080F00B00F03E5AA3ABFD7A1F7EF8E172FBF53EFFFCF39293932341414114160000A8349A3D0300BCCAA2458B6C13E7E0E060E9D8B163C9ED7ADB575F7D25975D7659C914461F7EF8A124252555F85A63C68C39EAFAC08103E5FAEBAFA7900100380551F30B00F02AA3468DB2E1F6C1071F94F5EBD797DC1E131323C3870F973E7DFA88BFBFBF1C3E7C585AB46851A5D73EDE20590000C0B751F30B00F03A5ACBFBCA2BAFC8C2850B6D13686DE69C9292629B41CF983143F2F3F3E5CA2BAF94CE9D3BDB41ADDC035C1D8F3693EEDEBD3B850B0000E11700AA27242444427342253B389BC2A863813981E20870D4FBFF43C3AD9B065FBDAE41586B7F75B467BDD481AF544242822C58B040020303253737B7C2D7D426D44CF642C5FD00002000494441547D040000E11700AA2D363656CECE3C5B5607AFA630EA58C3030D25BA6174BDFF3FFAF5EB672FB3B2B264C4881147DDA761F89E7BEEB135BFDA7FF7820B2EB0E1B7A8A8E8B8AF79E9A597B282000040F80580EA6BDEBCB9ECFA76979C1579966C0EDA4C81D491E09C6089DB1D276D12DAF8CCFFD4B76FDF63FFCFE060DB24DA5D3BAC35C0DA47383D3DBDC2D7D15A61774D310000383531E0158093A67D293B74E8200D363690F3D3CE9726B94DCCC685CD4B6D093F1C2E6DF6B491B69BDA4AA7F69D243434D47702BD09BAE5D101AFDCF7695366EDFBAB2A9AD757E705F6A5720100005547CD2F801A111D1D2DDDBA7593CD9B374BD1A6226978A82185524BB456B361C38672D67967F944C09B33678E9DD2282C2CACE4B6A64D9BDAC05B9AD60AEBEDEAE28B2FB6CFA948D7AE5D5951000020FC0240CDD01AE0F6EDDB53103829AD5AB5B2CD98DDC1569B37EB28CFA507C15ABD7AB5EDF73B6BD62C7BBD4D9B3636F8676767977B7280F00B000008BF0000AFA2CD9935F8CE9E3D5BAEBDF65A7B5D9B2D97AEF9D581B0F436376DEE7CD14517C9BC79F3C4E9744A616161C97D5DBA74619467000040F8050078A73E7DFAD8CBA4A42459BB76ADFD7BD3A64DB6B65783AF4E7754DA39E79C63C36F593D7BF6A430010000E11700E09DB4E9B3D2797CEFBBEF3EFBF79429538E09BD6E3AE895F63DDFB76F5FC96D5A6BDCA953270A130000301C2B00C0BB68FFDEF8F8F82A3F4F9B3E970DBA5A1BCC28CF00004051F30B00F02A393939B6C676FBF6EDB6EFEFFAF5EB65E1C285F6BEEFBFFFDE36876ED1A245B9CF2D3BEAB3F60306000020FC0200BC7707E51AE0EAFAEBAFB74DA0F5BAD60A87878757F89CD6AD5B1F75DD3DFF2F000000E11700E055742467EDDBABB4D65769E02DDBD757AF77ECD8F1A8DB7454E7264D9AC88E1D3B24363696519E010000E11700E09DB496372D2DED9840AC8B9BCEF9ABC158C3AF0E70A5CDA175D9B66D5BC9730F1C382063C68C9166CD9AD9C79D7BEEB9D5EA4B0C000008BF0000D4B85EBD7AD9E54434E83EF7DC73360477EDDA55BA75EB2683070FB6E15907B9D2BEC3999999B61678C992253273E64CDB2C5A1FD3B2654B0A1A0000C22F0000754B6B76DD7D7ECB2A2828B073FF2E5EBC58AEBEFA6A193B766CB9CD9B75D02C5DB4F9B3F6FDBDF5D65B65C18205363077EFDE5D121313EDFD000080F00B0040AD9B306182FCFEF7BF3F6A44671DE86AD0A041D2BF7F7F5BA3DBAA552B1B62AB328D914E85D4B76F5F5BAB3C7BF66C993469928C1F3FDE86630000E0FB98E71700E055860F1F7ED475AD05BEE79E7BE40F7FF8830DC1DABC79E4C891D59EBF576B7BB5D65783F0534F3D257BF6ECA1D0010020FC020050BBB4CF6E69FFF8C73FE491471E9155AB56C915575C2103060CA891F7D1F07BD55557C90B2FBC606B93010000E11700803A919E9E6E43EA9A356B6C53E79A0ABEA50370972E5D6C1F62000040F80500A0D6E894460F3EF8A06CDAB449E6CC9923EBD6AD93FFFCE73F121717270B172E2C59B66FDF5E23EF77EDB5D7CAB265CB64EBD6AD143E00003E8C01AF00005E45E7E9EDDDBBB7DC79E79D929C9C2CE79F7FBE0DBE3A5D51695A2BDCB469D3937E3FED033C70E04099366D9A3CF4D0437C010000107E0100A81D23468C903BEEB843A64E9D6A03E937DF7C23CD9A35F3D8FB5D72C925F2DE7BEFD901B5E2E3E3F9020000F041347B0600789DF0F0707BA941546B8075A4E79494148FBD9F4E8394909020CB972FA7F0010020FC020050BBB4D9F3A5975E2A93274F96575F7DD54E7BE429DDBB77971F7FFC9142070080F00B0040EDD041AF940E42D5BC79733BFDD1C48913ED00589ED2A44913D9B66D1B850F0000E1170000CFEBD1A34749B3671DD42A3232D2FEAD0353E97D9EAAFD8D888890CCCC4CBE0000007C14035E0100BC8A865CB79C9C1C090D0D2DB9EEC9C1A8F47DF5FD0000806FA2E61700E0D541383B3BBB56DE4B836FE9E00D000008BF0000D40AEDEB9B9191512BEFA54D9EB5E933000020FC020050AB74B02B1DF4AA36ECD8B1C3A37309030000C22F0000E5EAD8B163ADCDBDBB6CD93269D7AE1D850E0000E1170080DAD5B56B5759B972A5E4E5E579F47D0A0A0A6CC84E4848A0D0010020FC020050BBA2A3A3A56DDBB6F2E5975F7AF47D162C58202D5AB4F0E868D2000080F00B004085121313E5A38F3EF2D8A8CF3ACAF3071F7C60DF070000107E0100A8133A0855CF9E3D65E6CC991E79FDD9B3674BF7EEDDA565CB9614360000845F0000EA8ED6CA6EDAB4493EFDF4D31A7D5D6DEEBC7AF56A6A7D010020FC020050F7FCFCFC64ECD8B136FCD65400D6E0ABAF357EFC78090E0EA690010020FC020050F774F0AB499326C992254BE4EDB7DFB67D75AB439F97949424F3E6CD93091326486C6C2C850B0000E1170000EF0AC013274EB435C15A63AB0156A729AA0C7D9CD6F68E1B37CE06600DD2045F00004E1DFE140100A03ED1E03B7CF870B9F8E28B65DAB469B6165707ACD2397A9B366D2A919191121A1A6A036E6666A6A4A6A6DADAE255AB56D9C1B3FEF0873F48EBD6AD2948000008BF804F395C585818E474D2C801F0351A641F78E001D9B76F9FAC5CB952BEFAEA2BD9BE7DBBA4A7A7DBE0ABFD78232222A4499326D2B16347B9FAEAAB99C7171E61F6337A5140490000E117A84BDFEDDFBFBF4DA3468D68DB08F8286D0ADDB76F5FBB0075213333B3C0E170FC4049008077A33A0CBE6EE1EEDDBBB7530C00004F494B4BDB5E5454F405250100845FA0CE9883910F5253534F3397F9940600C013B66FDFEE672E3EA0240080F00BD4992BAEB862754141C1EA8D1B372EA7340000356DCB962D9BF3F2F2365C7EF9E54B290D0020FC0275AAB0B070DC2FBFFCD272FFFEFD347F0600D4984CE3E79F7F6E60F63363290D00F07E7E14017CDDD4A953D36EBCF1C6D5A9A9A9BF8D8A8ACA0A090989A4540000271B7C972F5F9E51545474EB15575CB188120100C22FE015DE7EFBED2D23478E4CDEB163C7D0DCDCDCEF1A356AD4D4E170D0F2010050659B366D5AB176EDDA30F3E7AD7DFBF69D43890000E117F0BA003C62C4888F3233332FDBBA756BF8C18307576CD9B2C53179F2E406E63687CE071A1A1A2ACC098C53D99E3D7BE4D34F3F95D8D858090B0BA34000299EC7373D3D7DBBD977FC989C9C9CB76FDFBE1DE6B661D4F80240FDE2A008702AFAECB3CFBA381C8E81B366CD1A630E624A9A4107040448545494346EDCB8E45243B1DE0E9C0A56AE5C29AB56AD9273CF3D57BA76ED4A8100C574C680D5665968960F18DC0A0008BF40BD337CF8F01E0505054B4EF0B002B3AC3561799DB95C6696F54141414BA74C99924E09C2D72426264E321713CDF2585252D2244A040000F80A9A3DE394B666CD9AED1D3B767CCB04DBEBCDD58A06C2D276D07166E968967E6619919F9FFF8079DE1D1D3A74E8B576EDDA1994247C8559AFFB980B5DBE4A4E4E5E48890000005F41E7469CF2929292529C4EE705E6CF942A3E35DE84E66B294100000080F00BD40BD3A64DD339802FA96A0036C199AE0300000000E117A83FB406D8CFCFEFA2CA06E0A2A2A27C4A0D00000020FC02F58ED600BB02F0D6133D76C68C190C010D000000107E81FA1B80A578C09FE306E0C4C4C48F870C19D291120300000008BF40BDE46A02DDCBE1706C29E7EE22B364996580B9FF3B9D1A66D0A041E1941A00000040F805EA1DAD012E2A2ABACCFCF96B9960EC34C1B89DF973AE5982CD32D15CDF6842F07D7DFAF4F1A7E400000000C22F50AF680DB0B9E865966D6583B1B9AFBF148F10BDC82CF166792E3E3E7E8909C17D2839000000C0BBF85104C0F1252727A777ECD87196F9738409BC6165EE4B31CB9B9D3A75D2DAE1AE66696B96511D3A74E8626EDB6CEEDB4109A23E31EB7A1F29EEF3FE95597F175222000080F00B9C6201B873E7CED3D7AC599351C1FD2B131212DECCCFCFD766CFE7381C8E73CCE548132402CCEDAB8D1C4A11845F000000C22FE0F52A0ABE6E1A704D58F8BC5DBB766F9AF0DBCA2C3A12741F1388479B40516442F04AF318E60606E117000080F00BD47FEBD6ADCB5ABB76ED0C1322BE32577B98E50CB35C6142703F73DB466D2A4D2981F00B000040F8057C8286DC98989857C3C3C37F365713C4D51FD8848B1E9D3A755A61EE4FA39440F805000020FC02F55E4A4A4AA10910AB4DD87D478A4757D7BEC0EDCD32DADC16DEAE5DBB65EBD6ADCBA5A440F805000020FC02F59E0911D9DA1FB873E7CEEF1415159DE10AC0173B9DCE61266C1CD0804C2981F00B000040F8057C820E9A6502C5FBEDDBB75FE270387A9A9B5A9AE55A1338AE37B76D5CBB76ED164A09845F000000C22FE01334E4C6C4C4BC121E1EBEB3A8A8A89709C2679845A7464AE8D4A9D32AFA0383F00B000040F8057C82AB3FF0F2F3CF3FFFD5828202BD494786D641B1746AA48076EDDA2DA73F3008BF000000845FC027B8E607FEA253A74EEF9BABF1523C28561FFA0383F00B000040F8057C8E3675D6FEC0A5E6076E25DED31F38DE15887EE29B22FC020000107E01D44408B6F303474444EC97E2F9815B78417FE0A7CD72403F8B59B69B85E6D8845F000000C22F8093E3EA0FBC34212161727E7E7E94B9A98BD45D7FE08EAEF77FD62CEBCD72B1144FD5442D30E117000080F00BE0E4B9FA037F6202C93BE6AABF59BA99E5D25AEE0FFC86591E7705DE40B32C37CB2F6619609670B3ECE09B22FC020000107E019C341342D2CDF2E939E79CF371515191D6006B4D6C6DF407D666D73A14F57FCD926D962CB3F435CB3E5708769AE50A291EA42B996F8AF00B0000E0AD9C1401507FBCFBEEBBAB9392922E71381CBF33575334AB389DCECF1313135F193E7C78530FBCE5ED66F9872B043F679618B3CC318BBE978E4E9D2FC50373C5F0ED000000C09B51F30BD443C9C9C9EB1312125ECDCFCF2F282A2AEA62C2702F73795BC78E1D836AB03FF008B3AC90E2BEBD6F99E55E57C8EDE90ABD7F334BB4596E31CBFD6629E49BA9FFA8F9050000BE8A9A5FA09E9A32654A4E5252D224A7D3D9DA5C9D6A9660B34CF4F3F35B93989838EA245F5EFBF25E6596F9AE10AC035DA54A715367BDEF3257007ED82C8FB9FE76D35AE278D7DF7AE9CFB705000080BA46CD2F50CF252727679B6596AB3FB08ECCACFD6F4FB63FF03FCDF292144F6B146996196619EC0ABE774A7173E8AE523C12F49BAEE7685FE00CB36C72DDDECB157E2F768566D403D4FC0200005FE5A0084E0D0B162C689A979F77BFF8C9404781E3344AA4D6EC32CBAC82828217FAF5EBB7A936DE70C89021031C0E8706D716AE9B669A65425252524A155E4683EBA2726ED7F97EE7994543D1FFCC32488A6B84DD125C0159F5308BCE499C23C535D3A80712131327998B8966794C5B1650223EBE5F28C89B608E04AE77143A9A5022B5A3488A763BC4F19FDADC2F000008BFA78CCFBFFCFCCA7CC97F7F7FE3FD21071A1EF03F1C729842A92581398187635263BE6DB8B7614B1348EFE8DBB7EF9CDA78DF41830685FBFBFB3F5C545474B72B8CE698F77F313F3FFFC9F7DF7F3FAB06DEE20EB3E8FCC3CF94B95D6B819F74055F0DBDDA6C5A07CA5A6696E6667984B582F08BBA377FFEFCBEF98EFC99FBE2F60599FD4230FB855ADC2F1C0E2C88D915F343D49EA838A7C3797B6DED170000347BF6797A663FD791BB785BAB6D61E98DD29D050105144A2D2AF02FF0CF8CCA6C7E30F2E08F0DF634183A7CF8F08FA74E9DBACFD3EFAB035E2527277FD1B973E7774C00D641A9B446B697D3E91CDCA143879FD7AE5DFB53355E5643F4A552DC145A07BBD2E6CFA5FBFA8E35CB41296EF6ACFD7CB5B9F548B37C60968FCCB2CA1588E1C568F67C6AEC17F21C798B7E69FD4B84D92FF8B35FA8F5FD8233B341E669590DB276344C6B789DD92F7C541BFB050000035EF9BCF4D0F4A9FB1BEF0FCE0ECFA630EA9029FFEE99D1993F98F0F9786DBEEFB469D3B6272525DDE470382E322178B5B9A995F9FBE3C4C4C44F870C19D2B18A2FA735C617BA42EC936582ACD6020F94E2699174EAA314291E806BA1EB3E1D346B346B0250F7B282B25EDE17B72F8CFD42DD3A1476A8CDFE98FDBFD4F67E010008BFF059C187827B1C883A70E207168A04A6074AE0BE4071E6B35A78C2AED37669F0EC5317EF3D7DFAF4453366CC38D7BCFF0D525C33DBCFFCBDCA04E0C9559C1FF859B35C2EC573FDBA69FFE070D77DFA779AEBF616AEBFB59FF04C57580E664D00EA56406EC0A595D92F388A1C47F60BB9EC173C212D2EAD435DED1700E054C41424BEFE05E7F9079DA82F57D8D630094F092F39B829F22B92CCB332E560F38314600DCA0DC93DBBAE3F8309C153FBF4E99374DA69A73D5E5454749F39E81A5D505030223131F1D9E0E0E06774FAA413BC44966B71D33EBE3A17B03685BED22CE3CCF227B3682DB34E8FA4A3423FE80ABEFF602DF02E43860C79C0AC034F5770F744B35E4C2C731BFD807D805F9E5F5855F70B7AAAFC60B38392D93A538A1C4514624DED1782737534FD484A02006A07A7724F71C1A9C112F953E45167F51D050E7B5BC8CE100AC8072D5CB830DF84E0074DE86D67824F92B8E607CEC9C9593574E8D07E557CB99B5CA156FB00BBE7FBED6096D9AED7D5652EA5EEA53B00A77375551E6FD61746A63D45F70BDA3A480371D8CF6114100080F08BFA293435B4C2FB4276107E7DD9FBEFBFBFC984E0A14545451748F13CBC6DCDDF9F9A00FCF9B061C3BA54F1E56E35CBF566D1F0AC4DABB59F6F8A59DEA0A4BD97F9FEF5C4445A651E6BD68DF4A0A0A09994DA29BE5FE0A4280080F08BFACAEF60C5037EFB1FA255FCA960C68C194B939292CE77F5074E3521A76F6161E1778989896F0E1A3428BE922FA301EA5F52DC245A9BD13EECBA6D3C25ECDDCCF73DBB920F5D588966F1F0F5FD4236FB050000E117F5940E680228ED0F5C5050D05A8E345F1EE5E7E7F7F3D0A1439FD679832BF9328BA4B8DFEF0CD7756DF61C4EE97A75F89D51C987528BCF7E010000C22F00DFF0FEFBEF67E9804626F4B676F70736E1E801735D47861E5085975AEEBAFC9D1C3D4016BC4C6868A89EB0483DC1C3B242424216515A000080F08B7AEB78A37632A2E7A94BE7072ED31FD83D3FF0826AF40786177335653ED1A06433CDE3D2292DF60BEC170000845FD45B79E17915DE57105640019DE2CAF607364B9FC2C2C255DA1FB88AF303C3BBBD7582FB3FA188D82FB05F0000107E51AF65B5CE92FCD0FC636ED7DB32CFCCA4806095E90FAC3585A3CCF58D26043F376AD4A8284AA87E4B4D4D5DA4A33957B499080E0E9E4329B15F280C2C948CB33328200000E117F5931EE0E446E51E73BBDE96D7208F024289F2FA039BE5BE9C9C9C1F870E1D7A2D25547FE9DCCFE63B9D5AC1DD7319E599FD82BD3D3C5F0E373A4C01010008BFA8A72B40BE53020E061C737B406680BD0F28AB9CFEC0F1E6EF59DA1FD82C099450FD64BEC37915DC3583D239B5380A1CE5EE17740A24BF437E14100080F08BFA2738355862FF172B0107CA0FBF7A5FE88E50A6BD40F989A89CFEC066B1F3039BA5052554BFECDAB54B07BDDA5E2610A7070707CFA7744EA1FDC26EB35F5852FE7EC1EFB09F345EDC58C253C2D92F000008BFA81FF400267A75B4345CD3F0B8B5BB7A5F83B50D247A653467FB51A1F2FA039BE5C7214386FC8DFEC0F587367D361747055D87C3319F519E4F918301B3BDD77D42C3EF1B1E7F7B5F2812B131426296C6D893A40000107EE1B5C2B68549EC37B112B427A8D2CF09DC17686B02C2B6865180285779FD81CDE5D89C9C9C8D2604275242F5C65B65C2EF348AC4F785EC0EB1FB056D0D5459FE59FED268592389D81C412D300080F00BEF14B93ED2F6E7AA2A7D4EE44F9114208EAB9CFEC03126404D4F4C4CFC9F09C13DF431D4067BAFE0E0E0A5A5AF070505CDA5547C5FC44F11E2CCADFAE18086DEF02DE1E2CCE15002A82AF68500E117B520373AF7A416A032CAE90FDCCBFCBD64E8D0A15FE6E4E4EC3797FD2825EFE31AD579BDFBFAE1C387FB502ABE4F47F63F99FD42915F11850854C1E8D1A37FC3BE10A81BFE14C1A965EF797B2904D41AED0F3C68D0A0D97E7E7EF799AB0F1615155D72DA69A715ECDEBD7BE6B061C37ABDFBEEBBAB2925EF121414F47C7E7EFE6BAD5BB74EFBF1C71FB5D6FEF2A4A4A4E5948CEFDADF693F8500D492BBEEBAABE7A143876675EFDE7DDBD2A54BD9C602B58C9A5F001EA5FD819D4EA706E0C39D3A752AFCE31FFFE8376EDC381D29E77F4C8DE45D6EBCF1C6ABCCC52BB7DE7AAB73E2C4898D478C18F193C3E1983368D0A056940E009CFC36F6E0C1830BCD65E0D8B1639BB18D0508BF007CCCD0A143DB9A9DFBC251A346F93DF4D043CEF8F87839EFBCF3026FB9E516A7BFBFFF275E322D528C59EE2875BD8B59F460A445054B5BB31CAFB9DA9F5C8F53F5A25FD74D37DDD4BBA8A8E83F7A62A277EFDEF6B601030674EBD7AFDF4EF33DCD370767F11EFE085ADEE1C7B95F47633ADEC9927EAED750B46A02C036B666B7B17DCD12CF3616F51D2B2F008FD1601B1414F4C575D75D17D6B76FDFA3B637975E7A69A85E4E993265B1795CCFA4A4A4140F7D0C0D9F3AE2748EEB7A9A2BBC5E6896BF977ADC7AD7CE3FC7157EF5726905AFA9F79F6796B9650E0C74BAA08E660972BDA70E91DE548A47515EE8ADDFD36DB7DD76456161E147B7DF7E7B60E7CE9D8FBA6FE4C8915DD2D3D3D72C5EBCF85373707691D6E47BE863E84197BEF9BC0AEED7832E3D622CDD3C7080EBC445B0EBFE04D7F7A8DFEDB4328F058053791BDBCB2C6D6A601BBB896D2C08BF1ED46AE9F0A6457EF9D78648F0150552704E415161E342290C7138E4B0439CBB0BA560455191E31B47A15FD2A61ED3B6F39502DE137C838383BFF9CD6F7ED3F8B7BFFD6DB9DB1A0DC03939398EE9D3A72F328FEFE5A100ACF3D4FEABCC6DC3CDF2E40976DCA9AE305BFAB3B7708559DDD61C2CF3F8F9A55EFB4157E8BEC52C37B90E1CDCCFF32A37DC70C395870F1FFEF8EEBBEF0E484828FFA4FF9831633A656464FCB876EDDAE97DFAF4F99D6B4EE09A96EA2AA785E59CBCE8EB3A11D1B6CC7D735C976F9A659CEBEFA75D7FEBC90BADE5C8E2D708806DACB5816D2C08BF5EEAAC6543AF8D0E8878D8298ED63D1B7428BCA261B78667873493F8C0680975064B76614ED0FEBCCC663F1CDCEC98B36F71ABFF1DF8616CAB6F13378A38DED8D46DFA54BE5AA0EEE8140E0E8763C1E5975FDE78D0A041C7DDCE98701C92959515F6D1471F2D3101F8020FD600BB69D3AF6BA5F8ACF589C4B8C2B35B8A6B6951EA360D6C7DE448CDF257525CFBAB61F70BD77D7A4071BA591E73056AAFE01A78E5233D28EBDAB5EB711FFBE0830FB69B306142585151D12BE6E0EC4E0F1E9CF529E7B6B432FBABB265BE428A6B24F4BBFDC02C3D5C7F7730CB046F2A7300A70EB6B1A84BC3870F6F5A5858D8CFAC5357FAF9F97531974DCCF550A7D3996D8ED1F699BFBF370F9B9F9F9F3FE7FDF7DFDF44F8AD236D9724B6880A6E30C304DC0E7F3A6364D8C50D3A8B9FC3EF98C769000E0D0A96D383629BF68FEEA10799F2DF7D4B331FDDFAFAA3AD9725DE5EE85F70D3E6F34E9D2F12F0A6E06B36B2CB1212124E1F3C7870A5B631E67151070F1E3CF0C5175F2C3161F95CB3114EF5E0479C689629527CB65A9B81E999EB8AE6B3D5A0ABCDBEDC35B6BAF39F59EA80405C7FCF75056AFF528FCD7705E06BA4B8F637DD9BBE27AD8DD083B29B6FBE39F0440765CA7CA7F2C4134F9C317EFCF8DF989DA696E1231EFA680B75357295BDFB64C5C2320757EE321FE03A119125476AD6F35D65AE4DDA5FE71709806D6CC93EC99F6DACEF1B32644847B30E3D6DC26E9F76EDDAA5F6EEDD3BA655AB5651868486864A4E4E4E68666666E8B66DDB223FFFFCF3F66BD6AC7962D8B061DF9830FCF0A930F2B8570D78D579E5A81B420343D7DD1C7F55C2679D5E08BB24AA6BB9C1B722BF89EED176F9B9AFB7BEB5C96F839C05FE8B5A7D3B74043F01A0F698E01A6E36B88BCF3DF7DC16B7DE7A6B80EECC2BEBA69B6E6A70C10517840506067E3E74E8D0180F7D441D88EA55296EFAA51649F119EE57E4D881A9DCCDB92E731D18E872966BE75F5E388F721D1C9415E36DC1F7C61B6FBCCC7C4F5A1B11D8AB57AF4A3F4F779A4F3FFD7493B0B0B0DF272626DEE1C18F78951CA965EF20159FA88D71DDE77EACBBF95DDB52077600C036B6B876976DAC0FEBD3A78FBF596F9E0B0E0EFEDA1C479D3F65CA94F0471E79A4D5C5175F1CD5A44913BB7E2973BFC4C6C64AD7AE5D23EFBFFFFE33DF7AEBADB01B6EB8A1878ED1327CF8F07FEAB11CE1B7165CB7F6A15161CE90D7DF38FB81905BE37FEBAC4AE82D6B42D361E7BFDFFEF143FE4EBF675A2D1B3A9A9F03E079A3468D0A6ED4A8D182CE9D3BB7BEE38E3B02AB127CDD7EFFFBDF4774EBD6ED34A7D3B9C0031BDF075C3BEB4565C2E86CB37C63968FCBD9E9976DCAB54B8EDFBC6B75A9A09C24C535CC5ED502C57C37979A8B4FEFB9E79E4AD5461C93F0A3A2B476A2A1BFBFFF5FCDCEF55A0F7DCCAC52075B07E4E89AF6B2524B3DB6EC011A00B08D2D96C336D67769136763C985175E38F0E5975F6E78F5D557C705040454EAB97ABCD6AF5FBFC87FFDEB5F91975E7AE9B58181814BBC64260EDF0DBFFD92C7DFB52B2FFDB5F7DA3E16D825BC758DBC66E7B0B35ACCEBF0BC9FBF9FDF246A8001CF07DF90909005679C7146D7DB6FBFDDBF3AC1D76DCC98318D3A75EAD4343838788EBE6E0D7C3C3D6B3D568A9B7055341E80DEBEBC82E7EA08977D5C4B7329AE29AE28B0B5753DEE71291E4044FF5EE12DDFD3E8D1A37F73E8D0A1B9B7DD765B8503AF54864E57650ECE42CCC1D9DB43860C19E0818F5AB6CC2BA22731B4C65D77D2BA9DEFE17A0E5D5E00B08DADB96DAC368D1ECF36D67B83AFB95872EDB5D79E71F7DD779FE9AEE1AD2AAD11BEF9E69B9B0C1B362CCEAC7B0B7D3500D779F8EDB9FCB6B3F6E666BCF88FB3C6069C1E145BA3AF7D46705C7C52DB49790E91E7CF5E3EB42D3F0FC033C2C2C2E69D7EFAE9DDEEBBEF3EA76E3C4F96799DA873CE39A7635E5EDE7F6B20006B0DAEF64B5A7D82C78D2BE736AD7DD651A117BA9627A5FCE6617A5B8EEB2022C52C33E44873E939AE305CA7DB20AD8D30E5397BCC9831013D7BF63CE9D76BDEBCB97E4FA101010133CCC1598F1AFEB87F2F53E669153C2ED555E67A80A635FADDA5B8B6FD59296EE2DE945F2700B6B127BD8D4D73EDD7CE2BB58D7D4E8ECCAD8E3AA24D9D1D0EC7ACDFFDEE778103070E6C5C13AFF99BDFFC26D604E0483F3FBF39BED804BACE07BC0A0F8CF87C506C9F809AAAF12D4B6B8047C45DF1C5D4D47993CDD58BF89900356BECD8B1FF0D0909E9356EDC38A736B1494F4F973BEFBCF398C7FDDFFFFD9FED63E2969D9D2DB7DC72CB318FFBE73FFF29D1D1D1625EAFD1134F3CD171E3C68DEF9A8DFBE09318F932B5826D5F65B67FC16CBB950000200049444154EE50E5A607005AA3AB813CABD46BE9D40F3AB2F3615708D600FC82149F31EFE3FA7BBA59FAD7C577A4FDCF0E1D3AF4A9D6466833BC8ABEA3BFFDED6FB6C6E1A802A8E0B1FA3D9D73CE397EE3C78F0F7AFEF9E7E70E1D3AB4C7F4E9D3D7D7D0479E5BA6CC5BB94E449476B714F7BF3EEC7ACC6A3932D8580FD7090F2DF34BF89502601B5B23DBD84DA5B6B12FB08DAD7B4D9A3479B6478F1E3135157CDDFAF7EFDF30353535D71C7B3DAFE7767CA9CCEAB4E677C8BAC7EEF473385ADCD0F84A8FBECFA3678CBA2CC82F3086E6CF40CDBAEBAEBB6699C07BC5830F3EE87437B3D1FE4A575F7DF5518FD39DFD7BEFBD77D46DB366CD3AEA20C0E170E8C6D6065FA54DA7EFBFFFFE58B361BFD82C6FE8D9CD1AFCE8E12708BFF952FE20557A5BB259EE9523F31F2A9DDE48E7F94D72ED2426B90E1CC6BA0E1EF47983EAE23BD211478B8A8AFEAB536DB86B23F43B1A3B76AC4444441CF5D8975F7EF998E74F9E3CD97E376E0D1A3490912347967C4F5DBA74F1BBE5965B82CD7AF0F94936918A3F4E99EB7D7F2B73C096E3FA0EF4B6DB5D653EC275D9C275D26310BF52006C636B6C1B7B07DB58EFA1A33A878484DC64B4F0C4EB0F1D3A34CE1C8B0D1F366C5817C26F0D395878E891094D873A829C011E7FAFA7CEBC6DB7A3A8E8F6FAF605990DDD9F74C0831A3EF0074E9A09BC534DE0BDFA91471EF12BBB831F3C78B036852EB99E9A9A2A1B366C9075EBD6D9EBDBB66D93A54B97DADBDDF4F1FABCD2B409F5934F3ED9282E2EAE7F0D07E017A5E2E98D94F6019E5DC17D7AE6FB02B3AC2F1594E7B82ED7BB0E0C4A2FF35D8FABF50142CC0EB1BBBFBFFF47F7DE7B6F60D9FE67DDBB7797C68D1B4BE901317EF9E51759B06041C9F565CB96D9EFCC1CD895DCA607757DFBF63DEAB52EB9E492A06BAEB926E62447EA4E3A4E99EB7775BE599696BAED755799EB6D8F9429F37FB91E93C62F1500DB58B6B1BEC8AC0FCF5F7BEDB58EEAF6F13D113D0633EB5B9059C7FFEE4BE5E657576FFCFC2F49E7FF90BD69DCA3678C72381D9ECFE06D42CE68FECACE0F8B626E6E3F3BED8DE4F4FAF20575ECD8516B94124D3018D3A953A78E6639A47376998D656E659E3F72E4C8497B9AEC610BE1251AEF6C2CEFBCF3CE63B57D02C5AC37D13131319B5252520A6BE235274E9CF8567A7AFA88871E7AC8D9B061C363EE773A9DB6BFD292254B4A76EA7ADBC68D1BED4E5D9B40676464E85C73F6BEA0A020DB04BA65CB96C76EA4FCFCE4A28B2E0AFBFAEBAF9B9B0D7093E4E4E44F7D71DD30DF5391F9BD4FEAD0A1C3D8EAFCD6CBD281570A0A0A3E33E51AA80761E5D1E6799F7FFEB9E4E717B728378FB70762975F7EB9BDFEF4D34F4B56D691CCAE27391E7CF0415B335196F9ACFEBB77EF0E4E4D4DEDDFA54B97B757AF5E9DCF2FDEB3EB8A59469BA58959F69BDFC58ECA3EBFAEF60B2BDE5F21C191C112D220A4528FFF79D9CF92BA2155625B1EE92E51545874542D59698BDF5A2C4DDA3711A75FC5C714FA98809000098F09975FD7FC2A917191F6F67DDBF655FA73F9C27EE114FDDDD4E8BE906D2C6A685B3EC22CEDCDB2AB2ADB711DE4CA6C0B5FF8C31FFE107E32838C9E488B162DFC3EFAE8A3D8B3CF3EFB3DB3EEEEF38572AFB3DAC41DF97BC6F76ED0C57132531A55D5F9116D377D93917CBD66EFFAF64599155CFB0E8E3041628459C9D3CC0F668EB96D86090D0BA74C9992E30D9F31635786A4EF489733CE3DE3A8DB0BF30B253B3DDB1E6C5445416E81F805FA557800D37D68F70AEF773FA6658F9612DF26DE1EE49CDEE9F492839CE866D1A7D2F6F5710DA0717171D9AEF5E64DB3235EF4FEFBEF57AB26D204DF7F9B1DF00D8F3DF698A3741FDEB23A77EE2CCD9A3513739061AFEB0E5E77E8AFBEFAAAA4A5A5C9FEFDFB4B1EABCD9F2FBCF0C20A5F4BCF6A9AF78B32070523860C19B261C68C19FFF0D52FAB267EEBB7DD76DB15870F1FB603AF1C6FAA0DAD61B8EAAAABC4ECD82437B73863E7E5E5C9EBAFBF6EFF3E78F060C963030303B5F6E198FE6AA5DD7EFBEDA1999999EDD6AF5F3FBD4F9F3E834EA29F362A4707F4BA4F17B39E680D4C92D3E97CE3DD77DF5DED8D1FF6BB19DF49F419D1156E7FD7CE5B2B0EE791609BF25D4A49E0B5DBEE5FF6C98F5FFC28374FB9D96EFBD37F4D97A8D38F4CCF1D141A24BFACFA45CEEC7E66C96D651FB363ED0E39EFFAF3ECDF1FDCFF81FC7EF6EFED6BBD73EB3B32E6BF638E7A7FF8E6BED06CC332CCEFE523B35D9D56DD7D21DB58D4A056AEE50EB35E6A7338AD9D9F919A9ABAE878DF6F4141C1802E5DBA1C0C080808F6E487D3607DDE79E71D5EBC78F1B5F5313F7955F8DD99B3AFE7C8F82B6BF53D0744F70C5E9C91DCBB9E7F79FA43D0262FA3CC467C544E4E4E96F9B1CC341BF10F77EEDC39A72E3784DF257D278D5A3492669D9BD9839CB0E8307B20F1EDBBDF4AEB8B5BCB853715879B83FB0EDA30AA72B373EDF56DDF6F93F697B7973D9BF6D883A39CAC1C49DF9E2E978FBFBCDC03180E72AA15AAB45DCC60B3DE0C3607C89966BDF9D8DCF64E5542D55FFFFAD7A7376CD830EAD1471F3D6EF075BBFFFEFBE5DE7BEF2DD9E99B75F4A8A6CEF6BB0C0AD2E98D4EF85AFA7E7FF9CB5FA21E78E081C7CC67CF4F4A4AFA978F7F6505D5F9ADEB88A3E6A0ECE33BEFBC33A032734C0E1C3850BEFDF65BDB1CCF6E60F2F365F5EAD5B686420FD2DCB4FF59D966E9E5B9FBEEBB43264E9CD8CFEC905F369FF1368E6B6A459E6B5DB9BBB0B0F06EB39E6C37EBCC5C3DB837BF9385DEF221776FDA6D4F8456A4C3951DEC763C2D25CDB61409082A6E2E1A1C1E2C05F9051277769CF4BAA557C9E357CC5C21F16DE34BB6E5997B326DCDF2BACF8BBB576C5AB4C9EE872EBBF7327B1236EF709E14E6154ADA9634BBDF896A12557202B561D38604DF538756F7BB4F30EE7305E14A9F60641B0B0F1DA3159A7552CF7C68BFEA3BE2E3E3B70F193264AEB96DC6EEDDBB1796DDE70707070FE8D5AB57546D7CB68B2FBEB8E1AA55ABFA137E4FD2AFB96971ED429BD7EA7B768B68A767C99BFBD077A6CD76C2DD07C7E687923674E850ED5FF8566DD7086B2DADD6FCEA41C6FA05EB2561508238FD9DB69635AC515849F0557A30A20731C97393A5CB355DEC81CDCFDFFE6CC3EF77FBBE93961714377D751FC07090E3918DAC76D21D66D69B612654E5989DFF7FCC6DEF1F2F543DF6D86393D6AD5B77FF830F3EE868D2A449A5DEC7DD77E9D34F3FB5CD9FCD81B96DB2E86E0AEDEFEF6F6B7C2BFB7A7A70F0E4934F464F9830E119B3AEE74F9F3EFD751FFE9A4A376B28AACC6FDDDCD62F3B3BFBC3BBEEBAABC26678151C4C698DBE1C3A74C85E775FBA69CDFBADB7DE2A95695AA57D84CC6B053FF0C003379AE7A44D9E3CF9210E6B3C2EA0CC7E419BC38D3697A35D35C236089BDFCBDCBAFC90EE5640C7F3CBCAE280D0E6D236B625913AFD9CD3ED365EAFB7BEA8F53181D94DEFD7ED7B930EC5DB93B8D671F684AC3D3B60F60999BB32ED3628242AC4DEBEF49DA5F6F3F8051C59AF270F9B2CC35F1E2EA151A1AC55A78668397282F1A0F9BDBC7FBC138C6C63E129661D2CDB5FC36EC775898B8B4B77B5029BE6DEE79BBFCFD326C9B5F1D9F418CD7CBE4EBE52D675167EF7E76704C40644D5EE8AB53F37B2C9374511098989937CE4FB7396FAD114991F428CB948345713B52FE590214336EDD9533BFDBA964E5B2A57FEF14A7B20B1F8CDC5B6F6D73FC85F3E79FC137B70A2073D1A86DD1A9CD6C01E70E863349416E415D820BB237987F80796BF5AD6F7839C43BB0EC9CA952BB58F877BFDD32AD09C528134BFA0A020D5E974E69709AAA9E67B3DEA4486795C5A759B2D97B72F7507616D0E6676EEF3CCF57F970E55AFBCF2CAC4152B563CAAC1B7BC7EB9C7336CD83059B46891EDE3EB5A574BEE0B0909D19132ABF47A5A036C8278833FFDE94F7F3765999E949434D35B7E9083060D8A37072FC1C7D9B9C59BEFB33A4D941C27FAAD9B03221DC4EB6FE3C68D0BD026E755A1CDD3AFBCF24AF9F8E38F6D6DC4513B097F7FD1114CDBB76F5FE9D7D303B949932605DE7FFFFDE3478F1EFDEBEBAFBFFE4F5F3F70D1F9A8CD77115FC9839C4AAF07D558679C6582B0D608DB5A2EF37BD1D7ABB5FDC251DBACDC0239A3EB19929371E273B23BD7EF14FF607FDBDFD76EA02283EDBEA149C7A34F92E9C9CE79CFCD93665D9AD9EBBB36EC92F0E870BB7FD026D2FA5E7DC7150F1C14141624412D83EC3E474F94EA63749FB0F99BCDB6B591D2D7BA72C295B51A7C0FEF3D5C76BF5056BE6B1F50AD565DE5ED3F6AEA39665B9163F643A93EF4330E93232718F7997DE16752EA04A309BC3D0F1E3CF811DBD8FAE544FB650F6C834B3F375CF7D727FB3F94EE0EE5DEE7E7E6E6368A8C8CAC9532D4BEE8F9F9F991BEB24ED459F83D5478D811EA0CAED5F75CFECDB70D9B2CB3C790137DEDC7ED2867041073532B6D6AD3A25F0B8FBEB7F6CBD2E0AA070C9BBED924835E1824F987F3E5EBD7BE96817F1968FB6BCD183743DAF469235D0776B5D7350C6BE0CD48CDB04DDC34946ACDAFD6D29EDDFB6CFBBAA56B7E7DE12067EFF2BDB27DD5F60AD73F0D85DAD4AFBCDBCBD2B3C37A205BC65161DAA5AA2331469AF7D3A90B06B937B06DDBB65D60D6A3D166875FE5E0EBFEAC3A98D58B2FBE78D4FFA2ABECF5D75F6FCF6257950EA665C26FD0134F3CF1868E86AE07F4650E608EB7B3897705FE8AB6894D8FB3238B72ED84AAFB3BF5D86FDDEC085FBAFDF6DB1D553D2873D3EFE2CB2FBF2C3949E1A6FDD04C1957F9F5B496DE7C47818F3DF6D8DF870F1F7EB139E0FBF1380FD73357E1D52C92F0137CDF555D07AAF558F7E06D35BD1E9CE43AE3ACABFD42591BBEDA605BEFE8B65F5BEE44C44694FF0334A1B7E939C7FE04A39A46D9E79595F6739ADD962B6D7DA435C6BA0FD8B2648BECFD65EF518FD5E76B6BA0E5EF2D97F313CFB7DBFF4E571557661C483D20892F254A604860AD96CB9EA57B8EBB5FA8681F5085836F8F3DA782FD50853F11297FCEF59A7E4E4D3D3FBAF40946B30DDC69826FEC4D37DDE4CF36B6CAAAB2BDF5C4F34F769F5B27CF3DC1EBB6D293289E1AE5B92C3D4E33E13788F07B9234F86617E6486D06E06E17F5287869FBCC2213809FAC47DFD1C493F8716C4948486899E6E191E85B9CDFC20E40A20737E70F395FB2D2B2ECD2FF81FE258F19FAD25099F5D02C1B7EB5C9B10E5AA20721DA1C590F402A53F35BDF0F721A253492D81DB1B26AD52AF7A89E716536E8FEE63B8B373B5CFF4A6CF863CAD9919557EB745247B8BA81DDB061432B9D7FB753A7EAB778D11A5E0DF6A5CF78EBF5EA045FB7366DDAF8C5C4C414A6A6A60EF7A29D60792720AA727F9FEA7E36734096D7BB77EF6AAFD47A20AB351065E981597927652A7B92A269D3A6CE8D1B370E16DF579503ED13AD07A5D7B9F26AE1469DC4E7FCD9EC17CE4CABE5194A7E5AF8939C37E83C3BBAF2A237161DB57F284D4F82BA696DB1FBB69FBEFAC96EBB577EB0D2EE47DC344CBB4F94EE5CB753421B84DA00AD7F47C61FA9A8D0FD84BEAFEE0B1206271CB3FD6F10DFA0D6F7092AB6476CD9FDC2313F4D57CD53758FD7AA131C2AFB9CE00AF63B153DB63AFBA3B6DEF0E336DFC169663F5668B6B1D57E0DB6B175A6D2DB5B0F3C5F5BE81D6F633BAA9AEBE366B32E35CFCECEF6AF8D00AC2780CCFBE5FACA0A5167E1B7A17F44DE9EBCF480E641F1B5F7A60D02F6ECB8D091FFF5B8A449F5E50B4A4C4C9C58851FC301B383FCDCD52760AE36D3B9F9E69B8B6AE32067FB9AED36B46A33633D60090A0FB22377EADF7A20B2F1EB8DB67FAF5BC7FE1D256B6F96B4EAD5CA0658AD992D5DF3ABFD80CB9EE5AFEF0739217121D2A16B071D04CA23EB5F054D7B34247F57C9F527BFEC01969E403181F5CDAFBFFEFA61133683ABD2C7A9E400D604DE37DE78E398A65E7AFDBDF7DE936EDDBA552B04CF9F3F7FF5AE5DBB5AE8FA5EA6E6F7B83B9BE335E9D3A6E7E6BEED151EBD0507A79BDF55BA077FEF4595FCAE32CD679DE7FEAD9B1D60AF356BD6CCFCE28B2F8A2EBBECB26A9D9D2D3D1A6999F7B2F755662096B27EF8E187822D5BB6E49ACFF99F32DF51D9F748338FA96E33FE131D5C54691D28E73B4FF59611F54BAD27953E6032FF67966BBFF0B67BBF70CB2DB714D566F8D5EDFBDEAD7B4B5AEEE8767ECFE63D127BD69141F3747C885F7FF8F5A811FC7520441B1ACC6D7A9FBE8E8EE0AF2757DDB30768771A77602E7D5254F721A54F8AEA5812BACCFCE3F17B49947EEDDA10D428C8A3FB056F51956E01A57EA7C1AE0180AAA59CE7BF5989A7E9A04385E5EC0B77666666469A6DAC3FDBD82A7F0F556E7AEFEDDBE0DADE96BBB6E39F98658ABB19BE39BE4FCDC8C888AB8DF06BD67D9DAF3A93F07B925A069F96F963F6D6E8DA0CBF3F1CDCAC5FDC061FFBEDE838F93AEFE98C909090F99E3C30AFF047595824B31F9E2D6D2E6923E75E776E493F5CF5F6E8B765E4EB238F3A9B5FF6B93A6A73DB4BDADAA0EC6E0EBD7FFB7E39B8FFE051A337D7F7831C4FABA0EF55CAF19AA5990D6A81D998FAB97650FEE67ABAB99C5FFA048ADE3774E8D085FFFCE73FBF34212B40A762A88AB973E7DA0D6779F44060D6AC59556EF2B570E1C255FFFEF7BFCF30017A9009D0F3E5D470C87C3FFF35DF4D5239BFF5F9C3860DEB636E9BBF7FFFFE82EBAFBFBE4A7BC31D3B76C8BC79F38E9A6FD2EDC08103B6A95E42428254A5D9BB1E94FDE52F7FC9C9CFCF4F9C3163C61C416DCA718FF65C57FB85D2E63C3647AEF9F33525D7B505CF6B435E93DB66DC56D2FC59A73FD245074C8C8889B02752DD035E697369EDDAD220B741490B1E379DCAAEBC93A27B53F6DA81154F7850B727D3769D71DBBA62EB51E34BA066B8F62529D578EAFA1A0C1A15855FED1BAF676775E038A7F9DD38CBDB179A6D6C17B6B1A84507CC7AF81FA7D3F95E6A6AEAFCB203B0050606AEDDBA756BDCF1A6C6AA29BAFE9ADFC14F84DF93D434B8F1B2C519C9FDFB35EC5E6BEF3967DFE27D45225FF948E07DDF2C9F040707CFA9EB3362DA8CD93D759086D78DFFDB78CC889CA569C8D58395CD8B37DB66A43A32B406E0C3D987ED54185A63AB35C7210D4238C8A9797A563BCF947B902BF06AF0D5BDF1DCE39D40993E7DFA22B3E3EF3675EAD46F4CE00CD5119C2B233D3D5DFEF39FFF8809CD47D69752A33D6B28FEE28B2FEC88D095993AC9FE8EE7CC59F3EEBBEF9E615EA39F09BECB7D3DF09A45CFE27C74A2DFBACEED3A7CF8F02E1F7FFCF1E283070F168D183122ACB213DF6BCD7CE983327D9E7B746EFB210E1DB2F3523EF5D453957ABDD5ABFFBFBDFB00B3AABC1306FEDE9901860E22289648D058B145B1AC2968D4609A292A6349246ABE98982F9BB669BB0846779358369BFD8C4663023E6A04D144578D2524F6D8A2220A36C2824AA8024A9B19A67CEF3BF70C5E2733346760EE9DDFCFE7FF9C7BCF3D7766FCDFCB39E77FDE72A6D75F76D965354ECAB66EC11BFF6DDD143FB7DB3BC37161FDC5AF9FDE1D0E3BEDB0B0FDF0B7870CA682F7E3E33E1E2E3BFAB230FAFBA3C3C19F39B8E94266922E84A68BA2E978928E05E515E54D4571EA59D47CBFDF42693E88668517455B4AADC6B5AB6BC3BAB5F95BCBA49FF5FA8CD7C3F45BA7870F7EE9834DB7D76BDA67C582FBB5E9AFAD6FA5A664ADCB5A78D397A52C8B0D1E0BED63D90A9667E7F737C6FDF8631BDA8FC7F3ABA98F3FFEF851871F7E78878FC57DF4D147D7C5F3B55B15BFEFD23FF5DD7FE24F5EBFFE84FAC6FA509EDB2A33758747DF9AB96BB7FA7073317E50A94B735CDC575656D63CF3E08ACEF2B7A5EE6BF75E766FD358AEF71EF6DE365B79D37D7753AB703AC94845EE69979FB6FE9643CDF7EB5DB9786553AB6D9AA82A6DEF24A7DD956507FB555951B5C91750D281BFAAAA6ABF58703E150BE0EDD2CC951B73F5D557879A9A9AF5CFFBF7EF9FC6A686A79E7A2AC49387FC197B7575B8E28A2B9A6E03B131B1909E79F3CD37F78B07FC23A64E9D3ABB443FA3D5F1DF7BFAB7FEEBCDFDB77EC30D37BC3E76ECD803FEFCE73F3FB87CF9F2F79E77DE797DBA75EBB6B18B0961D1A245EFE88EB7CF3EFB345DA498397366D3C9597A2DB54EDC72CB2D4DF7ACDC90BFFDED6FB5975E7AE9BAF8BE93E249D9DD818E3C2EACCA8E0BBFE96CC78574B1F17F1FFBDFA67D6EDA9FB7948ADCD3AF3C3DCCFBEBBCA6DE3E856A56D784E9B74D0F77FDC75DE1DC5BCE6D5A978E2F1B937E4EDAAFA7D9FF5B4A85749AF4301DAF9A8F1B275E78E2FA0BA0E9FEC18F5DFF5853919DEE2440C9EB96CDE1B059C742FB583AC0FC187F48A74C0B172E9CDED6ED265B2A2F2FBF239E4BFD3CDD2B7A63DFC177230D517BE289271AE277F4778ADF77E98441874FAD7AE182B50FBEF96CCFA307BCBFC37FDF836F4E5F56DD50FDBF2F1F39796E917D46E3E20E726EDC29DFDC59C73CA4715BA3BF3B7AFDAD869EBBF3B9A62ECAA9B04DE37C9B5B6B6BD7D486BE43FA365DF56F2E64D3D8AF3436B8B9FB71EAC29C5A649B8AA2B7AA9B6E7191AEFA3BC9699713E574627CFFBBB9803279F2E4D48DFA905400C79DF48033CE38A3ACAD2BDF73E6CC09B366CD7AC758DF34B6F79C73CE09F3E6CD5B5FFCA6D7E7CF9F1F9E7DF6D9B0A15934AFBDF6DA57EEB9E79E748B9F4F946AE11BFFAD7F3E7E36EFEADF7AFA5C4F3EF9E47F9A3E7DFAD4F1E3C77FE0073FF8419F749B82D6A496F9D42DFD8D37DE1E36107F7FF8FAD7BFDE74303DF7DC73D75FBC58B66C59532BFD873EF4A1365BE95337BC4B2EB924DDB2EB6BF1BBE2A4AC0B1F17D27EFE804F1EB0C16D520FA1D67A0955F6AD0C479C714438FCB4C337EB9EEC479C7EC43BC60CB794BA4C17769B2EECF9D3D6455B1C0BED63E94047C773A98737B5E06D7921E64B5FFAD2E37FFEF39F3FB8298D115BEABEFBEE4B5DAC9F2FA5F3AEF26DF9CB3FF72F67F6BF79E97D47550D3E2694E5CA3AF47755BD3861D1EA86DA4B96FDEAF919C5F4013DFFFCF30FC6981177B25B748FBF2F7CE10B1396ECD4F1F7742CBC6550EA823C648F214D45F10E7BEDD0B44C91C66DB56CA94D134FEDBCFFCEEBB749EF6D7E3C74DFA1FFD0F5B9D9CEFBEDDC5448B725FD9CC34F7FBB4B7DFA7B0A8BF5742B8D14DD7B6DDD89AF862C1812AEBBEEBA0BB6E6EF1C3162441AD73B319E289F1D779637C4EFD38BF1FB54FD2EBE932BF6DA6BAF9B162C585015A3F7FBDFFFFE5C6B33554E9830E11DB77448B765F8CA57BE12D2F894F8FED48D66FD95F0B44C57C08F3FFEF8D05A319D15BEDDE349CB07E2017F56A91E05DFCDBFF542B366CDAA7DF6D9676FD87DF7DDDFF7D8638FED7DC8218774EBDDFB1F5BDF2EBBECB2A693B3E693AFF439A6DB711C70C0014DB392A67B08A68B12CDDDD4D367933EA7638E39A6B593B2DA8B2FBEB836EB867793731AC78576B818B459DB97959715E5E7B92D8E0B5D517B1E0BED6369A77DF9DCA8614BDFFFBEF7BDEFC93973E69CF5918F7CA4A2235A7F53CFBCD4CB203A29FE5B995F2A79DFA6478A0B867DF1BB9565DD574E5C745787FE9EAB16DEB660D9BA37E7EFB27AC164FFD44AE4AA4DF77249D844B158BCE8C61B6FBCBE3D5B88520B707D7DFDBE716738FBEAABAF6E683993F3B469D3DE71A53BDDEA284DE4B1EFBEF9D6955D77DD351C71C411EFB8475D1AF374E79D77FEC3EFBAF2CA2BFF3716BE69ECEBA1E9F7FA4437DDB5D75E7B563CF1BAF4FCF3CF5F9B26AC28F4D7BFFE352C5EBCB8A9ABDDFA93F02143C28927BE3D31513A014BB7D268965AEBD3E794AE04174A276FA935C2F833A02B1D0BED63D996E277E1F9EEDDBBFF362E6B3AE2E7FFFEF7BF6FE8D1A3C72D13274E7CBC94F2B6CD2F931EDFFFD0CFFC7AE11D8DD357BDD2213FFF8535F3EA7FFEFACDDD4359EE9CFB8FBEBFCE3F15681FA9EB576D6DED81F1A0FCF27FFFF77FD7A7712749BACADDF2D646E9607EFAE9EFBC1D6F9AE1B97022AC748531EEC09BBA7E358B85F5FC871F7E78493CE01F154F5A96CAFA167D4EE7C7CFE69BE3C68D5BF7CA2BAFACFF8C528B443A312B94BAE2B5F48D6F7CE31DCFD3095E1ACBDDFC3965DDF056C7CFFB734ECA00FB58FB58B69E9933677EF9B1C71E9B77D75DEDDB90982EC0DC7FFFFD7F5FB468D1974A2D67B9CEF0475CF8EAA46BA62D7FEAEC1BF61A1776EE31B8DD7EEEFC9A25E113B3BEBF6C55DDDA7F9E7DD88DD777C57F147FFCE31F1B671E32D3DEA193D8EFA9FDC271C71D972BA5FFA7934F3EB9CFC08103A7EDBAEBAE877CEF7BDF6B97AE37A9708E05F5C2A79F7EFAC58A8A8ACF74A6897C8AD599679EF9F174DB846F7DEB5BDD3734B67A7334CF381A4FFCC63829735CC071C13ED63E96ADEFF4D34FDFA5B2B2F2B9CF7DEE73034E38E18476297CA74E9DBA64F9F2E58795628FBB4E314066DC7BC69EF3D181237F77FA4B1786F66A017E61CDBC70E2AC1FBEB9AA6EF5255DB5F085AD21EE2057D5D6D68E9A3F7FFE133FFDE94FEB520BEEBB91DEFFE31FFFF88DACF03D41E1DB3EAEBDF6DA3BE389D9A77EFEF39FD7A6EE78EF566A8D4827655A2300EC63D976D2E457F1DC69FFDB6FBF7D4E3C675AB7A5E761E97D37DE7863432C785F2FD5C237E9340327FFF4B3DFDFF4F9EF7F69F0CFE6DF34B22C57963BB0F7EE5B3C09D6A44577D57C7BCEE5AB57D7AFFDC6ECC3A65CDE95FF4114CBC4265D45A94E6C9226DE193162C46F57AD5A75683CE8EF76D4514795A7C93C3657EA3A7DFEF9E72F9F3367CE23DDBA75FB74679DC9B658C593A9BFEDBBEFBEE9F60867F6E9D3A75B1A87BD859F77ED25975CD234F14A3C38FE41661D17705CC03E966DE7B9E79E7B2B7EE7AE880F87DF71C71DFBC673A8F2F7BEF7BDA1B509495B4ABDED1E78E08134B9555D2C7AEF5CB870E13137DD74D3E252CD55A79A35E8C1FFBAFD0F677FF7DC3F3CB272E667AF5F7C6FAF5D7B0C09BB55EEB8C9EFFFCB5BCF852FBF72D99BF72C7BFC859ADCBA8FBF3272F23427394E729CE46CBD02F8E9A79FFE6D3CF01FF8C8238FEC71E4914796A75B3A6CAA34FE3716BE6FC59DEE9DF3E7CF3FF5D65B6FADF58DE99003E4C23DF7DC73CAECD9B3CFACADADAD6C9E846C334EEED2F8B3DA748F4927658E0B382E601F4BE790668E7EFCF1C76FDD638F3D7E1FCFA38E8A05ECE0458B163555BFA9084E9186A6A516DE58E436DD92F2B6DB6E0BD75C734D5DFCBEBEBC7AF5EACF5E71C51517A7D9CC4B394F9D6ECADC07FFFBF6BFBF78C543171FFFED93EAFFB4FCA983AF58706BCF39D57F0F758D0DA1227E68DDCB2A42B75C4558D3501D16D72E0FD357CF0E9397FC29FC70EED5D5772E7BF4A5BFD72E397F87D5F3FFF9A9A3EE58EC9F81931C27395BDF534F3D3575FFFDF73FF0BEFBEEDB73E4C89165ADDDFEA1A5254B968471E3C6AD59B162C53DAFBEFAEA195B72CF3B365D3CB02DDB7DF7DD272D5EBCF80BF100D9FBA0830EDAA4ABC3E9561BF1A46C9DD608C7051C17B08FA5739A3973E6E2279E78E29723468CF84D4D4DCDB2E79F7F7ED0B469D379A9178A00002000494441547ADD72CB2D1553A74E2DBBF3CE3BEB1F7AE8A13571BB39CB962D9B180BE4B3264E9C78E1B3CF3EFB5A57C84FA79F60E14773AF3D78FEBAC5DF78A3F6AD7F7AB576D18E2BEBD7F45AD7505756912BAFEF555EB9B66F79AF97E366772F5AB3E4572F1EE936282D99D8A473E94A139B7CF9CB5FBEB6BCBCFCD458D4764BF7F66DCBCA952BC30F7FF8C3D5CB972FFF5D3C49384BE1BBF58C1D3B7640DFBE7DA7EF169D77DE79A1B2B2B2CD6DE7CC99537FFEF9E757BBD586E3028E0BD8C7527CAAAAAA9E8B8B11315E9E3C79F25E5D350F159DFD0F3C7FD899CFC4C599BEB2505CAEBAEAAA33BFFAD5AF3EF7A31FFDE8A27840EFD15A019C5A7C274C98B02616C03F8985EF4F14BE5B579A4C6CD4A8517BF4EEDDFB81F1E3C71FF9831FFC203760C0807FD82ECD387AE9A597563734349CEBA40CC03E96E23276ECD8CAEAEAEA11D9D33DD3F3AE3AAF4A99AF03D051AEB8E28A4BE3E2EBFFF66FFF5697C696149A376F5E6AF1AD59BB76ED77AEBBEEBA8B14BEDB46CAFB4F7EF293A37AF5EA75CFB871E31A172E5CF88ED75337BCECA4ECA41B6F34733E807D2CC52616BE47143EAFA9A919D55573A1F8053AD495575E79754545C53F5F78E185F5B366CD6A5AF7D24B2FA516DFFAF8F0DB13274EBC5296B6BDF8799C306CD8B09BCE3FFFFCD07CA1229B78A52E75C38B276577CB12807D2C45E9CC8D3C57FC02B497ABAEBAEA8ACACACA332EBBECB27593274F0EFFF99FFF59D3AD5BB773AEB9E69A5FC84EE7F19DEF7CA7EAC0030FFCAF8B2EBAA8F1FAEBAFAFBBF8E28BABD7AD5B3746373C00FB588ADA270A9F3434348C1E356A546BC35FBBC7F8B4E217E05DFAE52F7F39B967CF9E63D2B4FA8D8D8DA7FCEA57BF9A242B9DCFC30F3FFCF30103063C7CE79D7756A46E784ECA00DACFD7BEF6B56FBEFFFDEFFF45B68F3DCF3E968E76EAA9A77E202EB62F5C97CBE5060C193264542B9BF78DF12BC5EFB673D3367E3FD08E7EF18B5FFCBEB2B272602C7CFF47363AADB10B162CF8605CFE54373C80F6F7C8238FBC91968D8D8DEF950D3A406AD1DDB9B9CE8BDFB331AD6D140BE0312DDE33B4AB24A7B3A8CC3EA43505EB3ED5CA76BDB2E59A4DF8999FF2FD87CE25CD7E290B45A15A0A00A0A87C31C6B763BC18E380185F8F716C1BC5EF27B2599F4F8D4F2F8EF1788C618ADF8E978AD9DBB2BFA52646BAEF54BA1276458C1E31E667DBA5F52FC598939D94ED19E3E3319ECF5E6F8CF1CD18DF8BF1508CA5ADBC7F957F1300004089D923C6BFC4787F562BED3674E8D087E3729736B6DF71DEBC79A9A1F02731F68DB124C6E018B314BF1D6B748CD5E1EDC1D53B67CBAFC638ABE079C88AE2DAECF1B9217F65E38B05AFAF2CD8BEA195F7030000949AC363F48C31717D75BBE38E1BAC83BA77EF7E4E5CFC392B7C9BEBA792D6198ADF7475E1A8EC83BA37FB00DA92FAA69F1CE390ECC3BDA7C5EBBFF6BD070000BAA0BFC4F872F3933DF7DC33CDE1D16601DCAF5FBFC3CACACAEE686868E83209EA0C135EA53EE923624C8B717C8C17DAF890527FF5D4D2FB95ECF5B37CBF0100009AC6ECA65A2ACDD8BCEAB4D34EDB2397CBA59AA9B1AD37949797F7DF6EBBED3E121FF6C9561D50EA49EA0C2DBFBBC548B3DEDD90C503213F9E378DD5AD0BF9BEE7A9297E87182F87B7C7F0EEB7093FBBF0FD000000A568768C6FC5F86B8CA75E79E5952377DF7DF7B43EB7A137EDB7DF7E4B1F78E081BFC5870B62CC54FC76BCE1319E88F1688C41213FA1D57DD96B97C5782CC6E290EFF23C2EDBAE6FF601AFDDC8CF2E7CFF71C1845700004069BA2E8B5EC3870F7F3AB4B8BF6F6B860E1DDAB35FBF7EFBBCF5D65BA94EAA55FC76BC54E8A656DD34EB735D8BA48F8FF1EFD9E3B47EEFAC405E1EFE7140766B57355ABE1FA02B48B78EFB46C8CFE0D8727D9A5F21CD8CBF509A00DE95D4C276682BEB538FC3349FCDCB52C4B63066CC980372B9DC5E9BB8F9EE1FFBD8C70E983C79F2FD5D21379DE93EBF6DDDB7B765D1FAC666FE5C452FD0950C8B3137E46F7390C6F014F67849B33A5EA6F00578573E1CF2C3F47E5E702E5D963DFE8F906FD4699026B6952953A6A49EAFEF6818ACAAAA9A10F20D8317C442774257CD4D85AF07404949F73A4F13034E0FF9D6DFE6F9119E8A717D8C1D43FED672B74A15C016199B15BF8F64C5EE91D9FA3466F294186986DD6352912155A0F805A0E3DC12E36731EE8CF17056F026C342BEC537B5087F42F10BB0C52E09F90B8C9F8DF1CB183FCED60FCC960F6545B1E2173A9932290028197DB222F717A1F571686784FCE4172E7C026CB934FFCC41213F696B4B695E855D836ECFA0F805A0438D0DF96ECD6936FC34DEA7B2E0B583B2A277AE34016CB14BC3DB1710E7B4786D8F18D7C4784D9A40F10B40C7BA3C2B7A6F0CF996DF1D0B5E7B31E4BB3AD74913C016FB4E8C79213FDEB7A574E1F1CD90EFFEDC5DAAA0F3D1F5ADC4ADEBBEAEBEC7DA1EE5353D6B24631BEB5EDDFDADD0F6ACE6D05E52B7E62FC63822E45B2176C9D6A72ED197648F6F91A6AEABAE5B5D4D3C2EF4705CE814C785D0181A17CB44514AB7324ADD9ED3AD3A0765EB762E287E3F2D45A0F8652B5BD37BCDECFE2BFAEFB5B8A763EBB63668E9A0D71B1B1B67C8045B4175C1F2D8ECF1EB217F5B8EB46EB614755D6B7BAD9D118F0B231D17B6BD01CB062C88D5EF03325174FAB478BE3AE4C7F8A67DEBCA183D632C9226E87C747B2E71B57D6BCF19B0644063CFD53D25631BEA51DDA37EE0E281831A1A1AC6C9061DECE68293B334D3F3842CD238B4B931BE1CE35C69EABA1A7A369C3360F1807AC7856D2BB5FA0E5A30A8C271A128CD28D8CF3E1F6356C80F2D498F5397E8BD639C2C4DA0F8652B3B6DAFD31E5ED97FE5F777FDDBAE0D43160C693AD8B2754F6E062F1C5CB3FBACDD979785B273468F1EADC58D8ED63CA6F7E1565E5B15E35FC2DBB73FA20B3A69FF9366ACEDB7F6BC5D67EF5AEFB8B08D8ADE45831A86BF307C7979AEFC2CC7859228825B4AF32B4C951EE87C747BEE02C61C3CE6E29BA7DFFCC7DE2B7BFF66E092817B55ACAB28AACBFD4B972E0D4F3CF14418397264183C787051E5BEA1AC61556368FC73435DC3B78F1F7DBC131CB6A6151B786D95F4746D9F3BE47357DDF6E46DF7F779B3CFF503970EDCB7A2B6A297AC6C1DF565F5AB43597830AC0B5F3F76F4B18E0B008A5FDADB49079DF44C5C1C5C8C7F7B555555EA46B4DF6DB7DD367BCA9429EFF369429BD20457699295A51BD8268DF94DADC2AF4B57D776E2C8135F8A8B9132019B65688C9B3661BB2F857C576840F10B9B66ECD8B195D5D5D5FBA5C7B95C6E8FF47CD2A449D53203AD4AF7F54DDD9EE76E609B74FBA3DB43915E0C03D8C616C4F8CA46F6B3FD63BC12F263821BA40C14BFB04962E17B44E1F39A9A9A517171B7CC40AB5277E6E9CDFF7CB293B315E1EDD99F93BDB3133700B64C9AD1F99F62CC09F9199E9B677F4E73E9A4DB1AF688B1BBC21714BFB05972B9DC171B1B1BD73F8F8FCF56FCC246A5A277588CB131F6CAD6A52ED1A91B5EEA12AD2B1EC0BB736FC8DFE7F7C3317A6705F13931CE8CF186F440E764B6673AB5868686135AAC1A75F2C927F79119D868F19B3C16E38B59FC3A2B7A974A0F40BB49B7397A30C64352018A5FD862A79E7AEAE85C2E5738BD731ACBB87D7979F968D901000036876ECF745A0D0D0D1F8DC56FE1AAE62727C6B85986A04DBB64CB013126648F0F0CF9F1C0D3A507A0DD0C8CF1C790BF407F508C5B62FC8FB480E21736D9A851A3D277F39C16ABCBB3E5A7CDFA0C9BB46FBFBF45B1BB426A00DA4DBF6C1F7B905480E217B6D8D0A1438F686C6CFC87B1BD715D6D2E97EB53535393BA3EDF2A53F00FFBF4C293B0B64EC8D2ACD07F952E802D926E15377023FBD910F4B401C52F6C8A58E4FE9FD6D6C7C2B73C7BFD44C52FFC8374C12875BD1BB691EDB657FC026CB11931EA37B24D0F6902C52F6C54EAF21C8BDBD12DC6FB366B2E7E53D7E76F4E9A3449374E789B31BD001D6F8E14407132DB339DCE90214346B598E5B9A5B5F1F5016BD7AEFD806CC13FA894020000C52FC5F0A52C2B3B71239B343509C702F84CD98277F8468C235AAC4B5DA16F8CF133E90178D7C6C418D1CAFA4762DC273DA0F885CDF5858DBCDED4B2D5D8D8786C362B3490D7DA38F81FC7981DE35FA407E05D9B12634D8B75FF15E3F218474B0F287E61939D72CA29C786FCAD03362A757DDE61871D4E9235586F6E8BE7A362BC14635CC84F840540FB4AB33DDF11F23D6C00C52F6CBA58D01EBA99DBEF2D6BD0A61D43BE3502808EDBCF4E9306280EBA8CD2A94C9932E52771F193C27555555513E2627C8C0B264F9E3C41966083BE1CF2F7F11D1063618C0F64CBC296DF3474E045A902D82277C7F87C8C7401FEF16C59A82C3BC79E2155A0F805A0E33C1BE35F63A42104D7C478B3C5EBBD63AC8E3141AA00B6481A729526BEFA61C85F607CB345E1DB2DE85D098A5F003ADC6321DF7B62748CEFC5F86670EF5F80F6947AD7A48B8CA9575A1AEFFBCBD0FA84834027E3AA1440694ADDF23E19F2DDA047480740BB4BC349D285C67D629C2A1DA0F80560DB49AD135F09F9EE79DB4B07408748B794EB1B635FA900C52F005B4F9F56D6A55B1D7D426A00DAC5E056D65D1DF2B7970314BF006C258FB5B1FEE6A0F517A03D3CDEC6FA2BA4063A37135E019496A56DAC5F9505004097A4E517000000C52F000000287E01000040F10B0000008A5F00000050FC02000080E21700000014BF000000287E01000040F10B0000008A5F00000050FC02000080E21700000014BF000000A0F805000000C52F0000008A5F00000050FC02000080E21700000014BF000000A0F805000000C52F000000287E01000040F10B000080E21700000014BF000000A0F805000000C52F000000287E01000040F10B0000008A5F00000050FC020000A0F805000000C52F000000287E01000040F10B0000008A5F00000050FC02000080E21700000014BF000000287E01000040F10B0000008A5F00000050FC02000080E217000000DEA50A2900E89AC68C1973442E977BB48D97C75755558D2F5C3179F2E49CAC0100C54ACB2F40173565CA94C7E2E2C54DD9B6B1B171A18C01008A5F008A522C6AEFDEC44DEF902D0040F10B40512A2F2FBF7653B6CBE57237C81600A0F805A028FDF6B7BF9D1E17AF6F64B3E50B172E7C58B60000C52F0045ABB1B1F1E68DBC7ECBFDF7DF5F27530080E21780A295CBE56EDBE081A2ACEC1659020014BF0014B5AC4BF3ECD65E4BB33C2F58B0609A2C01008A5F008A5AD6A5B9AD599FEFD0E5190050FC02501272B9DC94365EFA93EC00008A5F004AC28D37DE98BA3E2F6DB17A79434383FBFB02008A5F004A4ACB42F7CEA953A7AE92160040F10B4029B9B6F0492E9733CB3300A0F805A0B45456563E56F8BC478F1EF7CB0A00A0F805A0A44C9A34A93A2E5E4C8F73B9DC9CF87C85AC0000A5A2420A00DAD77DF7DDB74B5D5DDDB71BCB1A4FCA35E47629A6BF7DE9D2A5E189279E08871C72C8F0B3CE3AABB198FEF6C6D0B8241772B7D4D7D75F367AF4E8D9BE890080E217A0834C9B36EDD8DAFADA1B960F595EB77CFBE53BD5F4AC29BAFF87DD3EBA5B589AFD574CBA57771F3C60D980CF0C5A38E8B3F17338FBD8638F35533500B09E6ECF00ED24B5F8D6E7EA7FFBEAFB5E1DB070D7854559F816B3DACADAB078A7C53BCCDD7BEE80FAC6FADFDC7DF7DD7BC80A00A0F8056867EBEAD67D6FD990653D56F75DDD5D36B69DB5BDD6765FBAD3D2CAD02DFC54360000C52F40FBEF514F59B1DD8A7E9BB269C59A8AD07D59F750B1CAE8938EF0E6C037FBE61A73C7C80400B0FEFC4B0A00DA47AE213764635D9DCBD7968701CF0F08DD57BCDD385CD7AB2EAC18B122ACEBBF4E12DB49EA025DD6583640260080665A7E01B65671DC980BDB4DDFEE1D856F925A81D3FAB23ABB640000C52F4091AB78ABA2CD6ECE65B565A1C7921E920400A0F80528F2E277CD86479A54AC3512050040F10B50E452B767000014BF000000A0F80528668DB9C60DBF1E1A25090040F10B50DCD6F5DDF0AD8CEAFBD44B120080E217A0B8D5F5A90BAB765FD5EA6B6B87AE0DD583AA25090040F10B50FCD60C5DD3FAFA9DD684C672DD9E010014BF0025A0C7F2D6EFE5DB63450FB34103007420379504D80ACA6ACBC2805903428F25AD17BF7DFED627F458DA23AC18B122D4F5AA93300080F63E1F9302808ED57341CF30F8D1C16D16BECDBABDD92D6CFF97ED43AFD77B6905060068675A7E013A48F9DAF2D07F56FFD063598F4D7E4F2A7AFBBFD03FF4FA7B2FADC00000ED48CB2F4007E9B5A0D76615BE85522B70CF853D251100A09D68F905E820F595F5A176BBDA77F57E000014BF009D5ABA7D510A0000B63DDD9E81CEA27B8CE363FC7B8C1DDAD85F7DBA8DF756C6D87B033FFBC8189FDDC0EB4363F46965FDA53E160080D2A0E517D8565241DA37C6BA181F8FB13AC6A331FE2BC69BAD14C6212B8EEF8EF1B91837C4F85A8CB9310E8FF14C8C17DBF85D036374DBC0DFB224C61D3146C7F860F6772523637C2CDB577E20C6777D6C00008A5F804D950ACCFE311AB2FD509AD2380D8E2DCB0ACEA362AC8AF1E36CFB0F65EFF95D8C7131DE08F9D6E1B4EDE559E1DAD20D593417B169F6A895D9F36FC7382DC6A2EC795DF6B393276354678F3F1FE30FD9EFFEA18F0D0040F10BB0391E8AB173C8B7B8A6A2B76F56D04E8B313C2B4097146C9FD6A716D8E742BE95F73F37E1779465856BB3BE05CF3F5F50F836FB6DC1E39343BE257AA7ECF72683632CF0D10100287E0136472A62F78FF1488C1121DFD29B1C1BE3E1F0766BEEAE21DFF23B332B5A53EBEDB9315E8DD13BC66E59C1FCC9901F2FFC46F6BE2105856BCB96DF1D0BFE8E3D427EBCF045314E08F9AED5CD85F73305DBFD20C605053F1F0000C52FC0463577794EE379BB153C4ECBC231BFAF85B7BB2FA72ECEDF0AF96ECAE9FD6362CC8B5195AD2FB4386CB8E5B7D9EC2C4E0FF996DD6B637C35E4C712DF9B6D73608CF13196FBD8000014BF009BEBA9AC202DECF63C28468F16DB1D9FEDAF8685FCA454A925776207FE5D6932AE6B0A9E9FAAF0050050FC026C8954ECEE13F25D930F0EF92EC9A9E537CDCCFC648B6DFF1CE31B21DF1A9BE2F1901F933B77033FBF70BC6ECB6ECF43DA784F1A277C40568C1F5EB07EA08F0B0040F10BB025FB9E1DB3A236DDEA6878560CA771BD7342BE5BF2BF166C9F5A5E532BF1B090BF9D519A99794A7867B7E696D26CCEF30B9E17767BBEBB95EDD3F8E13493F4BF677F5F5FFB4A0080D2512605C03690C6EC4E0DF9B1B669CCEE922CE665C56D2A7C8FCAB6ED9EC52305FBACF362BC27E45B8093C1ADFC8EF91BF8FD0DADAC4B935E4DCAFEB637B242B93916F9C800008A9BD60C606B1B9415B67505EBFA64056E7337E5D40AFBE1909F802A7555FE75C88FC31D16F2B7463A22C62505EF1FB191DF5916367EB1EFA0186B5AAC4BF712FE661BC53500008A5F8036A556D5FFD984EDA6B678FE68561CA722764A8BD73EB5919F756F56346F4861E17B76B64C2DBEDFF7910100143FDD9E8162D35A97E58D15B6B59BF93BEAA4B96B3BE594538EADAAAAFA37990080D2A1E517802E6FD4A8511543860C195556567662C8DF377AFBECA58B64070014BF001491FADAFAB0FCF5E561FBE1DB87C686C6A675B9B2DC3BB6A95E591D2AFB56BE63DD5FAEFD4BD8EFF8FD42FFA1FD9B9EFFE9E77F0A879D7658E83BB86FD117BC43870E3DA2B1B13175733F36C62EBE2500A0F805A0C895772F0F8F5EF76838F05307865DF6DF254C1C3B311C79E69161E63D33C3B091C342EFED7A87FB7E715F38EFD6F39AB69FFDC8ECB0DD7BB60B739F9C1BDEF781F785C76F783C0C3B6C5858F0C282D0BD57F750B3BA26CCB863461839666451E5E1D4534F1DDDD0D0F0D1F8706C2C7C0734AF8F8F1B73916F0A00287E012872479F77747873C19BA1ACA22CF4DFA97FD8F7B87DC3F37F78BE69995A8107ECB4BE160C7D87F40D7F7FFEEF61D5D25561D1CB8B42CDAA9AA6D6E37E3BF40BF367CC0F77FDF4AE70C2F74E08AB97AD6E2A9C3BABB163C756565757A719C2CF8C716CAC717729A871531378D313852F00287EA1B3185F5555250B745A4F3FFD74D3CD987A0CEAD169FFC6D5CB57879DF7DF79FDF319B7CF082B16AC686ADD1D346CD03BB67D63EE1B4D45726AFDDDE723FB8487AE79282C9EBD38ECF1813DC26E87ECD654280F3F7278A7FD7F5DBA7469183366CCCC58F8EEBB81CD3658F0C67DCE04DF6CA0BDCF67A40014BFE08041517BE69967C22E3BED1276F978E71B3ABA72C9CA30F789B9E181AB1E08675C794618B0F380B06AC9AAA6D6DE6E3DBA35B5E8CEFAE3AC771E20BA5784DA35B5E195075F092F3FF472D398DFBD8FD9BBE93D977FEAF270D2252775EACFE3C9279F4CADB9FBDAE700008A5F8AC52429A0181C7CF0C1E3C3119DF36F4B9353EDFFF1FDC38C3B673415BE499FC17D9AC6F0A6F5A96BF3019F3C20DCF0D51BD6BF67CF0FEF19EEFEE9DD61C7BD760CE515E561E14B0BC3C19F39383C32F191B0F747F66E1A037CDCB78FEBB4135F8D1C3932DC76DB6D2FC6877BBF8B1F73816F36E0FC0614BFB0554C9E3C796E5C4C90093ABBB3CF3E7BFCCC41338BE6EF4D05ED1D3FBAA36902AC07AF7A309CF1CB33D6BF965A8A5F9BFE5A38E6EBC78427273F19F6386A8FA696E0D43A7CE82987366D93667DBEFD82DBC327C67DA2691C7067B3FDF6DBA7FDC73E69CC6F4D4DCDA8C6C6C6D373B9DC0971396833F63FF63D00A0F805A058BDFACCAB61970377097FFBCBDF9A26BB4AB336F7D9BECFFAD7536B6E5AFFC29F5E681A0B9C667E9EF7D779615DCDBAA622384905F1EE47EEDE348B74673669D2A4EAB8B83B452A84D7AE5D9B6E6B74622C844F8FCB9EBE0D00D03594490140D791EEEF9B5A6B97BDBA2CECB4EF4E4DEB96BDB6ACCDEDD34457CFDFF57CD8EDD0DDC2CE07EC1CEAD7D587BADABAA642B8DF8EFD3A7DE1DB5A213C65CA943B627C69E1C285FD524B705ADDD8D8B8CAB703004A9B965F802EA4CFA03EE183E77C30FCF5A6BF86834E3C288CFEEEE8A631C0637E36A6CDF7A45B1CF5E89D9FC17A970376696A114E91A4EED19D75CCEFC6DC7FFFFD75E1ED16E1AFAC59B3E603656565A7C742F8D3B1281EE0DB02008A5F008AD4A7FFFDD34DB730DA6FF47E4DCF9B27BF7AEDD9D7C203573ED0D4BADB6CE63D339B66764EB73A4A637DDF5AF45653CB6FF3ACD0CDF7FFFDE4F84F167D5EB2AED1D3528C1A35EA4B43870EFD442C8247F8C60080E2178022D5F27EBEC97B0E7E4FF8FCD59F7FC7BAFD3E9A2F909B5B79BB8AAC45F8D62C00801261CC2F0000008A5F00000050FC02000080E21700000014BF000000A0F805000000C52F000000287E01000050FC02000080E21700000014BF000000A0F805000000C52F000000287E01000040F10B0000008A5F00000014BF000000A0F805000000C52F000000287E01000040F10B0000008A5F00000050FC02000080E217000000C52F000000287E01000040F10B0000008A5F00000050FC0214A186F286653DD6F690884EA07B75F7505F56BF52260000C52F403BAB2FAFBFA3FF8AFE0D32B1EDF55BD12F349635FE45260000C52F403BEBD9D0F35FB75BB4DDDA9EAB7B4AC636945A7D072D1CB4265793FB9A6C00008A5F807676F4D147BF5E16CA4E79CFECF7AC1DB260485311C6562E7A170D0AEF7DE9BDD515A1E2F3A3478F9E2D2B0040B30A2900683FC71F73FC1FEEBBEFBE3DFB2FEF7FED764BB63BAC7C5D799F62FAFB57AD5A155E7EF9E5B0E79E7B863E7D8AEA4F0F75E5756BEB2BEA9F0E8DE1ECE38E39EE25DF460040F10BD081520B705C7CA418FFF6AAAAAA097131FE99679EB960F2E4C9137C9A0040A9D0ED19000000C52F000000287E01000040F10B0000008A5F00000050FC02000080E21700000014BF0014182305004057532105002563B718BF8FD1903D1F15E3C1186363CC28D8EECA1853A40B0050FC02508CE6C53829C69C18C363AC8AF15C8CDAACF8FD718C33630C932A00A0ABD1ED19A0B4F4CA968517375F8CF1E518E363CC8FF1963401005D8D965F80D2F2468C81319664CFD345CE3D623C1563EF90EF1A3D22C6F352050074255A7E014ACBE8ACB8FD54F67C568CD9312ECA9EA7AED1C74A1300D0D568F905282D0F84FC98DFF9D9F3FBB3E52F0BB6B92646BFA0FB3300A0F805A00855C6B87913B65B1BE328E9020014BF0014A363627C2118CF0B00A0F80528618FC63820C6F4184363CC6D659B1E31BAC7787F8C6A29030014BF00149BE5213FE6F7A090EF023D2EC6E331FE476A0000C52F00A528B5EAFE6BB69F4F512725004057E6564700A56BD7ACE855F802008A5F29002829B7163CBE5F3A0000F2747B06282DDF09F949AFD6C47838C615318EC85EDB37C6ACE056470080E2178022B72EC68C18C3B3E797C6581CA367F6F8CC909F080B0040F10B4051FA63C8DFE2A8217BDEBB8DED2E942A0040F10B40B13A2EC66E31E6857CCBEF7829010050FC0294B2CA6C79748CFF1BF2333EA7D99F9F0EF996E143A5080050FC0250CC0687FCC456699CEFAFB3383EC6BD52030074556E7504505A5297E725D9E30905EBEFCD8AE04A290200BA222DBF00A557FC4E8BF1C31833633CD7E2F5749BA33411D61AA9020014BF0014ABDD0A1E5F1FE3F3520200A0DB334029BB5C0A000014BF00A5EE71290000C8D3ED19A0B4A47BFB5E1063DF182BDBD8E635690200BA1A2DBF00A565765600EF1963C71817B558EE1FA35A9A0080AE46CB2F4069B921DBB7A796DF19D9BA275B2C3F254D0080E2178062755D8C4362D4C5688871501BDBDD2B550080E2178062D57C5BA354F4BE251D00008A5F8052F5871857C41814E38E18EF8971708CE121DF2A9CE67A7823C607A50A0050FC0250AC3E16F2637AD3C45787C65823250000667B062835BBC59815E391906FFD9D18E3FFC4182835004057A6E517A0B4FC264655F678488C2FC6E81EE347314E0FF9C9B0DE0C6D4F860500A0F805A0D3FB48B63C2AC627633C15A336C6FFCB0A60DDA00100C52F002563518CEF173C9F2F250080E217805292BA3A5FD7C66BBF0BF9D9A0A76DE4678CAFAAAA924900280DE3A540F10B508A3E14E37B213FA9E10531A684FC58DFCF66AF4FDBC49FE3400900287E01E8B42E8C31277B9CEEEF7B578C7E311E282880DB3249FA00A06439CE03505252C15B912D2F0FF96ECEBBC6F863C8DFFE080000008ADEC742FE7EBFDD0BD6ED9C2D7F10A3528A0080AEA65C0A004A46EAD2DC27C61B315664456EEF2CBE13E399184FC7382FC6C3D20500287E0128462FC4F8708CB5317E18F2E37E0F8D918BB17B8CA531B68BF16A8CD7A40B00008062B55BB6BC365B0ECF967BC718283D004057A5E517A0B4A4F1BE7D43BEC577518C0342BE2BF490181F8DF1A81401000050EC46C618DC46CC971E0000004ADD7029000000000000000000000000000000000000000000000000000013EF7BBF00000088494441540000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A068FD7FDE8CD9EF8E2563740000000049454E44AE426082, NULL); -INSERT INTO `act_ge_bytearray` VALUES ('212511', 3, 'source', NULL, 0x7B227265736F757263654964223A22323132353130222C2270726F70657274696573223A7B2270726F636573735F6964223A2270726F63657373222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C2270726F636573735F617574686F72223A22222C2270726F636573735F76657273696F6E223A22222C2270726F636573735F6E616D657370616365223A22687474703A2F2F7777772E61637469766974692E6F72672F70726F63657373646566222C22657865637574696F6E6C697374656E657273223A22222C226576656E746C697374656E657273223A22222C227369676E616C646566696E6974696F6E73223A22222C226D657373616765646566696E6974696F6E73223A22227D2C227374656E63696C223A7B226964223A2242504D4E4469616772616D227D2C226368696C64536861706573223A5B7B227265736F757263654964223A227369642D41453336323135452D353838452D343946332D423734332D383330454243423330344130222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22E5BC80E5A78B222C22646F63756D656E746174696F6E223A22222C22657865637574696F6E6C697374656E657273223A22222C22696E69746961746F72223A22222C22666F726D6B6579646566696E6974696F6E223A22222C22666F726D70726F70657274696573223A22227D2C227374656E63696C223A7B226964223A2253746172744E6F6E654576656E74227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D38323934394441432D433932442D344241422D393932342D314632373945353044424338227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A37392E32323232323232323232323232332C2279223A3131367D2C2275707065724C656674223A7B2278223A34392E32323232323232323232323232332C2279223A38367D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D39434334443631332D313435312D343133432D414638352D383046383839314244313934222C2270726F70657274696573223A7B226F766572726964656964223A226D616E616765222C226E616D65223A22E7BB8FE79086E5AEA1E689B9222C22646F63756D656E746174696F6E223A22222C226173796E6368726F6E6F7573646566696E6974696F6E223A2266616C7365222C226578636C7573697665646566696E6974696F6E223A2266616C7365222C22657865637574696F6E6C697374656E657273223A22222C226D756C7469696E7374616E63655F74797065223A224E6F6E65222C226D756C7469696E7374616E63655F63617264696E616C697479223A22222C226D756C7469696E7374616E63655F636F6C6C656374696F6E223A22222C226D756C7469696E7374616E63655F7661726961626C65223A22222C226D756C7469696E7374616E63655F636F6E646974696F6E223A22222C226973666F72636F6D70656E736174696F6E223A2266616C7365222C22757365727461736B61737369676E6D656E74223A22222C22666F726D6B6579646566696E6974696F6E223A22222C2264756564617465646566696E6974696F6E223A22222C227072696F72697479646566696E6974696F6E223A22222C22666F726D70726F70657274696573223A22222C227461736B6C697374656E657273223A7B227461736B4C697374656E657273223A5B7B226576656E74223A22637265617465222C22696D706C656D656E746174696F6E223A22636F6D2E6C656E2E6163746C697374656E65722E4163744E6F64654C697374656E6572222C22636C6173734E616D65223A22636F6D2E6C656E2E6163746C697374656E65722E4163744E6F64654C697374656E6572222C2265787072657373696F6E223A22222C2264656C656761746545787072657373696F6E223A22227D5D7D7D2C227374656E63696C223A7B226964223A22557365725461736B227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D43423837323236392D433930412D343839342D394538382D304538384238364543384446227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3238382E32323232323232323232323232332C2279223A3134307D2C2275707065724C656674223A7B2278223A3138382E32323232323232323232323232332C2279223A36307D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D38323934394441432D433932442D344241422D393932342D314632373945353044424338222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D39434334443631332D313435312D343133432D414638352D383046383839314244313934227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3138372E36303530353132333635343432382C2279223A3130302E39303833313534363834373331327D2C2275707065724C656674223A7B2278223A38302E31373533333037303739303031392C2279223A3130302E32393039303332383135323638387D7D2C22646F636B657273223A5B7B2278223A31352C2279223A31357D2C7B2278223A35302C2279223A34307D5D2C22746172676574223A7B227265736F757263654964223A227369642D39434334443631332D313435312D343133432D414638352D383046383839314244313934227D7D2C7B227265736F757263654964223A227369642D32323745363933372D423435362D343735432D424332332D453842383539374238354131222C2270726F70657274696573223A7B226F766572726964656964223A226872222C226E616D65223A22E4BABAE4BA8BE5AEA1E689B9222C22646F63756D656E746174696F6E223A22222C226173796E6368726F6E6F7573646566696E6974696F6E223A2266616C7365222C226578636C7573697665646566696E6974696F6E223A2266616C7365222C22657865637574696F6E6C697374656E657273223A22222C226D756C7469696E7374616E63655F74797065223A224E6F6E65222C226D756C7469696E7374616E63655F63617264696E616C697479223A22222C226D756C7469696E7374616E63655F636F6C6C656374696F6E223A22222C226D756C7469696E7374616E63655F7661726961626C65223A22222C226D756C7469696E7374616E63655F636F6E646974696F6E223A22222C226973666F72636F6D70656E736174696F6E223A2266616C7365222C22757365727461736B61737369676E6D656E74223A22222C22666F726D6B6579646566696E6974696F6E223A22222C2264756564617465646566696E6974696F6E223A22222C227072696F72697479646566696E6974696F6E223A22222C22666F726D70726F70657274696573223A22222C227461736B6C697374656E657273223A7B227461736B4C697374656E657273223A5B7B226576656E74223A22637265617465222C22696D706C656D656E746174696F6E223A22636F6D2E6C656E2E6163746C697374656E65722E4163744E6F64654C697374656E6572222C22636C6173734E616D65223A22636F6D2E6C656E2E6163746C697374656E65722E4163744E6F64654C697374656E6572222C2265787072657373696F6E223A22222C2264656C656761746545787072657373696F6E223A22227D5D7D7D2C227374656E63696C223A7B226964223A22557365725461736B227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D37363332463035442D343046342D343145362D383039352D323634444444333541324332227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3439372E32323232323232323232323232332C2279223A3134307D2C2275707065724C656674223A7B2278223A3339372E32323232323232323232323232332C2279223A36307D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D43423837323236392D433930412D343839342D394538382D304538384238364543384446222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D32323745363933372D423435362D343735432D424332332D453842383539374238354131227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3339362E34323134343039373232323232332C2279223A3130307D2C2275707065724C656674223A7B2278223A3238392E30323330303334373232323232332C2279223A3130307D7D2C22646F636B657273223A5B7B2278223A35302C2279223A34307D2C7B2278223A35302C2279223A34307D5D2C22746172676574223A7B227265736F757263654964223A227369642D32323745363933372D423435362D343735432D424332332D453842383539374238354131227D7D2C7B227265736F757263654964223A227369642D42383042363037442D363646352D343834422D383041312D373935334238444445363943222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22E7BB93E69D9F222C22646F63756D656E746174696F6E223A22222C22657865637574696F6E6C697374656E657273223A22227D2C227374656E63696C223A7B226964223A22456E644E6F6E654576656E74227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3632382C2279223A3131347D2C2275707065724C656674223A7B2278223A3630302C2279223A38367D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D37363332463035442D343046342D343145362D383039352D323634444444333541324332222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D42383042363037442D363646352D343834422D383041312D373935334238444445363943227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3539392E393730343836313131313131312C2279223A3130307D2C2275707065724C656674223A7B2278223A3439372E37333433373439393939393939342C2279223A3130307D7D2C22646F636B657273223A5B7B2278223A35302C2279223A34307D2C7B2278223A31342C2279223A31347D5D2C22746172676574223A7B227265736F757263654964223A227369642D42383042363037442D363646352D343834422D383041312D373935334238444445363943227D7D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A313230302C2279223A313035307D2C2275707065724C656674223A7B2278223A302C2279223A307D7D2C227374656E63696C736574223A7B2275726C223A227374656E63696C736574732F62706D6E322E302F62706D6E322E302E6A736F6E222C226E616D657370616365223A22687474703A2F2F62336D6E2E6F72672F7374656E63696C7365742F62706D6E322E3023227D2C227373657874656E73696F6E73223A5B5D7D, NULL); -INSERT INTO `act_ge_bytearray` VALUES ('212512', 2, 'source-extra', NULL, 0x89504E470D0A1A0A0000000D49484452000002A6000000BE0806000000E761CD40000000206348524D00007A26000080840000FA00000080E8000075300000EA6000003A98000017709CBA513C0000000467414D410000B18E7CFB5193000000017352474200AECE1CE900000006624B474400FF00FF00FFA0BDA793000000097048597300000EC400000EC401952B0E1B00001B104944415478DAEDDD097C54D5BDC0F1FF9D992C6C090442202C52A4802B8BA855A1202250B18A169B44C402DA67DD5ADBBEF7146D2D7EACFADADA576DA9FAEA82C56042D14FA90BE256A3E02E104411102112246058122021093373DFF9E7CE984B4C3090643299F97D3F9F6366EEDC593CDCFF9CFF3DE7DC33220000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C4178B2A0044366FCEB9FAC081E3675556669E5A51715CE76030914A69EE978B15908E1DB797272595AE32B7EF1B39F2D667A8156208C41040620A34E2D34F677E7FEFDE11F36B6ABA77CFCC7C41BA76FD4852533F118FA786CA69264D4CF6EF3F5ECACA4E96929249C160D0F7597575CA65E3C75FBA86DA2186400C0124A680CBA64D33EFFAE28B0BE60C18906FF5EBF7AFDADE09B49EE2E28B65F3E619871213F7CF3CFBEC594F5223C4108821A03E2F5580786D5077EE1C3FE79453EEB43232969B06D5A6525A596AEA06E9D1E33D6F49C9F7BE3F6BD60FD7CF9FBF781DB5420C811802484C11D70A0B6F1B5D5A3AE6316D5075C8B1BE9A83A9B2FD93F1F2C5DAC952B27EACECDBF96DF1FAAA25B9CB2E2AAF991213CB242DED03EFB66D174EB9FCF259CFE4E6E67E49AD1043208680300F558078535595B948871E1B6A50FDD59DE4B3B77364EFB693C55FD3A176DBC17D3D656BE1F7654FF1A9545E0BE8DCB948060D9ADF2131B1F2116A83180231049098226EAD5A75D7797E7FD7DE3A1FAE21BB3E1F2187AABA34F8D88E0DDF15DB26645A42BF7E4B3C3EDFC1C12FBFFCF277A80D6208C41040628AB864DB093FCBCC5C6A357691C6C1F25E8D3E577B7FB437082DA34F9FE7F5CF0FA8096208C41040628AB8545DDDFD0C5DCEA6D14637E8FB8646999069296969ABBA793C3593A8096208C41040628AB85459D93BBDA1797188BC2E5D3E936030E1446A82180231049098222ED976828785BFA3E4CBA7F6DFC16265106208C41040620A3424A143F9911F4FAAA092006208008929D0FABAF75F2309C9FBBFB6DDB282923EF07DB13C7E2A09208600909802ADAF63D7ED92D66FEDD7B66B43DB7B68011504104300484C81C8F1D7247F6D5B3090585B00104300484C810834A61DA4F8C3EFC99EADC31B7C6CE31B3365DF97C75351003104A095F8A80240E4C0EE7E52BC664AA3BF58A3F4F7BF8B3EB854BAF72F945E43DE106F42351507104300484C8196113894243B379D23BB8B463479E1EFDD5B87CBFED26F49E689AF494AC6A7542288216208400B61281F714D7B78766D39EDA87F8DA6B6E767E5D423FEFC22400C114300484C81266BEEC518017F02950862881802D04218CA475C1B78663E9500104300A2043DA6000000203105000000484C01000040620A000000D4C7C54F0000006D60FAF4E97DFD7EFF54CBB2C69ABBFA9369BA7E5A6753AA4CD961DB76A179EC4DAFD79BBF70E1C26D24A631E68C85975FD6B928382BB95C4E4F2EB7527D07ED044F8D48D06BDB810E96BFBA8BECAC49B13F0874F3DDFDEA4D0BDF27640000404BCBC9C9996AFE5C1FF4FBBF6B12CF86D65C4B366580796C80F93B351008FC213B3BBBC0DC7F342F2F2F97C4B49D3BEF7739BFEF506A5F9FB022D8715F1F91D253450EF6B0A5C69C9304CDE1E0A9B12C5F952474D8257D53B65A7DBB6E084CBDF8869C2F2D4BEE59F297BCFB08210000D05C26B91C60D9F643B66D4FAADD60128DA330CE3C6F9C798D6B4CA23A6BF1E2C59B484CDB9931F3B2CF4BD9224FFB8AEDD46DA345CAF5BCA38159B59A9CD6684931FB0C14291E27925A64F7CC5C21FF3BF59AAC9F275404272ECE5DBC8190020000C7222B2B2BDB63DB0F042DAB5B789BD7B6E5E41D3BE4CC6DDB64D0AE5DD2B5AA4ABA54574B6562A29425274B51D7AEF25EBF7EB22A33530E79BDE1A78DF67ABDAB737272AE8DC5DED3984D4CCFFD5DD62369AB64F6CE5162ED1829477D999726B1A6583D575BFDFBBCE35B3BF5C69CFFA6F71400001C43527AA1C7B2728326170D27A4DFDBB041267EFAA9A457547C6DFF8E3535B52573DF3E397BEBD6DA24F5F9A143E585214324E0F4B276B66DFB09939C269BE4F49158AAAB98BC2A7FCC5FB39FE8F69975D5A68B4D523AAA79FF975F8E10D930CD4EF054D97FB8F867D9B7125E0000E02892D26C93942EB14349A9269BF72C5B26D30B0B1B4C4A1BA23DA9BABF3EAF5F79F957DB4D72FAB0494EAF20318D62E7DE9D3DAFC71A99BEFE872215BD5BE6352BD345D66789CF572173A75D95733561060000BE89CE2935D9E803E1A4744869A9CC7DF5D5C392CBA3A1CFD3E79FB273A73B397DD024A743494CA3D079F7649DDE7D9375EDE62962E97CD196A4AFF7E9259260F9EDFB63E900000000AD96643D129E53AA3DA5BF5CB1A2760E6973E810FF4D6FBEE94E6E7558FF6112D328D469A767E98E51B6A7A57A4AEBD39ED32FCE968E8712ED45841B0000688C2E091514394F6FEB9C524D269B9B94BA93D31BDF7AABF6754346C7CA907ECC24A613EFC899631DB2BBEB9CD0D6A4AF7FA8A31C1F6B733ADA8BECECEC5F69B08F1B378E1F87008821209A63E5FAF00DBDD0E95887EF1BA3AF77E1FAF55FDDB76DFB9A58A8F798F9624A2AB3FF73DB18B182DED67FAFADE3A5D3C0A5C19BCDCD5C4237E2EE34C127191919E5E64BE359CBB216FAFDFE158B172F3E108D1FB6A44464DB3691D34F3F7CBBDF2FB277AF487AFAD1BD9E394996C4C4861FFBDBDF4466CE6CFCF1F03EA3478B9C78A24861A1C8F0E1CEF6CF3F1739EE380EAE788AA15EBD7A556465652DF1783CB9D11C436E0B173AC76F538FD537DF14D9BF5F64F2E4BA6DC1A088C7430CE1A862A5CAB437AF9AF6665E5363457FD12918089CABB76BAFC0DFB8B1553EE06493F02E1D3C38BC94D4689DD39A9F9F5F4462DAC626FC317B846F8374AB5DA73402F61FA76BE27AFAC7C201D05E992F8854F3E70AF3A57185D7EBDD63FE2D9E31DB16252525153CFEF8E355D1F239172C10193850E4B4D3449E7842A47B77A7517CFC7191F1E3457EF21367BFDDBB4556AF766E57563AF757AE14B9E00211FD3E1B30C06960B76E15B9ED3667BFE26273C6DCAFEEBD3A751279FF7D9173CEA9DB567F9F0F3F14B9FC72E7F68D378ABCFAAAD308EBB6E5CB1B6FB011933A9998996E6268BA89A17D2686FE65EE3F196D31E4A631A4B1D05802F8DC73871FC36FBF5D978CAA22F36DBD6C99C8534F39C73D318426D25F619A6262658A3991AB34B1F2A2B9FF687272F2AB8DC54AE867466BB3C561252592A65FECAD40AFD61FB97DBBBC5B77904E33E55E12D3B6FE9FD823D7EF1B2056242726EC1D6CFBD30BDBFF011023D24C9969BE346656555555982F8DC5E60BE15F252525CF151414F8DBEA4369EFA6F698DE7CB3C84B2FE919B439567D4ECF4A8F1E7549A9D284F58413449E7D56E4B2CB44BA741179EB2D2731D52475CC1867BFA54BEB9EF3E49322279D54D710EA459AA9A975FB141438AFABEFAF3DB4E6FB4B0E1D12D9B44964D72E91BE7DEB7A86FAF7A7418D737AB9E80C1343334C0C55E5E4E4FCC3DCFF675BC7507D1B3638230D8DB9F0422791DCBCD9399E93939DED1A4F1A031A63D75D470CA1599D221DCD9F4BB49850A931EDCDF366DB82FAB162B68D0DDF3E430FCA56A4AFEF4A4CC792984681844A19BBFB84C8BE67D90049EBF1919C4F621A7DBD40E124B557AF5E7B4C036B5242F97B5BF4023DF698C86F7EE334A40F3DE4F49A262589DC7AABD3806A43E77345609F3EE6584E70F6D1C64E135B6D20D7AC697C68515F274CA70C68E378EAA9CEFDA1439DDE5AA50DEA8E1D4ECF51B76ECEF6471F753E9BBE67D8451799CAFABBB30FE2B777C8C4CF95E6EF952686B427F525FD7DEE68E8490D4F813912EDF15413273A31A1468C70924CBD7FEEB9C4105A8C7E335F62E2E5928C8C8C4AD3DE2C37F7EFD3583149EBF0F04E03F7EC69D50F31A0ACCC7D77787BAFD498484C13F7591995E97644DFF3600FF39F803DC27C69CF2536A3569AF9C2C8367FB3CD97842E72BCA9B4B434226FAC43889A546AE3F4FAEB220F3EE8346C7FFEB3C8BC794EE376CD35221326E8959BCE7D6D74B53766FB76A7C74793D1708FA9EEA7DC3DA6DA8B73E79D4EC2ABD6AD737A62B571D5214B9D673F678EF358E7CE2283063949AFF600E93EDAA0EA67D3A151A5AFF5EB5F47B6413D70E0801043514D7B52A799389AA63164FEAD3E8B540CD5A7276A3A57BB29D78F7CFCB1D35BAA31A1B417544FF0860D3B7CBFF61E43A5A59D64D5AA55C45014D09E54132793CCCD491A2BC6574949D7AAD63D9FABF7FA3D484CA380B7DAEE78A85384CFDC7588C8B67408F9378464BBF9E218F4DE7BEFD52682ADEDACB39C796CAFBC2232638636204EB9E38EBA7DB4B7E5A69B9CC454870075EE9B0E11EAF0A0366C4DE931D5FDB521543A6D407B89B401D5B96EDAB0BAE930A5EE9F9B2B72E595CE7B4C9DEA3CA6C9B07E9E8E1D23FB6FB2D1B92080186A3F8E8F540CD5A7B1A4C3EE7A02A7C7724646C3FB69423AA281D559B427D4B526794CC4D0EBAF7F4B563B93D389A1286C72C2375A6A89A8C6E8D251EE1020318D021EBF788389917D4F7D3FCBF925873B88BF883AE62F6093986E1E3E7CF8C0487D506D2F34A10C2799DAD8E9C5197A5B1BCF7FFFDB994F1AA643809ABC8E1BE7ECABBD31EE1E539D2757BF61D5463ADC8BBA76ADF35EFADA7A3B33B36E3F6D641F78C079FC8A2BBEDE78EABE914E4AD5E0C183B5612586A22F8602B66162C6573F86468D1A35B02D3EB426A63A4FBB572FE758BEA391A34663262CDC5EEB367DBE269E7979725862DD9E6368ECD82DB279F30C62A8EDDB1BBDBCCE532F568226846AB7ED4F4A6AD5E4B4F2F09E8BAAF65EE931919806BDE2F7D4882F92C9A9793FB1C5AE5E94BF682EB11B39D9D9D94D4E4CCD974299F972784597944A4A4A5AA6F3E366CF9E1D91391F3A34FF8B5F38BD2F59597573D694368ADA38BA1BD0FACFD57972FA5C6D58B5E1D4BF7A45BE26A9EE2B84758E6AF875DCBD3D9AC4BA7B7BF4E2292D37DC70E4CFAD89F1D12E61D51C9DCD87CDCFCF2786A220864CBCE8851B41132FFA4DEA357FDB3486DCF4244DA7B78487DC350EB4B3DD9CD77C452F2A0C9F0C86E9CA164AB7E963FA3ABAD493FB386FCF31949E5E2123478E949B6FBE99188A7C7BE34E463DF563A5AAAACA9CDAC8207DB0CC9CE9B466625A967C5827E92E12D368484C93A522A14252AB239898FAAA6A4F897613BA6D2BD4AB63B936E9FA72CB4C59D4A14387574C435AD6169F4B87E6C34BC76862F9DA6B5FBFE8C22D3C6CFFC61BCE73B4674893D38A0AE74A64EDA5D1C6B2FEDC355D4BB1A1DE1E6DC48736E18773B507D6DDF8BEFBEEE1178320E6699F62C0940EAEDED1A88821B75B6E11B9D77599A90EBD4F9922F2FCF37543FABA8494165D01A3674F2716C2173FE914009D2FAA71161E7A2786700CED8DDF15279E23C58A496A0BC389E9E6B4B4165F5CDFADA86B57F7DD4212D3281048904F3A96CA77AA2378D146A71DB2CDB2DBFF01D0DE859252FD7278CA94E79393939F8B863518B537E7AEBB447AF71639FBECC67B47754D44ED4DD5354A35019D3FBF6EC999F05A8ADAF0694F8D5E70A1FBBBE9C51B61EEDE9E867A9C0E985A3A7830743217747A90162F767A80F4FD9536E4DACB14EE9942CC4B7425A3511543613A64AF8BDE0F1A54B74D93D1BBEF1619354A64EE5C6754227CDC6B0C8417D1D72453AF98D784557B4DC3EB99124338C6F6C6D7D4583149ECEB667F5D5252DEEBD74FC66ED9D26A9FEB3DF7309AC8EB24A6D170B0F8E5D994AD72C6DEC1915BC9B4DB46DB7C4D59AF13AA6D76E6AA67A6051E8F27BC145459347D3E1D62D4A5A2C24BCD2C59E20C196A63A9F34AC33D34DA23AA8DAC967003A9C3943A17353C1CA8438ADA0BA3F4A45BAF306E688171BDA25F1BC5867A79C2AB0368C21C6E74B5072ADCB3A36B3BEA851B7AC5B15E240262A8ADE90999FE7293267D7A52569F2690FA0316EFBCE31CFB6E9A406AC278FBED222FBEE86CD393C46F420CA1A562C5E7F32D0904027FD29B6BCCC1B7A763C75659645F87F1576666EAF49AF0C8E15324A651A0C341EF026B53E0579F8F970E914A4DBB1659DD63E10068877E6DCE428BCC99EA53D1FAEB3461035D9788D41F3E3C126D847FF4A3A37FBFD9B38FFC538AFA19DC9FC33DDCD8588F2E88A1B6A2276B975E7AE47D747A4C435364525244AEBA4A64D6ACA35BF49E18424BC5CAC2850BB7E5E4E41498A47642C0B2E485C183657A61CB0FB22E1B3244FC5E6F38295D110BBF46191389A91E00D366E77C9C5A648F2A8FC0F5A2DD36DA1F5935529E9FBFA888B88D2C1374BFA5161A9698481D8018723BDA5F622286D0C2B1F257536A57A17EC12490DFDDB2A545E79A16A7A6CAB343877ED55B6A92E8FF8B89B88D950328E1A0DCD5FF356BBF045BFFBD06BC6CF93C96E721C216000034242F2F6F89F953A0B7B5D7F4BE73CEA95D3AAA25E81251F79F734E205877F1EF8A9292927C12D3283B00122BECB5BD3F90565DC9B6DF6BF61BDE6AD9152B070000006835B324B484D3F69414F9E3E8D1CD4E4E35293549AEFD454A8A37B4E980C94F7F5C5050E027318D32965FA6F77E47AA3A6FAF5DFEA4C575DE2145196B3C4363E900000000AD43E77CDAB67DA3B9599B336C484F97B9E79D573B0C7F2CF479B74F9810589B91F1D532892627B9362F2F6F7DACD49927D60E00EB90FD93414BACFD89FB5AF6B593CA65C790459260D9F2CB583A00000040EB59B468918EB0FE389C9C6ACFE99CC99365E1F0E1F517C76F94EE973F6C98DC3279B2BBA754570C98637292DC58AA2F5F2C1E00D9D9D9C9272D907B375E2A5D2A32A5D9D3D93B9758EB86FCC34E15BF3D2F6F517E2E610600009A2A3F3FFFF1ACAC2CBDB2FF41CBB2BAEA9CD3E7860EADBD286A5849899C515C2C03F7EC91AE5555B5BF12A5C3F59A8CEAE2F92BFBF695957DFA04ABBD5EED4C0CF794EA7AAA379A9CE7F158AB2B5F2C1F004317590F947C47766D3F53328FB16FD8DFFF6579B9E747F648B1E596FC183C00000040EB0B759CBD6312D387751929DDA609EAAACCCCDAF20DDC59CC0A9D5218ABA3B7BE583F00FABC633D9CB1DA0E6C99248965C74B46539F9FF689FDC680973D291EBFDDC51C00E3F2F219BE070000C72EB4CEE8F9263F9966728B6B4C823AEE2872B115A63CBA63C78EDC58BECEC5172F07C0B79FB1AE09786D39D05B8A779F2C29077ADA9DFC5D24239068F9BC35B2DB77400E74DE21C53DD64975972FAC4112D0B313FBFE583F00000040C4F313FD819EA7A64F9FDE37180C4E3309AAFE08F528537A99A2134F75D85FAFE6D755F9F557269F8A85C5F3E33E316DE80048DD169C9652AC0780A507803F54079D4CD15F402E730E003B6E0E000000D036F40782CC9FFB4205F192987200000000443F0F55000000101159A61CE7BAAF1D84BF6FC2F396C54BCE46620A00001019634CF9DC755FA714760CDD0E2F6FA9734C4F0B25B0E152634A3FD7FDBB4CE9168B15E48BE38363B029E9A6BCE9DA7653E8AC247C05FE99A69C250CFD030080E6196ECAFC50FE3138B42D68CA00532E30E574531E30A5D49495A184B532B45F852BA1D515866E8BD54A8AF5C454CF4CBA9832DE94BDA6AC0E9D89CC0EFDE3EFAFB7FFB07A49E845A1FD0000008E95F6868E3065A13843F7F798B233F49826A54B43C5ED5953FE18BA9D19DA4FCD34253B94D49298B633CB437FBB9B5262CA2BA6740E25AAEE03A04FE880E91BFA87D7B397BCD073BE30657228B17D97D8020000472939945CCE31E56953768B33DF543BC8B45774AA381D694FB89EF3A52B5799E1BA7D4AAC26A5F1909836E50CA626947CEA01A1BF675B60CAEDA1339AA75D6728DAFD7EA9D40DF303000034C53E531E136764767928FF7821B43D9C70A6D77B4ECF500EA2CFE96FCA2C717A59CF8AE58A8AE5C4F444530686CE2AC2FFA889A1B39601A17FEC8B4D992B4ECFE8845022AABDA96F859E5B2DCE1CD49AD0D9CD6E620B00001C835C53FE29CE34411DC1FD2F53DE0E3DA6B989F684DEE1DA5F87F1DF17A767756B281759EA7A0E89693BB32E54944E320E5FD4E41ECA770FE7A78712543D13F95DE8AC242394B04A28B965281F00001C8B4952F7C33E43433947380FD1DCA453BDFDFF6DCAFDA6FCC29479A6BC64CAFF88D3A14662DACE9D24DF7C65BDF6ACEA4F8269D7F9BE50325B2475F3542F21A60000C031E81E4A3035BFD02BEE5F09E515E1CEAFE47AFB6B67D9D5A6DC22CE352E4AAFD6FF9B38530034697D2494DC9298B633BACED7F626ECA7DDE73F15679DB0D389210000D042742AE022533E746DDB164A50556757EEA149ACF6A8DEE3DAB726F477B32953C419C52D89C58A8A87C4F43FC4199AFF267A76A2DDE87A65DC0DE20CE59F2DCE4551F152570000A0757C58EFFE7CD7ED03A6BCE64A6297D7DB7796EBB65EC51FB3F34C6339D9D2330E5D205FE76754B9B66BF2B9B181A4F42CD7D9C9BDE24C4ED649C7E1ABF00712530000A00D04E3E57F349613533DE358DAC076ED09FD73BD6D3A6FE3997ADBEADF9F475C000000B41E0F5580786259FE403098484544C3E97FEDBF831DA02688211043008929E2526262D9E6F2F213A88828505E3EA4C4A439ABA9096208C41040628AB864DBBEE7CBCA4E0952136D6FE7CEB1BA60740135410C811802484C1197AAAB53FF5E5C3CB5D2B6BD5446DBF297944CD60B149FA62A88211043008929E2D2C489130BFDFEE4F7B76EBDA49ADA683B1B365CB73C10482A3AFFFCF3DFA13688211043008929E296DF9F70DD679FCD3C585E7E02170DB4817DFBBEBDA9B878EA89C160F0E7D4063104620870632C067127373777D79557CE5EB973E7D8C9DDBAADE9909CBC8B13B48835A8833FFEE083BF249BAF9E6B274E9CB8821A2186400C0124A6887B0B162CD83C63C6D585DBB74FBCC8B67DC5DDBAADED6E593615D37A0EAC5BF7CBA5EBD7FF748836A813264C788E2A2186400C01F5595401E2D98B2FBE38D4E3F1FCC9EBAD19DEB3E71B9B32320AD2D3D2561FEFF1D4F013B4CD140C2696EFD933ECA39292F37797968E19120CFA8A75E871D2A4491F513BC410882180C41468C44B2FBD34DCB2AC1F989BE34C19654A32B5D26C7E530AC559CEE6692ED22086400C010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022E0FF0121C2023A02FEDB030000000049454E44AE426082, NULL); -INSERT INTO `act_ge_bytearray` VALUES ('247534', 1, '请假流程.bpmn20.xml', '247533', 0x3C3F786D6C2076657273696F6E3D22312E302220656E636F64696E673D225554462D38223F3E0A3C646566696E6974696F6E7320786D6C6E733D22687474703A2F2F7777772E6F6D672E6F72672F737065632F42504D4E2F32303130303532342F4D4F44454C2220786D6C6E733A7873693D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D612D696E7374616E63652220786D6C6E733A7873643D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D612220786D6C6E733A61637469766974693D22687474703A2F2F61637469766974692E6F72672F62706D6E2220786D6C6E733A62706D6E64693D22687474703A2F2F7777772E6F6D672E6F72672F737065632F42504D4E2F32303130303532342F44492220786D6C6E733A6F6D6764633D22687474703A2F2F7777772E6F6D672E6F72672F737065632F44442F32303130303532342F44432220786D6C6E733A6F6D6764693D22687474703A2F2F7777772E6F6D672E6F72672F737065632F44442F32303130303532342F44492220747970654C616E67756167653D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D61222065787072657373696F6E4C616E67756167653D22687474703A2F2F7777772E77332E6F72672F313939392F585061746822207461726765744E616D6573706163653D22687474703A2F2F7777772E61637469766974692E6F72672F70726F63657373646566223E0A20203C70726F636573732069643D2270726F636573735F6C6561766522206E616D653D22E8AFB7E58187E6B581E7A88B2220697345786563757461626C653D2274727565223E0A202020203C73746172744576656E742069643D22737461727422206E616D653D227374617274223E3C2F73746172744576656E743E0A202020203C757365725461736B2069643D22757365723122206E616D653D22E7BB8FE79086E5AEA1E689B9223E0A2020202020203C657874656E73696F6E456C656D656E74733E0A20202020202020203C61637469766974693A7461736B4C697374656E6572206576656E743D226372656174652220636C6173733D22636F6D2E6C656E2E6163746C697374656E65722E4163744E6F64654C697374656E6572223E3C2F61637469766974693A7461736B4C697374656E65723E0A2020202020203C2F657874656E73696F6E456C656D656E74733E0A202020203C2F757365725461736B3E0A202020203C73657175656E6365466C6F772069643D227369642D30443235384332342D314631392D343233332D413937362D4130443843423944414541432220736F757263655265663D22737461727422207461726765745265663D227573657231223E3C2F73657175656E6365466C6F773E0A202020203C757365725461736B2069643D22757365723222206E616D653D22E4BABAE4BA8BE5AEA1E689B9223E0A2020202020203C657874656E73696F6E456C656D656E74733E0A20202020202020203C61637469766974693A7461736B4C697374656E6572206576656E743D226372656174652220636C6173733D22636F6D2E6C656E2E6163746C697374656E65722E4163744E6F64654C697374656E6572223E3C2F61637469766974693A7461736B4C697374656E65723E0A2020202020203C2F657874656E73696F6E456C656D656E74733E0A202020203C2F757365725461736B3E0A202020203C6578636C7573697665476174657761792069643D227369642D35353636443037362D414234432D344134322D393938462D323533373738394638313831223E3C2F6578636C7573697665476174657761793E0A202020203C73657175656E6365466C6F772069643D227369642D33334642463234452D464537302D343730412D394442352D3942313838314531333834372220736F757263655265663D22757365723222207461726765745265663D227369642D35353636443037362D414234432D344134322D393938462D323533373738394638313831223E3C2F73657175656E6365466C6F773E0A202020203C6578636C7573697665476174657761792069643D227369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535223E3C2F6578636C7573697665476174657761793E0A202020203C757365725461736B2069643D227573657222206E616D653D22E8B083E695B4223E0A2020202020203C657874656E73696F6E456C656D656E74733E0A20202020202020203C61637469766974693A7461736B4C697374656E6572206576656E743D226372656174652220636C6173733D22636F6D2E6C656E2E6163746C697374656E65722E4C656176654C697374656E6572496D706C223E3C2F61637469766974693A7461736B4C697374656E65723E0A2020202020203C2F657874656E73696F6E456C656D656E74733E0A202020203C2F757365725461736B3E0A202020203C656E644576656E742069643D22656E6422206E616D653D22656E64223E3C2F656E644576656E743E0A202020203C73657175656E6365466C6F772069643D227369642D34373638373538312D333535422D343335342D383433432D43333034323333323836414622206E616D653D22E5908CE6848F2220736F757263655265663D227369642D35353636443037362D414234432D344134322D393938462D32353337373839463831383122207461726765745265663D22656E64223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D747275657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C73657175656E6365466C6F772069643D227369642D46423539344242452D383030352D344544432D423343382D39373831454432323643393522206E616D653D22E4B88DE5908CE6848F2220736F757263655265663D227369642D35353636443037362D414234432D344134322D393938462D32353337373839463831383122207461726765745265663D2275736572223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D66616C73657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C73657175656E6365466C6F772069643D227369642D39394343413337462D413233352D343835332D383437322D44453233334144324544333222206E616D653D22E9878DE696B0E794B3E8AFB72220736F757263655265663D227573657222207461726765745265663D227573657231223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D747275657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C73657175656E6365466C6F772069643D227369642D35313046453036322D433042432D343643382D394231372D38413338303732413242433622206E616D653D22E4B88DE5908CE6848F2220736F757263655265663D227369642D42453337324431342D463530392D344544422D383745382D37423231303738333541453522207461726765745265663D2275736572223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D66616C73657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C73756250726F636573732069643D226368696C6422206E616D653D2273756250726F63657373223E0A2020202020203C73746172744576656E742069643D22737374617274223E3C2F73746172744576656E743E0A2020202020203C757365725461736B2069643D22616C6C6D616E6167657222206E616D653D22E680BBE7BB8FE79086E5AEA1E689B9223E0A20202020202020203C657874656E73696F6E456C656D656E74733E0A202020202020202020203C61637469766974693A7461736B4C697374656E6572206576656E743D226372656174652220636C6173733D22636F6D2E6C656E2E6163746C697374656E65722E4163744E6F64654C697374656E6572223E3C2F61637469766974693A7461736B4C697374656E65723E0A20202020202020203C2F657874656E73696F6E456C656D656E74733E0A2020202020203C2F757365725461736B3E0A2020202020203C656E644576656E742069643D2273656E6422206E616D653D22656E64223E3C2F656E644576656E743E0A2020202020203C73657175656E6365466C6F772069643D227369642D46333946364639322D463330412D344630452D423946382D45304444454231313530363522206E616D653D22E5AEA1E6A0B82220736F757263655265663D22616C6C6D616E6167657222207461726765745265663D2273656E64223E0A20202020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D747275657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A2020202020203C2F73657175656E6365466C6F773E0A2020202020203C73657175656E6365466C6F772069643D227369642D33453941414432332D343444412D344138352D383242442D4436433833304134433439382220736F757263655265663D2273737461727422207461726765745265663D22616C6C6D616E61676572223E3C2F73657175656E6365466C6F773E0A202020203C2F73756250726F636573733E0A202020203C73657175656E6365466C6F772069643D227369642D41453541454438342D303734362D343738372D393836462D36413739323743333443333422206E616D653D22E5908CE6848F2220736F757263655265663D227369642D42453337324431342D463530392D344544422D383745382D37423231303738333541453522207461726765745265663D227573657232223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D747275657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C6578636C7573697665476174657761792069643D227369642D39353037343945412D344242362D343237362D423637412D444530334533344130353733223E3C2F6578636C7573697665476174657761793E0A202020203C73657175656E6365466C6F772069643D227369642D30344339463239412D304242352D343639312D383034432D37363445344530413237313622206E616D653D22E58F96E6B688E8AFB7E581872220736F757263655265663D227573657222207461726765745265663D22656E64223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D66616C73657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C73657175656E6365466C6F772069643D227369642D37463032463244352D413642412D343233342D413732342D3346383938443233354134422220736F757263655265663D226368696C6422207461726765745265663D227369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535223E3C2F73657175656E6365466C6F773E0A202020203C73657175656E6365466C6F772069643D227369642D38344442433035362D303639312D343733452D383243462D44333235454637333641373222206E616D653D22E4B88DE5908CE6848F2220736F757263655265663D227369642D39353037343945412D344242362D343237362D423637412D44453033453334413035373322207461726765745265663D227369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D747275657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C73657175656E6365466C6F772069643D227369642D30413541464638362D414541342D343231322D423146342D3932373541343430364332442220736F757263655265663D22757365723122207461726765745265663D227369642D39353037343945412D344242362D343237362D423637412D444530334533344130353733223E3C2F73657175656E6365466C6F773E0A202020203C73657175656E6365466C6F772069643D227369642D30443039333043392D394241312D344636382D383545412D33383445313642343039413022206E616D653D22E5908CE6848F2220736F757263655265663D227369642D39353037343945412D344242362D343237362D423637412D44453033453334413035373322207461726765745265663D226368696C64223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D747275657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A20203C2F70726F636573733E0A20203C62706D6E64693A42504D4E4469616772616D2069643D2242504D4E4469616772616D5F70726F636573735F6C65617665223E0A202020203C62706D6E64693A42504D4E506C616E652062706D6E456C656D656E743D2270726F636573735F6C65617665222069643D2242504D4E506C616E655F70726F636573735F6C65617665223E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227374617274222069643D2242504D4E53686170655F7374617274223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2233302E30222077696474683D2233302E302220783D2233302E302220793D223232382E37303337303339393831383338223E3C2F6F6D6764633A426F756E64733E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227573657231222069643D2242504D4E53686170655F7573657231223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2238302E30222077696474683D2239392E39393939393939393939393939342220783D223132302E302220793D223230332E37303337303339393831383338223E3C2F6F6D6764633A426F756E64733E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227573657232222069643D2242504D4E53686170655F7573657232223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2237392E3939393939393939393939393937222077696474683D2239392E39393939393939393939393938392220783D223531302E30393038383236333634343631372220793D223230332E3730333730333130343131343233223E3C2F6F6D6764633A426F756E64733E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227369642D35353636443037362D414234432D344134322D393938462D323533373738394638313831222069643D2242504D4E53686170655F7369642D35353636443037362D414234432D344134322D393938462D323533373738394638313831223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2234302E30222077696474683D2234302E302220783D223731352E353435343431333138323233312220793D223232332E37303337303339393831383338223E3C2F6F6D6764633A426F756E64733E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535222069643D2242504D4E53686170655F7369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2234302E30222077696474683D2234302E302220783D223337302E353435343431333138323233312220793D223232332E37303337303339393831383338223E3C2F6F6D6764633A426F756E64733E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D2275736572222069643D2242504D4E53686170655F75736572223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2238302E30222077696474683D223130302E30303030303030303030303032332220783D223334302E3534353434313331383232332220793D223336382E37303337303636343732373932223E3C2F6F6D6764633A426F756E64733E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D22656E64222069643D2242504D4E53686170655F656E64223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2232382E30222077696474683D2232382E302220783D223838302E353435343431333138323233322220793D223232392E37303337303339393831383338223E3C2F6F6D6764633A426F756E64733E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D226368696C64222069643D2242504D4E53686170655F6368696C64223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D223136312E3130323038303930333236363036222077696474683D223238342E36303837323832303738373235362220783D223234382E32343130373732313432383638362220793D22302E30223E3C2F6F6D6764633A426F756E64733E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D22737374617274222069643D2242504D4E53686170655F737374617274223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2233302E30222077696474683D2232392E39393939393939393939393939372220783D223236362E373539353935363738323937332220793D2237312E3035313034303435313633333033223E3C2F6F6D6764633A426F756E64733E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D22616C6C6D616E61676572222069643D2242504D4E53686170655F616C6C6D616E61676572223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2238302E30222077696474683D2239392E39393939393939393939393939372220783D223333382E32343130373732313432383638362220793D2234362E3035313034303435313633333033223E3C2F6F6D6764633A426F756E64733E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D2273656E64222069643D2242504D4E53686170655F73656E64223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2232382E30222077696474683D2232372E39393939393939393939393939372220783D223436352E302220793D2237322E3035313034303435313633333033223E3C2F6F6D6764633A426F756E64733E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227369642D39353037343945412D344242362D343237362D423637412D444530334533344130353733222069643D2242504D4E53686170655F7369642D39353037343945412D344242362D343237362D423637412D444530334533344130353733223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2234302E30222077696474683D2234302E302220783D223236342E39393939393939393939393939342220793D223232332E37303337303339393831383338223E3C2F6F6D6764633A426F756E64733E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D30344339463239412D304242352D343639312D383034432D373634453445304132373136222069643D2242504D4E456467655F7369642D30344339463239412D304242352D343639312D383034432D373634453445304132373136223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223339302E35343534343133313832323331342220793D223434382E37303337303636343732373932223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223339302E35343534343133313832323331342220793D223439342E37303337303636343732373932223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223839342E353435343431333138323233322220793D223439342E37303337303636343732373932223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223839342E353435343431333138323233322220793D223235372E37303337303339393831383338223E3C2F6F6D6764693A776179706F696E743E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D38344442433035362D303639312D343733452D383243462D443332354546373336413732222069643D2242504D4E456467655F7369642D38344442433035362D303639312D343733452D383243462D443332354546373336413732223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223330342E353930383639353736373134332220793D223234342E3131323833343432313436393437223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223337302E363430313837323338373936332220793D223234332E373938343439393138373537223E3C2F6F6D6764693A776179706F696E743E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D46333946364639322D463330412D344630452D423946382D453044444542313135303635222069643D2242504D4E456467655F7369642D46333946364639322D463330412D344630452D423946382D453044444542313135303635223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223433382E32343130373732313432383638362220793D2238362E3035313034303435313633333033223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223436352E302220793D2238362E3035313034303435313633333033223E3C2F6F6D6764693A776179706F696E743E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D35313046453036322D433042432D343643382D394231372D384133383037324132424336222069643D2242504D4E456467655F7369642D35313046453036322D433042432D343643382D394231372D384133383037324132424336223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223339302E393837353134343839383930352220793D223236332E32363136333038323635313634223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223339302E36363730323138363333373736372220793D223336382E37303337303636343732373932223E3C2F6F6D6764693A776179706F696E743E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D30443235384332342D314631392D343233332D413937362D413044384342394441454143222069643D2242504D4E456467655F7369642D30443235384332342D314631392D343233332D413937362D413044384342394441454143223E0A20202020202020203C6F6D6764693A776179706F696E7420783D2236302E302220793D223234332E37303337303339393831383338223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223132302E302220793D223234332E37303337303339393831383338223E3C2F6F6D6764693A776179706F696E743E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D33334642463234452D464537302D343730412D394442352D394231383831453133383437222069643D2242504D4E456467655F7369642D33334642463234452D464537302D343730412D394442352D394231383831453133383437223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223631302E3039303838323633363434362220793D223234332E3834353738353439363831313337223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223731352E393838343436343031363631392220793D223234342E3134363730393038313632323632223E3C2F6F6D6764693A776179706F696E743E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D34373638373538312D333535422D343335342D383433432D433330343233333238364146222069643D2242504D4E456467655F7369642D34373638373538312D333535422D343335342D383433432D433330343233333238364146223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223735352E313035353637393030353031362220793D223234342E3134333537373431353930353333223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223838302E3534353531303937373036392220793D223234332E3734373836373831363239343733223E3C2F6F6D6764693A776179706F696E743E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D30443039333043392D394241312D344636382D383545412D333834453136423430394130222069643D2242504D4E456467655F7369642D30443039333043392D394241312D344636382D383545412D333834453136423430394130223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223238342E3637393931353936313034392220793D223232342E3032333738383033373133343735223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223235332E33343530333333323234383436352220793D223136312E3130323038303930333236363036223E3C2F6F6D6764693A776179706F696E743E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D37463032463244352D413642412D343233342D413732342D334638393844323335413442222069643D2242504D4E456467655F7369642D37463032463244352D413642412D343233342D413732342D334638393844323335413442223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223339302E35343534343133313832323331342220793D223136312E3130323038303930333236363036223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223339302E353435343431333138323233312220793D223232332E37303337303339393831383338223E3C2F6F6D6764693A776179706F696E743E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D39394343413337462D413233352D343835332D383437322D444532333341443245443332222069643D2242504D4E456467655F7369642D39394343413337462D413233352D343835332D383437322D444532333341443245443332223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223334302E3534353434313331383232332220793D223430382E37303337303636343732373933223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223136392E39393939393939393939393939372220793D223430382E37303337303636343732373933223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223136392E39393939393939393939393939372220793D223238332E37303337303339393831383338223E3C2F6F6D6764693A776179706F696E743E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D46423539344242452D383030352D344544432D423343382D393738314544323236433935222069643D2242504D4E456467655F7369642D46423539344242452D383030352D344544432D423343382D393738314544323236433935223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223733362E303435343431333138323233312220793D223236332E32303337303339393831383338223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223733362E303435343431333138323233312220793D223430382E37303337303636343732373932223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223434302E35343534343133313832323332352220793D223430382E3730333730363634373237393236223E3C2F6F6D6764693A776179706F696E743E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D41453541454438342D303734362D343738372D393836462D364137393237433334433334222069643D2242504D4E456467655F7369642D41453541454438342D303734362D343738372D393836462D364137393237433334433334223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223431302E31303138303630343037373735352220793D223234342E3134373333393237353632393338223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223531302E30393038383236333634343631372220793D223234332E3835313539323539373636343134223E3C2F6F6D6764693A776179706F696E743E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D30413541464638362D414541342D343231322D423146342D393237354134343036433244222069643D2242504D4E456467655F7369642D30413541464638362D414541342D343231322D423146342D393237354134343036433244223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223231392E39393939393939393939393939342220793D223234332E393230313534323134363334223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223236352E343133303433343738323630382220793D223234342E31313637343734373634343437223E3C2F6F6D6764693A776179706F696E743E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D33453941414432332D343444412D344138352D383242442D443643383330413443343938222069643D2242504D4E456467655F7369642D33453941414432332D343444412D344138352D383242442D443643383330413443343938223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223239362E373539353935363738323937332220793D2238362E3035313034303435313633333033223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223333382E32343130373732313432383638362220793D2238362E3035313034303435313633333033223E3C2F6F6D6764693A776179706F696E743E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A202020203C2F62706D6E64693A42504D4E506C616E653E0A20203C2F62706D6E64693A42504D4E4469616772616D3E0A3C2F646566696E6974696F6E733E, 0); -INSERT INTO `act_ge_bytearray` VALUES ('247535', 1, '请假流程.process_leave.png', '247533', 0x89504E470D0A1A0A0000000D4948445200000396000001F80806000000316A727D00004B3D4944415478DAEDDD09985C559D37E0282232A3830B88382AE038E0363A220CA2A3068619409045A8AEBED59DA4D982B208B20884C1B083AC437001648DC8221F46C8B048164242482420888160420264212121040890B0DEEF9C9ABA6DA5D3DDE9AE7477AABADEF779CE53D55DD5DDC9A97BCFF9FFEE3A6000D0AF5D71C5159BEFBFFFFE0F6FBDF5D6AF872F534DD3B49E6A5B6EB9E55B43860C993176ECD82F196D0100FAA961C3866DBADD76DBBDB6C71E7BA4D3A64D4B57AC589102F48437DF7C33FDCB5FFE92EEB7DF7EE917BEF085D7E3462CA32E00403FB4EFBEFB8E8FA112A037C57019C69BA9465D00807E68F3CD377F31EEA904E84D3366CC483FF5A94FAD34EA0200F44F0E7F05FAE4B0D801FF77DE250000FD315802F405C1120040B004102C0100E8FB60592A24D3C6C646553508968225008060597931F9894F7C62B5EF0F1E3CB83578AEBFFEFAE957BFFAD5F4B1C71E537D836009008060D9B56059FEDADB6FBF9D0E1B362C1DE0D05C102C0100E8BFC1F2FAEBAF4FB7D8628B74BDF5D66BDDD3181D74D041C5E73BEFBC73FAFAEBAFAFF25A564C1E76D861E9E73EF7B9E2F34B2EB9A4DD6079CC31C7B4FE5CF9EFB9E28A2B56F99D8B172F8EF7C36BFDDE11471C517C7FE6A5975E4A9B9B9B5B5F1F356A54EB6BF16777DB6DB7D6D7E2D76BFAFFADE93540B00400102CBB5714AE71AFE46F7FFBDBE2D70F3CF0C02A3F17C3E371C71DB7CAEFF8F8C73FDEFAFA17BEF085F4CF7FFE73BB7FF3F9E79F5FED7BF136293118B6FD770D1D3AB4F8F5B3CF3E5B0C956D436EF6F559679DD5E16BDDF9BF038225008060D945F3E7CF6F3D5C35EEB99B3B776EBBC1320B73E5C1B26DE8ECCA61B2D9EB1FFDE84757FBDEBFFDDBBFB57EDDDEEFDC7AEBADDBFD7D5FFFFAD75B4362DBB0D8D9FFAFB3D700C1120040B0AC40477BFBE25EC933CE38A3F8FCC1071F5C6D6F5F3C6CB5BBC172A38D366A77EF61BCE17A3CECB56D40CC0E837DE185178AAF8F1C39B2DD7F676C1D5D2CA8EDFFAFABAF018225008060D989DD77DFBD35987DEC631F4BAFBBEEBAD6D76288CC5E8BE7509687BDF818DF9B7D6FF6ECD9C5EF975F1576F9F2E5ABFCADF8F580367B16B3F328E3E1AFFBECB34FEBF78F3CF2C8E261B1E57B17070E1CB8DADF8B162D5A94EEB2CB2EADAF4D9C38B14BFFBFCE5E03044B0000C11240B0040040B004044B0000044B40B0040040B004102C0100044B00C1120000C112102C0100102C01C1120000C11240B00400102C01044B0000044B40B0040040B004044B0000044B40B034E4020008960082250000822520580200205802822500008225205802002058020896000008968060090080600908960000089680600900806009205802000896008225000082252058020020580282250000822580600900205802089600000896806009008060090896000008960082250080600920580200205802822500008265ED9A3B776E3A65CA9474DCB871E9983163B43E6C63C78E4D274E9C98CE9A35CB82285802002058D66EA89C346952BA78F1E2F4F5D75FD7D6415BB264493A61C28474E6CC991648C1120000C1B2F6C43D9542657584CBB8C718C1120000C1B2E6C43023D855478B87C6225802002058D69C1866843AC152B0142C0100044B7A3D58BEF2E2C274CEB4ABD3C7C69E566CF179FC9E4028580A960000089682E51A03CFF2650BD2E97F3839FDF3EDC7ADD2E2F7E26B42A1602958020020580A969DB6798FDDB65AA8CCDAFCC7460B8582A560090080602958761E7866DCF3D30E83657C4D28142C054B0000044BC1B2D3367DCC291D06CBF89A5028580A960000089682A56029580A9600000896F45EB08C5781ED2858C6D78442C152B0040040B0142C3B6DB326FFACC360195F130A054BC1120000C152B0ECB42D5DF0683AFDEEE1AB1F061BBE175F130A054BC1120000C152B05C637BEAC191AB05CBF83D8150B0142C0100102C05CB35879E952BD359F7FF72F5C360C3F7E26B42A1602958020020580A961DB6E5CB16A433275FD2E13996F1B5F81EC150B0142C0100102C05CBD5F6522E9C353EFDCB5DC33A0C95598BEF89EFB5F752B0142C0100102C05CB2EEDA5B4F752B0142C0100102CE9345876652F65677B2F8544C152B0040040B0ACF3605969A8CC9A9028580A9600000896CEB1D4044BC1120000C112C152B044B0040040B52B580A9608960000089682A526580A960000D449B09C33674E7AF5D557A7A79D765A7AC41147A443860C491B1B1BD3418306A5871D76587AE69967165F7FE69967044BAD6E82E5ECD9B3D38B2EBA283DF4D043D3E6E6E6344992E27A115B535353FAFDEF7F3F3DF7DC738BEF132C0100A8DB6079F3CD37A7279E78627AE49147A6975D76593A75EAD474C18205E98A152B8AAFC7C7C58B17A70F3DF4507AEDB5D7A6471D75543A7CF8F0E2CF09965A7F0D9637DC70437AD04107AD1224D7D40E3CF0C0F4CA2BAF142C0100A89F60F9C4134FA4C71D775C7AECB1C71643E35B6FBDD5E59F7DE49147D261C38615DB8C1933044BADDF04CBB85E1C7CF0C15D0E93EDB5FDF7DF3F7DF4D147054B0000FA77B01C397264B1781E3D7A74B702655B77DD7557F150C05B6EB945B0D46A3E58C643BD0B85C22A21311EEE7AF6D967A7E3C78F4FE7CE9D9BBEFCF2CBC5F7BEFAEAABC53DFB93274F2E1E2A1B0F192FFFB9B8A7B396F65E0A9600008265B7C41018CF179B3973668FFCBEA79F7EBA784E66AD1E1A2B580A96D16F7FFBDBD5CE9FBCEEBAEB8A878177C5B265CB8AEF8F3F571E307FF18B5F08960000F4AF6079CD35D7144365578BE5AE8ABFAF56C3A5602958C63D95E5A1F2E8A38F2EEE9DAC44FCB978887979B8AC853D978225008060D9E573C70E38E0801EDB53D9DE9ECB430E39A4E6CE2D132CEB3B58C6F5A27C2F63BC305576B86BA5E261B2F12ACAE587C53EFCF0C382250000B51F2CE32D436EBBEDB65E2D4EE33997C71F7FBC60A9D54CB02CBF504FDC53B9B6A1B23C5C96EFB98C17F4112C0100A8E960196F9D106F27F2C61B6FF47A811A83E5F5D75F2F586A551F2CE37A517E4E65A587BF7676586CF9DED06A3E2456B00400102CD7E8F0C30F2FDE52A42FC443614F38E104C152EB956019DFD753E27D2AB3D0172FBCD3DBE1B59AF75A0A9600008265A766CF9E5D3CDC6F6D6E2BD25D471D7554AF9DCBD99DD070F7DD770B96FD28583EFBECB3C5DB7BC410D859C0ECCA671FD78BEC823D71AFE2D2A54B7B65398C578B2DBF15493CA753B00400A0E68265BCC7DECF7FFEF33E2D5263E17FE9A597AED342392BE463C818376E9C6059C3C1325E7578C58A15AD5FAF5CB932BDE9A69BD2471E79A4E2CF3EAE17D9FBCE3DF7DC5E5D16FBF26F09960000F44AB08CB701993A756A9F16A9F1B0DB934E3AA92A8265D6E25EDBF6F6620996D51B2CDF7CF3CD4E6F8DF3D4534FA5BFFAD5AF8A17CAE9EE671F6FBB93BD3E61C2845E5D16E35ED6EC6FC52B270B960000D45CB01C326448BA70E1C23E2D526318887B8BAA295896EFC52A0F1982657506CB78D8EBDB6FBFBDC6CFF99D77DE295E8DF88E3BEEE8D667DFDCDCDCFAFD9EBE684F5B0B162C68FD5B854241B00400A0F682652C64CB0F23EC0BF1EFC5C2BD1A8365F95EAC7898A460595DC172F9F2E5E98B2FBED8EDCFFB85175E48AFBAEAAA6220EDCA675FFE754FDD62A423718F6AF9DF132C0100A8B960B9AE0AD93515F7D5D204CBEA69A3468D4A478C1851BCE04D2517C9893F5BC932D0D7EB8360090040CD05CB75B5C7325E69B31AF758C643837FFBDBDFB65E55B4378365BCF268F9EF8F9FE999679ED9EE7BE3219AF1F5B877EBF6DB6F4F070F1E9CDE7AEBADE9EEBBEF9EB6B4B4F4E8BF2BFE9DF3CF3F7F8DEF39F6D8638BCFE38572E2679A7D3FBB2A6B6FECB18C7D76CC31C7A4F7DF7F7F973FEBB8C7F1473FFA51FAFDEF7FBF78D5D5AE7CF6D91561EDB1142C010004CB2E88B73A5817E7581E78E08155152CDB06CABE3AC7327E8E53A64C29EE518BCFE3855C3A7ADF85175E580C215988CBBE7FE28927B67EBD68D1A274A79D762A86CE18F076D86187E2FF2F7E9D85D1912347A61B6EB861EBCFDC7BEFBDABBCBED9669BA5DFFCE6378BCF63BBE5965BD22DB7DC72B57FCF15575CD1FA3CFECEEC790C9ABD7D8E65BCFFE3E9A79FDEE9DECB787E65FCB7C4C3AEE3FBBBF3D93BC752B00400102CBB215EFD72E2C4897D7E55D8B8D7A91A8265DCDB17434747F73DECAD60397DFAF46260DB64934D8AE16D830D36287EFDF9CF7FBE1820DB1E029AFD3BE2E77EFCF1C7B73EDF679F7D56FBDD317CC6D7E29ECDEC7DF1FCC2F818C3630C9C9FFCE427570989E561307E1D435BF6F5FAEBAFDF1A5EE39556E3BF37BEE75BDFFA563150C6E7714F60F6B38F3EFA68F1F1E28B2FEED5ABC2C650396CD8B0F477BFFBDD6A17F2896170FFFDF74F4F38E184F4F9E79FEFF667EFAAB08225008060D90DF11E7AF1B0C7BE14834DFCBBEB52477B28FB2A58DE79E79DC5C0D6F6FB1B6DB451BAD75E7BB57E9D85B4183A0794ED9D8CCFE3EF8881303EBFE79E7B56DBA3180360F63C06D9F878FDF5D7172F60139FCF9B37AFF87ABC204EBC5051B68732BE76C00107149FC7E01AC3687B7B50CBF7586EBAE9A6AD87EBC6BD9B712F685FDDC7326E18F9F18F7F9CCE9933A7B837F7A73FFD69313476B4C1A42B9FBDFB580A960000826537C473D662A1FDD65B6FF559917AF8E18717F770D582751D2CE35EB9182EE3E1B2DB6CB34D3120C6F7C4AFB3F73CF3CC33C5C23FEED97CE9A5975AC3610C7E975C7249F1F9CD37DFDCE11ECB2C1CC6F7B40DA5F1DF19FF5E7BC132EEB17CF0C1075B0FE7CDBE1FFF665FDCC7B25C7CFD820B2E2886B3F8B8A60D065D592FB2B017CF075EBA7469AF2C5FF1F32D3FECB65AD70BC1120040B05CA378FFBE78385E5F8821E9073FF8415A2B7A3358C6CF305E502686BDECFCC6F8BDA38E3A6AB5C366E36B3134C620173FAB6CEF6276186DB6F730DB03197F4FDC839885BD6C2F65DC63195F9F356BD66A41F11BDFF8C66A7B2CE3F9966DF7A0C68BF6C4F75C7EF9E5ED86D2BE38C7B2B380D993EB4516F86218EF0DF150DCEC6FC44377AB95600900205876A9B88D45745FECB58CA1E4CA2BAFACFB60F9F8E38F175B16C64E3DF5D4E2F318F8E6CF9FBF5AE88B6DD2A449C5433DE339946B0A7103CAF63AC6809905C6189076D96597D50E6FED6AB08C17078A7BF306B439D4B63C586687EFB6FD7FF445B0ECADD017F75AF6F4457CE2EF8BBF37FB1BD5BC5E08960000826597C4ABB45E7BEDB5BD5A9CDE71C71DE9D0A1437B74AF522D06CB786E630C7BF1D0D61FFEF087C53D9159108BA12D1E221B837EDB9F8B812D5EF1B5A38BEE94B70F7DE843C5DF1FCF758CBF3F7B7FDC63D9D11ED4F642693C34330BC09D9D6319FF6DD961B1F1023F3168965FBDB6168365B65E64C1EFE8A38FEEB15B8FC48D03F10256E57B2BAB79BD102C010004CB2E890122DEEA208688DEF0F4D34F172FA8F2F0C30FA7B5A4A783653C576F40E9B62231FCC5F3EBCA5F2FBF6D47F9F993F16AB131B095DFC3327E7FDF7DF76D7D1E4364B63771ABADB62A1EFE1A836876FB9101A5732CB3E7F182406BDADBD9B6C5C368B3436DAFB9E69A55F6A8C620191F870F1FBEDA6D506A3558C6F5A2FC9E96F1FFB6B6E13286CA33CE38A3F577C6DF5FEDEB85600900205876D9D5575FDD2BF7B58CF7AD8C7BE06AE910D8DE3E1436BB8D4816CAE2B996F15613034A7BFF3AFA99AEEC058CC1AF3BEFEF4EB08C2DBB426DF9057BCA2F26D45B6D5D04CB6CBD28BFEF65DC7359E961B1F1E7CAF75456FB21B082250080605991CB2EBBACB8172D5E30A6A7F654C6C309CF3AEBACB416F566B0D46A235866EB4579188CE746C6F355E3555DBB7AF5D778CE66F93995B1D5CA7A21580200089615EDA18987E7C5431DD7E6823EA3478F2EEE018D4579AD122C05CB8EF65C660133DE7B72C28409C5BD91D961B2F170D7050B16140F791E316244F1963EE53F17D7AF5A5A2F044B0000C1B2E273CBE2E1ABF1A222F7DD775FB77E369E2F76C4114714AF2C5A6BE7540A96826557D68BB601B33B2DAE53B5B65E0896000082E55AF9F5AF7F5D2CA4E3E1B1F18223F7DC734FF1EAA5AFBDF65AF1F5780E5FBC05C51FFFF8C7F4E28B2F2E16CD3150C6BD31B574F557C152B0AC64BDE86EA0ACD5F542B00400102C7B44BCDAE805175C901E7AE8A1AB9D2716AF261B2F3C130F098C7B74FA13C152B0B45E08960000822582A56089600900806029586A82A5600900806029586A82A5600900806029586A82A56009008060896029582258020020580A9682258225000082A560A909968225000082A560A9099682250000822582A56089600900205822580A9608960000089682A526580A960000089682A526580A9600000896089682258225008060896029582258020020580A969A602958020020580A969A6029580200205822580A9608960000822582A56089600900806029586A82A5600900806029586A82A5600900806029586A82A560090080604925C68D1B27D4099682A5600900205852B9499326A58B172F16ECD6715BB4685131E4235802002058D69CD9B367A713264C489F7BEE39016F1D87CA9933675A20054B000004CBDA0D97E3C78F2F1E8AA9F57D132A054B0000044B40B0040040B004044B0000044B00C1120000C112102C0100102C01C1120000C112102C0100102C01044B0000044B40B0040040B004044B0000044B40B0040040B004102C0100044B00C1120000C112102C0100102C01C1120000C11240B00400102C01044B0000044B40B0040040B004044B0000044B40B0142C0100044B00C1120000C112102C0100102C01C1120000C112102C0100102C01044B0000044B40B0040040B004044B0000044B40B0040040B004102C0100044B00C1120000C112102C01005807C172C58A152A5EA057BDF9E69B822500407FB5E9A69B2E9A366D9AAA17E8553366CC4837D9649365465D00807EE8C31FFEF0B93BEFBCF32BCA5EA037EDB9E79EAF7DF4A31FFD99511700A07F7AFFFAEBAFFFF0F6DB6F3FFF81071E783D1EAE46EF58B972A54EA0EE0E7F9D3163C65B3BEEB8E3820D36D860761C6F0CB90000FD385C8676CABBDEF5AE2706FCDF39505A0FB6F7BFFFFDE90E3BEC10F7D8A4EBADB75EBFF97F353636FA7CB535B677BFFBDD31509E27540200400572B9DCFB9324393B04B015F97CFED5D08EEE4FFFBF52B0040000A0378410B947085E4FC5F0155BF8FAE5534E39E5DD82250000009D2A140AFF1A02D7A42C509605CBD1FDEDFF2A58020000F4A02449360E41EB9278D86BDB50596AA70B960000007414B006E6F3F9651D04CA6C8FE5E182250000001D4A92E4A010B41676142C1B1A1A76162C010000E8542E97FB58085B7776B0C7F28B82250000005D0D5CC3437BAB3C58C6D02958020000B046F1DE9521703DDDD0D0B06F78FC7529582EE9A7015AB0040000E885B015AF0C7B65D9D7FBC5C363054B000000D6A8A1A1E11B216CCD6F6969F960F9F7070E1CF81EC1120000804EEDB6DB6E1B84A03523B47DEAE5FF2C58020000F46CC83A33B49BEBECFF2C58020000F4847C3EFFE510B29E4B926453C1120000806EC9E572EB8580F560682DF5F67F172C0100007A4092243F0E01EB0FF5F87F172C010000D652A150F8E7788FCAD0B6102C010000E8AE772549726F08573FACD70E102C010000D62E547D3FB4FB4F39E594770B96000000744B5353D32742A85A9CCFE73F57E7E15AB0040000A830508D0EED64FD2058020000745B128440F5E7A14387AE2F580A96000000DD0D951B8730B530B46DF58660090000504990FA4D68E7E909C1120000A09210B57B68B372B9DC867A43B0040000E896A6A6A67F08216A6E6803F58660090000504980FA656897E909C1120000A0DB1A1A1ABE1502D4BC5C2EB791DE102C010000BAA5A5A5E57D213CCD0C6D4FBD215802000054129CCE09ED463D2158020000745B3E9FDF2604A745B95C6E13BD215802000074CBC08103DF1382E5C3499234EB0DC1120000A092C0342CB43BF48460090000D06DB95C6EEB10989684C74FE90DC1120000A0BBDE15C2D27DA11DA62B044B0000804A82D261A14D8A01536F0896000000DD120F7D2D1D02BBB5DE102C0100002A094977264972A29E102C0100002A094883E2ED45E26D46F48660090000D02D83060DFA6808488B42FB8ADE102C0100002A094737254972B69E102C0100580B699ABE67CE9C39374F9D3AF5ED71E3C6A563C68CD1FAB08D1D3B369D3871E2F3A1355B1AFB563E9FDF2B84A3BFB6B4B4BC4F6F08969817CC0B00B01662F13069D2A474F1E2C5E9EBAFBFAEAD83B664C992F4DE7BEF7D291413FB5922FB462E97DB2804A379A17D536F08969817CC0B00B096E21669C543551411AF8F1933668625B2CF42D1E5A1FD424F08969817CC0B00D003E2614E26F0EA68A18078D312D9FB1A1A1A760CA1E8993DF7DCF3037A43B0C4BC605E00801E10CFE73079574D01A150EF65B95C6EC310889E2C140ADFD11B8225E605F30200F47101F1CA8B0BD339D3AE4E1F1B7B5AB1C5E7F17B267E05442DC9E7F3E72749729D9E102C312F981700A08F0B88E5CB16A4D3FF7072FAE7DB8F5BA5C5EFC5D74CFE0A881A0995DB8530B43004CB8DF586608979C1BC00007D5C40CC7BECB6D58A87ACCD7F6CB4C95F0151F5860E1DBA7E08968F86D6A837044BCC0BE60500580705C48C7B7EDA6101115F33F92B206A20049D1CDA683D2158625E302F00C03A2A20A68F39A5C30222BE66F2574054B35C2EF7F910821687C77FD41B8225E605F302002820141074CB29A79CF2EE1080A624497288DE102C312F981700601D1610F16A7F1D1510F13593BF02A25AE5F3F92343009A109EBE4B6FAC55881C1D83E41ADA343D655E302F981700504074D8664DFE598705447CCDE4AF80A8D230B445684B72B9DC67F4C65AF7E5B6A1BDD959B00C217E0F3D655E302F981700504074D8962E78349D7EF7F0D50F770ADF8BAF99FC1510551A86EE0E61E7383DD163FD796727C172CAC08103DFA397CC0BE605F302000A884EDB530F8E5CAD8088DF33F12B20AA510894FB87B0F3602E975B4F6FF458B0DCB6A3609924C9DE7AC8BC605E302F00A080E8BCAD5C99CEBAFF97AB1FEE14BE175F33F92B20AA4908931F0B61E7B9102EBFAC377A3C5CB677AEE5347B2BCD0BE605F302000A884E27B5E5CB16A433275FD2E1B934F1B5F81E058002A25A8440F9FF922439434FF44AB05CED5C4BE7569A17CC0BE60500E8B88058B9325D386B7CFA97BB8675583C642DBE27BED7566A05441584CAEF85B03363B7DD76DB406FF45A1F8FB2B7D2BC605E302F00C01A0B88356D8DB6955A01518D0A85C28742D05910DAD7F546AF06CBAF959D5BB9AB1E312F9817CC0B00D06E01D195ADD19D6DA5560C2820D6C2072BFDC11072AE0AA167842EEC7D0D0D0D77C560696FA579C1BC605EA0BAE64280AA2A202A2D1EB2A61850405428EEFD4A4B8FDD0D3A3B87A0F3542E977BBFB5BAF73FA70F7FF8C3C53D96BAC2BC605E302F503D732140D515109A02621DD839B465A15D547AECF20561060D1AF4F721E4CC29140ABB58A3FBEE732A054B17EE312F68E605AA602E045040680A88BF4DA4D9041AB7D22EE9EA849ACFE72F4A92E45A6B73757F4E981734F302C6584001A12920FA6A225DD3F7DB86CA7821996773B9DC87ADCDD5FB39615ED0CC0B1863010584A680E82DBBAE61C2CC5E6FF73C931026DF9B24C963215CE6ACC9D5FB39615ED0CC0B1863A1263435357D221496870F1932E4B6E6E6E6A70B85C26BA54BE1AF0CCFE796EEB9766C7C9FDE52402820AA6E225DD344D9E1D6DA102A4F8DEBB7B5B8BA3F27CC0B9A7901632CD59BA1424EBA39B459A12D2F65A815F182887595A14251B9F7D0A143A71D72C8212F8E1831E285A953A7A60B162C4857AC589146F171F1E2C5E9942953E65D70C1057F09C1737EE89C7BC2CF355B9414100A88756AE76E6E7D5DEDFD6190FB97B03E2F6E6E6EDECC5A5CBD9F13E605CDBC803196EACB50A18D2905C8B48BAD7F66A8F01FDB2284C93F1E79E491AF3CF4D043E95B6FBD9576550899330E3CF0C099E1774CCAE5729FB16829201410EB6C22DDA3829F5B1E27D4B0EEAE17D6E107423BD01A5CBD9F932E342F68E6058CB15457860AEDCE6E84C9F65AFFC9502D2D2D830E38E080D76EBBEDB6B7BB1328DBFACD6F7EF34048DD8BECBD544028206A62225DE5E777DC71C72BC3C036CE1451DD9FD300876C991734F302C658AA423E9F0FA553E392F290D8D4D4949E7DF6D9E9F8F1E3D3B973E7A62FBFFC723127BDFAEAABC5A340274F9E9C5E74D145E9A04183DA86CBE5359FA1860D1BD6F2831FFCE0F5993367A63DE1C9279F7CAAB9B9797EE898831410266F0544AF5BD3C509BAE4EFFEEEEFF60ADEDE7CF3CD0F324D54EFE7D483BF07F382790163AC3196B50B957B8430F86679A0BCEEBAEB8AA70C76C5B265CB8AEF8F3F571E306B36431D73CC3187066F74B503BA6AD1A2450B4BE1B26EF75C2A2014107D3891F6C8A13B215CEE6E42ADFECF6980ADEAE605CDBC803196751D2A1BCB43E5D1471F5DDC3B5989F873C71D775CDB70595B196AE8D0A1FF74F0C107BFD1537B2ADBDB73593A2CF6B30A084D01D1E3DA5E6CE05DA10D293D7647DB9F7311039F13E605F302C658632C1D289D53D97AF8EBF0E1C35B0F77AD543C4CF6CC33CF6C7B586CED64A8638E3966CEE8D1A3D3DE74F5D5578F8D27A32A20340544AF4CA47B944D88578696961EBB3AA176F47326549F13E605F302C658632CED285DF9B5754FE5DA86CAF270D966CF656D64A8534F3DF507C71E7BEC3B6FBCF146DADB060F1E3CA31E0F8955402820FA68221D50DACA9A96B5AE4CA8E51369D60697BDEE3C139F13E605F302C658632CAB86CABDCBCFA9ACF4F0D7CE0E8B2D3FE7B22632D409279CF06CBCA5485FB8EFBEFBEEADC7BD960A0805442FE868826B6F62EC6C426DEFFD57B4F37EE799F89C302F981730C61A63F95BB06CDD5B192FBCD31B6EB8E186DAD96B79E38D376E77F8E187BFB336B715E9AEE6E6E6A7E3F1C80A084D01B1D613E9AEDD9820DB9B50BB3A91B69D501D0AE473C2BC605EC0184BDD6A6A6AFA4476C19EB85771E9D2A5BD929BE2D562DBDC8AA47A33D425975C72E315575C91F6A533CE38239E6B796C7FD95211DABF2B201410BDBD0C5530A1AD6942EDEE445AFEF797D4DBD65A9F13E605F302C65863AC653293CFE70FCFC2DEB9E79EDBABD929DEE7B22C58566F863AF5D453E74E9D3AB54F83E5F8F1E3EF0B9D32BA3F2C7465C73C8F090BD8D714100A88DE5A86DA4CA45D9DC83A9A50DF5DE144DA762B71DD4CA83E27CC0BE6058CB1C658CB64D9EB3767EF99306142AF66A7C993279707CBEACD50471C71C4EB0B172EECD36019FE5E3C14765E7F5AE8CADA9DED6DDD50402820D676191A50F9791DED4DA87F5D8B89746DFF3DFD7A5DF739615E302F608CA5FF2F93E1EB59D96B3D7DD19EB6162C5850FEEFA8DE0C3564C8907756AC58D1A7C1F2B5D75E7B3E74CA8A7EBAD0B56EDD285FF814100A88B55C86D676AB687B13EADA4CA46D27D45DEB7082F139615E302F608C35C6D6E93219EF2D997DAFA76E31D2D9AD47CAFE0D2BAABAD3D685F877FBF34257BE7523EE3E574028202A5D86F6DE7BEFB1A549EFA2B5FC53EF6E67EBEC5F4BDF5F1B17957ED707EB7182C95A2E971BFB918F7CC4E7444DCC0B715928140A5D7EFFADB7DE9A6EB5D556DDFAFDE79F7FFE1ADF73ECB1C7169FDF74D34D69DCC89D7D3F5E5D51B0B4DE980BA9F2B1BCB5F55576CA5AD5765A4B4B4BDAD77B2CC3DF7BB33B1F567F687D5D40DC7DF7DDC5C1326EE1B8FDF6DBE3FD438B85C1EEBBEF9EC6CFBCA70B945A2B206A6DF9F9F6B7BF9DBEF7BDEF4DD7626B68675B69BB73E3E80EB7D2D6DB3ADD59F339695D6DEB3258EEB4D34EEDBE16C7E7EDB7DFBED8B2B963B3CD362BB6F83CB6ABAEBAAAF83BE6CF9F5FFC997BEFBDB7F8FDF2F77FF39BDF6C7DFF2DB7DC926EB9E596ABFD1BE2C503B3E723478E6C7D1EE709F382662ED46AA5D9635972C41147BCD1D7E7582E5AB468613F3EC7326BD3F2F9FC1E03070E7C4F7C5F5F07CB38485E78E185C505310B71D9F74F3CF1C4D6AFC367512C2EE2C41F03DE0E3BEC50FCF797170871B2DF70C30D5B7FA63F1410B5B80C9526AEE5037AE7BC924A26D47A3FC7D2E7444DCD0B6DC7E44D36D9A4C3D7E3DC316BD6AC74975D76592D58DE7CF3CDE9673FFBD9D57E5FF9581EBF3EFDF4D35BBF5E7FFDF55BE79EA79E7AAAF87BE27BBEF5AD6F15E783F8FC89279E68FDD9471F7DB4F878F1C517DB6369BD31C65295CB64787CD239966D9C75D6594BFBFAAAB093274F9ED9DFAE0ADBC90038A0AF0B8851A346B5EE218D03E5F1C71FDFFA7C9F7DF669B78088AFC53D9BD9FBB2ADD1313CC6C0F9C94F7E5201B18E97A1B65B45D76222BD6240FB57C2EBCE845AB75785F539518BF342DB3D927159DA60830D3A7D5F0C901FF8C007560B961B6FBCF16A73C9F2E5CBD371E3C6B56E608CBFFF80030E283E8FEF8D73497BE1B67C83E3A69B6EDA7AB44DDC381937623A14D67A638CA55A974957856D4718D4EFE8EBFB589E77DE7953FBCB7D2CCB3EE4294992ECDDC100D867054416D2E25EC301657B27E3F33BEFBCB31808E3F37BEEB967B5093E1600D9F3E9D3A7171FAFBFFEFAF4D9679F2D3E9F376F9E02621D2E43156C1D5DD3BDB9BA7AE3E8B6B61D5087F7EEF23951ABF342DB3665CA94E272F4A10F7D6895235ADAB6B84131B6B6C1F24B5FFA52BB1B29E3EF8C61B4ED9C12E79E8D36DAA8DDF7C70D8E0F3EF860F179FC7765DFBFE4924B9C6369BD31C652D5CBA4FB58B6E38F7FFC63EE88238E48DF7AEBAD3E0B962D2D2D0B42A76CD14F16BACEB6A8F57901B16CD9B262B88C13F436DB6C530C887142CF26ECD89E79E699E2C019F76CBEF4D24BADE13006BF389967C5C1800EF6582A20D6CD32D4CDADA45DBDE1737727D4EC10A4BDEB7082F1395193F34247E757C60D8CF1796787C366CF63988C2DBB904FFCB9B6A1347EEF1BDFF8C66A1B1C6320DD6BAFBD56D9001ACFB98FEFB9FCF2CBDB9D53EAFD1409EB8D3196EA5F269B9A9A3E11DE53BC6E4C789E2E5DBAB4577253ACED070D1A541E2CAB3B439D7AEAA9AF3DF4D0437D122A1F7EF8E1A5A143EEABB785B32F0B881826E3641E43630C7271F779B67731B678F853B6F730DB031907D1B807319BD4B3BD94718F657C3D9E6BA380A83A1D6DADEDEA44DADD0935FB7B26529F1335362FB43D0C369EEE908DC1E79C73CE2AEF89A730ECB6DB6EC5D6DEC57B4E3EF9E4F4A8A38E6A3DBAA5BBF3423CB77FF6ECD9AB1D29533E2F6447DF641707322F608CA51AC55B8F64812FEE88E90D37DC704379A89C54F59D72F5D5579F7BDC71C7F5C95ECB430E39E4A9F021342B207A776B746C93264D2A1611D956E7CE425CF9041F03665618C495245EBCA1EDE1AD0A88AA11B7D6B63D1467C880EEDF9BABBD09757037B60AE373A20682E580D29128D9D78F3CF2C82A1754CBC2676CE557145FD33996D9112BEDCD29F19CFAC71F7F7C8DA748C4B9203BAA2586DB384F7476A8AE7901632C55102CF7CE425FDC6BD9D317F189BF2FFEDEB27B68D646863AE9A4935E1E3D7A74AF86CADFFFFEF7CFC6BD95DD3CCC4101B116E75B965F4EBEB36019CFB58987CEC6731DE39ECEECFD718F657BEF574054DD845A7E1183F289B13B377CEEE8E7DCF8D9E7443F981706747001B7B80131BE16E6E6550E7FCD0266769BA86C8360DC4BD9DE38DFD1C6CAB62D1E05931D2973CD35D7ACB24134DBA33A7CF8F0D5AE626E5EC0184B350AD9E69E2CF81D7DF4D13D76EB91381EC71D7FE57B2B6B26438D1A35EA3F0E39E4907766CE9CD92BA1F2E9A79F7EABB9B9F9F990B43FAB80E8BD969D3FF9F9CF7FBE18D8CAB738C7EFEFBBEFBEADCF6388CCF626C61B5FC7C35F6310CD6E3F926DD9CE9EC70B022920AA56DB4381DE55DACADADDCBA6B7FDB95D4DA43E276A7B5E88175E8B174C8BE7D577F49EB8B1308EC36DFF4D7143637635EF78718AEE84D88EE685D8B20BCC959F6F5F7E2D80BE6E82A531D618CB5A04CB2D425B9205C058D7AE6DB88CA1F2CC33CF2C0F95CB6B2E4385C2FF8A78219FC58B17F768A88CBFEF80030E585A8F87C0AEAB2DD3E55B9CD7F49E18FCBAF37E0544CD4CA83DB1F5D715EF7C4EF4B37941132C8DB1C6587A563E9F6FCC2EE493EDB9ACF4B0D8F8736DF654A6359BA1468E1C794B0C973DB5E7F2E9A79F4E0F3AE8A01743879FA08030792B206A664275C3679F13E605F302C658632C5D1402604B79B88CE746C6530DE2555DBB7AF5D778A19EF2732A63ABF90CF5AB5FFDEA67210CBE13CFB95C9B0BFADC71C71D2B870C19F262EC680584024201D167D6F6901D87FCF89C302F981730C61A63E9A6B8E732B465E5C13006C5782AC18409138A7B23B3C364E3E1AE0B162C28DEBD61C48811F1768CAB04CA78F86BBFC950975F7EF976279D74D2F371576CBC6A5C77C40BB3849F7B71F0E0C1D3EAF59C4A058402A24A26D4EE6E657571029F13E605F302C658632C158AE75C96DF86A4C236A95F66A80B2FBCF0BF8317E2E1B1F1AA9ED3A64D4B172E5C583C172F8A8FF11CCA183EE3EEDEC30E3B6CC5C1071F3C3D26EC7ABCFAAB0242015145BA7B088F437E7C4E9817CC0B18638DB1F44CC0DCAF1430DFEC4EA0AC8B0C75EDB5D77EE5BCF3CEBBF6E4934F9E3574E8D0E5CDCDCD6F9776EFBE75E081072E0FC1F3A1D0CE8C29DDA2A4805040D4DC84BA6D68CB07B8E1B3CF09F382790163AC31961E13B2D22742C03C2A64A49B437B2AB4156541725E68A3433B56864201A180A805BB9626CA5D3B797D8989D4E78479C1BC8031D6184BEF2B85C9D4D19D28201410B5A8A3ADB50EF9F139615E302F0896C658632C7D249FCF7F2D3B3C364912E7F1A2805040F48B09D544EA73C2BCA00996C658632C7D1B2C47951D0A3B4D8FA0805040D4FA847A9189D4E7847941332F18638DB1F49D1024B76D7B319F10342D7F28201410352B1E76910E7019759F13E605CDBC608C35C6D297C172743B57829DE65C4B14100A885AF6415D501B9F539C7474837941332F608CA5E643E5B61DDD7A244912178D4201A180805E9F882CAFE605CDBC803196DA5FD6EEECE4FE9553F4100A080504287A302F981730C64267CB59877B2B9D6B89024201018A1ECC0BE6058CB1D095E56C7467A1D215625140282040D18379C1BC803116BA65D0A0417F1F96BD57F4040A080504287A302F981730C6424572B9DCFBC3B2B75C4FA080504080A207F3827901632C5464CF3DF7FC4092242FEB0914100A0850F4605E302F608C858A343535FD4358F65ED21328201410A0E8C1BC605EC0180B15C9E5721B8565EF453D81024201018A1ECC0BE6058CB150919696960FE6F3F9657A0205840202143D9817CC0B1863A1228542E14361D97B414FA080504080A207F3827901632C542497CB7D382C7B4BF5040A080504287A302F981730C64245060F1EFC91B0EC3DAF275040282040D18379C1BC8031162A9224C9C661D95BA2275040282040D18379C1BC8031162A92CBE53609CBDE623D81024201018A1ED6DAB871E38CC9D5D1568479E14D4BA43116FA4A92249B86656F919E4001A18000450F6B6DE2C4890B172F5E6C5C5EC76DC18205378679618625D2180B7D2597CB7D2C2C7B0BF5040A080504287A586BE3C78FDF6BC284092F3EF7DC73AF199FD7CD86C638278C1D3BF699D0F6B3441A63A1AF3437376F1696BD67F5040A080504287AE811613CDA63CC9831D3E29114F1307DAD4F5BECF319E60463AC5E601D2C771F0F6D819E4001A18000450F8031162A92CBE5FE312C7BF3F50475ABA1A161670330287A008CB150B9A6A6A64F84656F9E9EA09E07DF49A1BDA32740D103608C858A97BB4F8636574F50AF2BC0C038F8C69624C9BFEB1150F4001863A1FB72B9DCA7C2B2F78C9EA05E07DE7BCA82E5183D028A1E00632C745FA150D83C2C7B4FEB09EA4E0892BB66A1D25E4B50F400186361AD96BB2D427B4A4F508F0BFFA4B6C132B4D17A06143D00C658E89E5C2EB76558F6E6E809EA6DC0DDAF9D50596C8542E15FF510287A008CB1D075A186FE7458F666EB09EA6DC0FD4B47C13249921BF410287A008CB1D075B95CEE3361D99BA527A81B2138EEDD51A8CC5A3E9FFFA29E02450F803116BAA65028FC7358F666EA09EA46088D0FAF29588676B39E02450F803116BA5C636F1596BDBFEA09EA5692241B879560899E00450F8031162A93CBE5B60E75F5137A82BA3568D0A08F8601F8393D018A1E00632C542684CACF86656F869EA06E3537376F16568267F504287A008CB150997C3EFFB9B0EC3DAE27A85BB95CEE1FC34A305F4F80A207C0180B15D7D49F4F92E4313D413D0FBE9F0C6DAE9E00450F8031162A1342E517C2B2375D4F50B70A85C2E66125785A4F80A207C0180B9589B7EB8BF78AD713D4AD5C2EB7655809E6E80950F4001863A1324D4D4DFF12C2E5A37A82BA1556807F0A03F0937A02143D00C658A84C92245F0ACBDE9FF50475AB5028FC73580966EA0950F4001863A132F97CFECB61D97B444F50B7DCCC15143D00C65858EBE5EE2BA1FD494F50B7DC7307143D00C65858EB9A7A9BB0EC3DA427A85B2E8D0C8A1E00632CAC9D42A1F0D5B0EC3DA827A85BAE60058A1E00632CACF572B76D68D3F40475CB89C6A0E80130C6C25AD7D4DB8565EF013D413D0FBE4E3406450F803116D642A150F8B7B0ECFD514F50CF2B81E3C141D103608C85B55BEEB60F6DAA9EA06ED96D0F8A1E00632CAC754DFDB5B0EC4DD113D4FB4A60EB0A287A008CB150A124497608CBDEFD7A827A1E7CBF1EDA643D018A1E00632CA8A9A1224992FC7B580926E90950F4001863A1320D0D0DDF08CBDE7D7A827A5E09BE15C2E5BD7A02143D00C658A878B9FB666813F504F5BC120C0CED1E3D018A1E00632C54C6CE1AEA5E5801760A03F0383D018A1E00632C545C537F3B2C7B13F40475ABA1A161E7B0228CD113A0E80130C642C5CB9DA300A96FF97CFEBFC24AF0073D018A1E00632C54A6A1A161C72449C6EB09EA565801760D03F09D7A02143D00C658A8B8A6767A19F5AD50287C279FCFDFAE2740D103608C858A97BBFF086DAC9EA06E8550B947580946EB0950F4001863A132AE5B82C1B7B171CFD06ED513A0E80130C6426542A8FCCFB0ECDDAD27A8E79560EF7C3E3F4A4F80A207C0180B9571414CAC04F9FCF7C24A708B9E00450F8031162A532814760975F55D7A827A1E7CF70BED663D018A1E00632C54C69D16B01224494358096ED213A0E80130C64265DC6901C1320803F0F57A02143D00C658A878B9DB3DB4FFD513D4AD7C3EDF14B2E5757A02143D00C658A8B8A6760B3FEA7EF01D14DA483D018A1E00632C54264992EF8670799B9EA09E5782216100BE464F80A207C0180B152F77EE0D4F7DCBE7F3FB877079959E00450F8031162AAEA9F70ACBDEEFF504F53CF81E18DA157A02143D00C658A84C92247B8770394A4F50CF83EFC1A15DAE2740D103608C858A97BB7D42FB9D9EA06E254972483E9FBF544F80A207C0180B9509F5F4F7C2B2778B9EA09E57821F8495E0177A02143D00C658A84C9224FB86BAFAFFE909EA79F03D2CB49FE90950F4001863A1E2E56EBFD06ED613D4AD24498EC8E7F323F404287A008CB15099504FE7425DFD5B3D413DAF04478695E07FF404287A008CB150F172970FED463D413DAF043F0AED423D018A1E00632C54269FCF37264972839EA06E8515E098B0229CAF2740D103608C858A6BEA242C7BD7EB09EA560895C785F5E05C3D018A1E00632C54BCDC1542FB8D9EA09E83E509612538474F80A207C0180B15D7D44D49925CA727A8E7C177586867EA0950F4001863A1322154368765EFD77A827A1E7CFF3BB4D3F504287A008CB150F1723728B4917A82BA95CFE77F9224C9A97A02143D00C658A8B8A61E1C6AEA6BF504F53CF89E12DA703D018A1E00632C542684CA2161D9BB464F50CF83EF69A19DAC2740D103608C858A97BB96D0AED613D4AD2449CEC8E7F327E90950F4001863A132A19EDE3FD4D557E909EA79F03D2BAC0427EA0950F4001863A1E2E5EE80D0AED413D4F34A704E68C7EB0950F4001863A13249921C94CFE77FA527A8E795E0DCB0121CA72740D103608C858A97BB8343BB5C4F50B742A83C3F84CB63F404287A008CB150F1723734B4CBF404F5BC125C18DA8FF404287A008CB1509924490EC9E7F397EA09EA7925F89FB0121CA92740D103608C858A97BBEF87F64B3D41DD0AA17244089747E80950F4001863A1E29AFA0761D9FB859EA09E07DF9F8576989E00450F8031162A9324C9A1215CFE5C4F50CF83EF2FE216163D018A1E00632C54BCDC1D1677D8E809EA7925B82C5EC54A4F80A207C0180B95C9E7F3878765EF123D413DAF04BF8A3774D513D06B05CEE858E4ACA14DD353008225B52B5EB3245EBB444F50CF83EF95A11DA027A0D7D6B16D437BB3B3601926A23DF4148060494D2F773F0CED623D413DAF045787D6A227A057D7B33B3B099653060E1CF81EBD04205852BBE2EDFBE26DFCF404752BAC00D7861561B09E805E2D72B6ED28588675706F3D04205852F3CBDD8F42BB504F50CF2BC1AF4361DBAC27A0D7D7B5F6CEB59C666F25806049EDCBE7F347879AFA023D413D0FBEBF09ADA027A0D7D7B5D5CEB5746E25806049FF1042E531615E3F5F4F50CF2BC10D612568D413D0FBC2BA36CADE4A00C1927EB9DC1D1BDA797A827A5E096E0AE1B2414F409F04CBAF959D5BB9AB1E01102CE93773FC71616E3F574F50CF83EFCDA1EDA727A0CFD6B9E2B996F656020896F41F2154FE3884CB9FEA09EA79F0BD25AC04DFD31354BB344DDF3367CE9C9BA74E9DFAF6B871E3D23163C6687DDCC68E1D9B4E9C38F1F9D05CF00B102C61D5E5EEF8D0CED113D4AD78CE97DB1D500B62A89C346952BA78F1E2F4F5D75FD7D6515BB264497AEFBDF7BE1442A6231D00C112FE56539F106AEAB3F504F53CF8DE1ADA9E7A826A17F7540A9555132E5F1F3366CC0C4B252058C2FF09A1F2C4B0EC9DA527A8E7C177B45B1E500BE2E1AF425DF5B4102CDFB454028225B42E77C3423B534F50B742A8BCBD50287C474F50EDE2397E025D55054B851B2058C2DF6AEA93922439434F50CF2BC15D6E7B407F0A96AFBCB8309D33EDEAF4B1B1A7155B7C1EBF270C0A96806009BDB8DC9D1CDA697A827A5E09EE0EC1F23FF504FD21582E5FB6209DFE8793D33FDF7EDC2A2D7E2FBE26100A96806009BD219FCFFF24D4D4A7EA09EA79F01D1BDA7FE809FA43B09CF7D86DAB85CAACCD7F6CB4402858028225F4D672373CB453F404752B4992F10D0D0D3BEA09FA43B09C71CF4F3B0C96F1358150B004044BE8A5E5EE94182EF504F5BC124C08E1F2DB7A82FE102CA78F39A5C360195F1308054B40B084DE100F838D87C3EA09EA79F09D18DA37F50482A5265802822554BCDC9D162FE0A327A8E795E0BE8686866FE809FA43B08C5781ED2858C6D70442C112102CA19796BBD343FB6F3D413DAF04F72749B2839EA03F04CB59937FD661B08CAF098482252058426F88F7B08CF7B2D413D4F3E03B35B4EDF504FD21582E5DF0683AFDEEE1AB1F061BBE175F1308054B40B0845E5AEECE0C6D989EA09E578207F2F9FC767A82FE102C637BEAC191AB05CBF83D6150B004044BE8C5E5EEAC24494ED413D4F34AF060A150F8AA9EA05F04CB952BD359F7FF72F5C360C3F7E26B02A160090896D01B42A83C3B9FCF9FA027A8E7C1F74FA17D454F50EBC172F9B205E9CCC99774788E657C2DBE4728142C01C1127A61B93B27B4E3F504F5BC123C92CFE7BFAC27A8D960B97265BA70D6F8F42F770DEB3054662DBE27BED7DE4BC112102CA1272549726EA8A98FD313D4ADB0023CDAD4D4F42F7A825A0C966BDA4B69EFA560090896D047CBDD79A11DAB27A8E795607A92245FD013D462B0ECCA5ECACEF65E0A8882252058424FC8E7F3E7879AFA183D413D0FBE8F8715E1737A825A0C969586CAAC098882252058424F08A1F28250531FAD27A8E7C1F7AF6125D84A4F508BC152132C01044BAA64B9BB30B41FE909EA79259895CBE53EA327102C35C112102CA132F97CFEA224498ED213D4F3E03BBB50287C5A4F20586A82252058426542A8FC9F102E8FD413D4F3E0FB54685BE809044B4DB004044BA878B9BB38B41FEA09EA7925782697CB7D4A4F20586A822520584265F2F9FC8824498ED013D4F3E03BAFA9A9E9137A02C152132C01C1122A5EEE2E09E1F2703D413DAF040B42FBB89E40B0D4044B40B0848A97BB9F8576989EA09E578285B95CEE637A02C152132C01C1122A93CFE77F9E24C9A17A827A1E7C9F1B3468D047F50482A5265802822554BCDCFD32B4EFEB09EA7925589224C9C67A02C152132C01C1122A93CFE72F0D35F5217A827A1E7C97E672B90FEB09044B4DB004044BA878B9BB2CB4A17A827ADEBAB2ACA5A5E5837A02C152132C01C1122A5EEE2E0FED603D413DAF042F353535FD839E40B0D4044B40B084CAE4F3F95F254972909EA09E07DFE5B95CEEFD7A826A3070E0C0F7089682258060490D2E77578476A09EA09E578257BFFBDDEFFE9D9E605D4B92A4391603A1ED27580A9600822535B6DC5D19DA017A827A5E0956B6B4B4BC4F4FB0AEE472B9CF1C7BECB1F73DF9E4938B9E7FFEF9B1871F7EF88361B9BCA4ED722958D65EB00C9FE3B6F97C7E94A51C102CE9EF9224B92ACC79FBEB09EA79F07D63E8D0A1EBEB09FA5A3CEC75D0A0413FB9E5965B9E7FEBADB756A47FB3ECF6DB6FBFBBB9B9796A0C9D8265ED05CB1828431B1DDA9B0A3C40B0A44E96BBAB436BD113D4F34AF05628DED7D313F4A52449FEFDA73FFDE99C175E78E1F9B4032FBFFCF213279C70C282ECD058C1B2FA8365DB4099354B3C20585207CBDD35A1BE19A227A8E795E09DF0F02E3D415F88B7B639EAA8A3AEFBD39FFED461A06CE3CDBBEFBE7BC1C1071F7CE95D77DD25D05569B0CCE7F35F8B87BCB60D9482252058522F42A8BC36CC8583F504753DF8C67019DADBA5A2F08D78DE65682BE2857D427B25AC282FC7DB92C47B5E86C717427B3EB425A13D17DAA2D09E0D2DEE599A17DADCD09E09EDA9D0E684F66468B342FB6BF83D4F84C7C7C3E363E1F12FE1F73D1A1E1F098F0F87C787428BE7D63D10DA1F439B12DAFDA1DD17DAA4F033F786C709E1717C781C171EC784C7BBC3CFDE151EEF0C8FB787C7FF0D8FB785C75B4B45EEEFC2E3FF0B8F37877653683786767D68BF09EDD7A18D8C83403C74211E171FAFE6152F151D6F701B1E2F0D8FBF088F3F8FE7FB85C711E13DFF131E2F0A8F1784C7F3C3E3B9E1F1A7E1F1ECF09EB3C2E319E1F1F4F0786A783C25BCF693F07872783C293C0E0B8F2784C7E3C3E371E1F1D8F0787478FC51783C323CFE303C1E1E1E0F0B8F3F088FDF8F37D98DF7438A57188B2783C7E3F6E396B03868C50BDD84C7A6F09884C7C6F0D0101E73E171DFF0F8BDF0B87778DC2B3C7E373CEE512814BE131E770B8FBB84C7FF6A6868D839FCCEFF088F3B86C781E1F15BE1F19BE1F11BE1F1EB312884C7EDC3E376A5F3E4B6098F5F098F5F0EBFF34BE1F18BE1F10BE1F173E1F1B3E171ABF0BBFF393CFE5378FC742E97DB323C6E1E1E3FD5D4D4F489F0F88FCDCDCD5B5F76D965E98A152BDE4ABBE9E5975F7EE997BFFC653A77EE5CA1AE8A8265477B28DBB678BE6C5806368C170A1B3468D0DFC72B51EFB9E79E1F88B73A0ACF378A2D6E7408CBCC87C2F30F0F1E3CF82361B9DA383CDF24B6F0331F0D5F6F1A9E7F2C2C479B85DFF9F1B84CC5652BB6F0F527E3B21697B9F07C8BD2F2F7E9D8E232190FA92E2D9F5B85E75B9796D9CFC516BEFE7C6959FE62F85DFF525ABEBF1C5BF8997F2D2DF7DB84E75F2DAD0BDB85E7FF165B691DF95AF8991DE27A13D79FB8373EAE4BA5F5E95BE1EB6F97D6B11DC3F39DE27A575AF7760E5FFF675C1FE37A199EEF5A5A47BF135B78CFEE71DD8DEB7078BE67697DDE3BB6F0F53EA5F57CDFB847BFB4EE3784E7F9D84A6342129E174AE344BC30D6A0D84AE3C79078B8561C53E2D812C7987889FCD84A63CED0F0FC90380EC5F1283C3F34B6D2F87478787E4469CC3A323C3F2A8E63A5B1ECE8F0F531A5F1EDB8F0FCC7A531EF84D8C2D72796C6C23826FE77697CFC4969AC1C1EC7CDD2F8795A692C8D63EA99A5765669AC3DA734EE9E1B9E9F175B693CBE203CBFB03446FF4F787E711CB7638B6378683F2B8DE7BF08ED97718C2F8DF3F186E69797C6FE7845C72B4BF3C1D5A5764D699E1819E78DF0FCBAD21C12E792EBC3D73794E6969BC2F3DFC6F926CE3BA5B9E796D23C14E7A3DF97E6A6DB4AEBCCE8D29C15E7AE3B4AF3589CCFFE506A7797E6B9B1A5392FCE7DF7C479B03417C63971629C1F4BF3E4E4D29C797F69FE9C5A9A4BE39C3AAD34BF3E546A7F2ACDBB8F84F6E7D25CFC97529B5E9AA31F0F6D4669DEFE6B68334B6D56695E9F5D9AE3E35CFF7469DE7FA65403C45A607EA92E88F5C1C2525B54AA1B16976A88584B2C2DD5152F946A8C1763BD51AA3B96C71AA4D4623DF25AA9368935CAEBA57AE5CD527BAB54C7BC638316EBB0A68EE3C4203D41BD7BD729A79CF2EE78CE5B3CDF72B7DD76DB201682591198158059E197157D59B197157A5981575EDC65455D56D065855C56C465C55B56B865455B56AC65855A56A065C55956946505595688654558567C658557567465C5565668B529B00E2C1556C5A22A2BA8B2422A2BA2B2E2292B9CB282292B96B222292B90B2E2282B8AB282282B84B222282B7EB2C2272B78B262A74D919315385961532C6AB262262B64B222262B5EB2C2252B58B262A5AC48C90A94AC30C98A926231921522590192151F658547567094171B5991F1ECF0E1C397CD9B37EF9DEE06CB65CB96A523468C28160BD51A2E972C59120B99F4E69B6F4E5F7DF5D574F3CD374F77DA69A734AC2FC576EBADB7165F6FFB73F17BE79C734E875F5779B0EC6A5B512A0A5F2D1589CBB30D56A542F2C5B20D574BCB365E2D2EB56C23D6C2B20D59F34BCB56F906ADA7CB366ACD2EB56CE3D6CCB20D5C334ACB6EB6A16B7AD9C6AE3F9796F36CA3D79FCA367C4D2BDBF8F5C7D23A926D049B9C6D082BAD4B13B30D62A575ACB851AC1414C6661BC7E2FA986D202BADA3B7671BCA4AEB6E716359697D1E956D342BADE7C50D67A540936D3CBBB134261437A295C6895F970A9E6C63DA35651BD4AECC36AA95C2D5E5651BD77E996D602B85B29F651BDAE298956D6C8BE358692C2B6E742B8D6FC50D6FA531EFEC6C035C692C2C6E842B8D8FA7661BE3E2B8996D902B8DA5C58D72B195C6D8E2C6B9D2B85BDC40175B693C2E6EA82B8DD1C58D7571DC2E8DDDC58D76A5F1BCB8E12E8EF1A5F05CDC80571AFB5B37E2C57921B66C635E69BE286ED02BCD2149B661AF34B71437EE95E69B7DB38D7CA579A8B8A1AF34371537F6C516E7AC6CA35F691E2B6EF88B2DCE6FD906C0D29C57DC0818E7C1D25C58DC18589A1F8B1B04E39C195BB661B0349716370E96E6D76DB28D84A579B7B8A1B034177F31DB60589AA38B1B0D4BF37671C3616CA5F9BC7503629CEBB38D88B1C51A20DB9818EB82581FC40D42B1C57A21D60D716351AC21622D113724C5BA22B65863C48D4CB1DE887547DC00156B90D8623D12374EC5DA24D628E1F97B63BD12EB96D8E2293DB18E19E0082CD6ED1ECBEBE218A12700FA48C889EF993C79F25D2B57AE7CBB2BA1F2FEFBEF5F70E08107BEF2939FFC247DFAE9A7AB3A6C3DF0C003E9669B6D16F7CA1603E2E38F3F5E7CBCE4924B5A4363F6DEEDB6DBAE356C5E75D555E9C61B6F9C3EF8E083C5AF77DF7DF7D6D7E2EFA8F643614B05F0948E82A5A51E80FEAE743443414F00F4B11B6EB861BFD9B367BFD651A07CF6D967579E7EFAE98BE35E8AB825BBD62EDE1343E1C891238B8F03070E4C274D9AB44AB09C356B563A6AD4A8D660B9C30E3BA4A3478F4EAFBBEEBAD69FBFE9A69B6AEAE23D71AF4B698F9D600940BD05CB781459A22700D68178A8530857F7AF58B1E2CD2C50BEF1C61BEFFCFEF7BF9FB7FFFEFB0F89873865EFADE660397FFEFCE21EC60D37DCB01820B36078E9A597B606C7B8D7B23C58C6F79F7CF2C9AD0174BDF5D64B43902E06B6C9932717BF1FC3672DDE6EA4B4077392600940BD88A721C4C3E3F504C03A74DA69A7B5C4301582D4E2CB2FBFBCDDF313AA7D8F6576F8EB2DB7DCD21A2CE31EC9B67B31B3E74F3DF55471EF64FCDE17BFF8C562D08CDF5FBA7469F17B219CD5EC7D2CCB26D9B807738A251C80FEAE749E7B5E4F00AC63E57B276B3158B60D93F1F9F5D75F5F0C8CF1BCCB458B16AD122CB7DF7EFBF4F6DB6F2F7E2FEEF1DC6AABAD8A87C25E73CD35AD17028A2DFE5CAD064B00A8A360192FA4D8A02700AA5CAD04CBE9D3A7A72FBDF452EB61B0D91EC8F8FD2C58CE9B37AF78E5D8183AE3A1A2F171CB2DB74C0F3DF4D0E2F3B8D733BE77DCB87135BDC71200EA45E9EAFC393D012058F648B08C81F2B39FFD6CEBC57AE20578E2633CF475409BDB8DC4C367A74C99527CCCAE021B1FE3F996D9457C044B00A87EA5FBA6EFA7270004CB1E0996F150D6F818F748C6C7679E7926BDFBEEBB573BC7B2FC671E79E49162A08CF7BEAC95ABDE0A9600F037F1DEC2F11EB67A0240B05CEBB67CF9F2F489279E281EF65AFEFDECFE94F1DE95EDDDC73286D1E1C38717EF6579D2492715BF9F05D478BEA5600900D5ADB1B1F196102EBFA7270004CB3EBF8A6C2DFFFB054B00582558FE2EB47DF4048060A909960050917C3E3F2A4992BDF5048060A90996005091C6C6C65B43DB534F0008969A60090015C9E7F3B72549F25D3D0120586A82250054A4B1B1717408977BE80900C152132C01A0D260F9BFA1EDAE2700044B4DB004808AE4F3F9DB0B85C277F4048060A90996005091C6C6C63B42B8DC4D4F0008969A6009009506CB3B9324D9554F0008969A60090015C9E7F377150A855DF4048060A90996005091C6C6C63F8470F95F7A0240B0D4044B00A83458DE9D24C97FEA0900C152132C01A02221548E696868D8594F0008969A60090015696C6C1C17C2E54E7A0240B0D4044B00A8480895E31B1A1A76D4130082A526580240451A1B1BEF096DA09E00102C35C112002A0D96139224F9B69E00102C35C112002A1242E5BD0D0D0DDFD2130082A526580240451A1B1B2786F64D3D0120586A822500541A2C272549F2EF7A0240B0D4044B00A83458DED7D0D0F00D3D0120586A822500541A2C2787F6753D0120586A822500541A2CEF4F9264073D0120586A822500541A2CA7E4F3F9AFE90900C152132C01A0D2603935B4EDF5048060A90996005069B07C209FCF6FA72700AADCB871E304BAEA692B42B07CD3520900ADC1725A68DBEA09802A3771E2C4858B172F16EAAAA02D58B0E0C6102C67582A01A035583E582814BEAA2700AADCF8F1E3F79A3061C28BCF3DF7DC6BC2DDBADB531943E5D8B1639F096D3F4B2500B406CB87F2F9FC367A02A0068430B3C7983163A6C5C330E3397EB5D8468D1A95D6EABFBDD4EF33844A00582D58FE29B4AFE809007ADD73CF3DB7EF881123D230F16CA13700A0FFC8E7F30F170A857FD51300F4AA344DDFF7C20B2F2C0BD2A14387FEAF1E0180FEA3B1B1F191102EBFAC2700E855F3E6CDFB755A72FFFDF72F4892646FBD0200FD2658FE39CCED5FD21300F49A575E79E5CB6FBFFDF63B699933CF3C735E4B4BCB07F50E00D4BE7C3EFF685353D3BFE809007ACDA2458BE6A46DBCF8E28B8BC20474B1DE0180DAD7D8D8F897102EBFA82700E81573E7CE3D39EDC0A851A316B9993200F48B60393D49922FE809007A5CC88E1F5BB972E51B1D05CB77DE79E7F51FFDE8478F0E1C38F03D7A0B006A5708958FE572B9CFEB09007ADCFCF9F3A7A46B3067CE9C7961323A4A6F0140ED6A6C6C9C11E6F3CFEA09007ADCE4C993D7942BD3152B564C089351DAD2D2F23E3D0600B52984CA2772B9DCD67A02801EF7939FFCE4B0CE0E858DB972D8B06137D9630900B5ADB1B1F1AFF97C7E2B3D0140AFB8F1C61BFFDA51AA7CF2C9272F0D13D114E7580240CD07CB998542E19FF50400BD2297CB7D2604C815ED5CB8677A5353D374578505807E112C67C5395F4F00D06BCE3BEFBC4B42907CBB3C585E71C51557E6F3F98BF40E00F48B60F96498D7FF494F00D06BE2A1AE77DD75D7E22C54BEF8E28BD7C72D9B2D2D2D1FD43B00D02F82E5EC42A1F0693D0140AF3AFCF0C3775AB66CD9CAD0D2A143878E4D92646FBD0200FD2658CEC9E5725BEA09007ADD65975D76E7881123D27C3E3F4A6F0040BF0A964F85B6859E00A0D7C5435FE33D2B9DDC0F00FD2E583E5D281436D71300F4D5C493EA0500E877F3FB33B95CEE537A0200C11200A8747E9F1BDA27F5040082250050E9FC3E3F97CBFDA39E0040B004002A9DDF1784F6713D0180600900543ABF3FDBDCDCBC999E0040B004002A9DDF17E672B98FE90900044B00A0D2F97D5192249BEA0900044B00A0D2F9FDB94183067D544F002058020095CEEF8B73B9DC267A0200C11200A8747E5F9224C9C67A0200C11200A8747E7F7EF0E0C11FD1130008960040A5F3FBD25C2EF7613D0180600900543ABFBF5028143EA42700102C01808AE4F3F9652D2D2D1FD4130008960040A5F3FB4B4D4D4DFFA02700102C01808A2449F2F29E7BEEF9013D0180600900543ABF2FCFE572EFD7130008960040A5F3FB2B83060DFA7B3D0180600900543ABFBFFADDEF7EF7EFF4040082250050E9FCFE5A2E97DB504F002058020095CEEF2B5A5A5ADEA72700102C01804AE7F795BBEDB6DB067A0200C11200A8747E7F3D97CBBD574F002058020095CEEF6F0C1D3A747D3D0180600900543ABFBF3970E0C0F7E80900044B00A0D2F9FDED534E39E5DD7A0200C11200A8747E7F273CBC4B4F0020580200E677006A63E2D1344DD334ADFF35550E00000000000000000000000000000000000000000000000000000000000000B04EFD7F52A9DA10FF9FDF790000000049454E44AE426082, 1); -INSERT INTO `act_ge_bytearray` VALUES ('247539', 1, 'var-userLeave', NULL, 0xACED000573720018636F6D2E6C656E2E656E746974792E557365724C65617665000000000000000102000F4C0009626567696E54696D657400104C6A6176612F7574696C2F446174653B4C000863726561746542797400124C6A6176612F6C616E672F537472696E673B4C000A6372656174654461746571007E00014C0004646179737400134C6A6176612F6C616E672F496E74656765723B4C0007656E6454696D6571007E00014C0002696471007E00024C000B6F70696E696F6E4C6973747400104C6A6176612F7574696C2F4C6973743B4C001170726F63657373496E7374616E6365496471007E00024C0006726561736F6E71007E00024C000673746174757371007E00024C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E00014C000675736572496471007E00024C0008757365724E616D6571007E000278707372000E6A6176612E7574696C2E44617465686A81014B5974190300007870770800000163F9E00C007874002061346137343362666665393731316537623437323230316130363863363438327371007E0006770800000163FEF2E18C78737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000037371007E0006770800000163FF066800787400203266643739336364643964333432663862303335333063383566326233303533737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A65787000000000770400000000787400043230313874000CE6B58BE8AF95E8AFB7E581877070707071007E00087400037A786D, NULL); -INSERT INTO `act_ge_bytearray` VALUES ('247541', 1, 'hist.var-userLeave', NULL, 0xACED000573720018636F6D2E6C656E2E656E746974792E557365724C65617665000000000000000102000F4C0009626567696E54696D657400104C6A6176612F7574696C2F446174653B4C000863726561746542797400124C6A6176612F6C616E672F537472696E673B4C000A6372656174654461746571007E00014C0004646179737400134C6A6176612F6C616E672F496E74656765723B4C0007656E6454696D6571007E00014C0002696471007E00024C000B6F70696E696F6E4C6973747400104C6A6176612F7574696C2F4C6973743B4C001170726F63657373496E7374616E6365496471007E00024C0006726561736F6E71007E00024C000673746174757371007E00024C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E00014C000675736572496471007E00024C0008757365724E616D6571007E000278707372000E6A6176612E7574696C2E44617465686A81014B5974190300007870770800000163F9E00C007874002061346137343362666665393731316537623437323230316130363863363438327371007E0006770800000163FEF2E18C78737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000037371007E0006770800000163FF066800787400203266643739336364643964333432663862303335333063383566326233303533737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A65787000000000770400000000787400043230313874000CE6B58BE8AF95E8AFB7E581877070707071007E00087400037A786D, NULL); -INSERT INTO `act_ge_bytearray` VALUES ('247542', 1, 'hist.detail.var-userLeave', NULL, 0xACED000573720018636F6D2E6C656E2E656E746974792E557365724C65617665000000000000000102000F4C0009626567696E54696D657400104C6A6176612F7574696C2F446174653B4C000863726561746542797400124C6A6176612F6C616E672F537472696E673B4C000A6372656174654461746571007E00014C0004646179737400134C6A6176612F6C616E672F496E74656765723B4C0007656E6454696D6571007E00014C0002696471007E00024C000B6F70696E696F6E4C6973747400104C6A6176612F7574696C2F4C6973743B4C001170726F63657373496E7374616E6365496471007E00024C0006726561736F6E71007E00024C000673746174757371007E00024C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E00014C000675736572496471007E00024C0008757365724E616D6571007E000278707372000E6A6176612E7574696C2E44617465686A81014B5974190300007870770800000163F9E00C007874002061346137343362666665393731316537623437323230316130363863363438327371007E0006770800000163FEF2E18C78737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000037371007E0006770800000163FF066800787400203266643739336364643964333432663862303335333063383566326233303533737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A65787000000000770400000000787400043230313874000CE6B58BE8AF95E8AFB7E581877070707071007E00087400037A786D, NULL); -INSERT INTO `act_ge_bytearray` VALUES ('247554', 1, 'var-userLeave', NULL, 0xACED000573720018636F6D2E6C656E2E656E746974792E557365724C65617665000000000000000102000F4C0009626567696E54696D657400104C6A6176612F7574696C2F446174653B4C000863726561746542797400124C6A6176612F6C616E672F537472696E673B4C000A6372656174654461746571007E00014C0004646179737400134C6A6176612F6C616E672F496E74656765723B4C0007656E6454696D6571007E00014C0002696471007E00024C000B6F70696E696F6E4C6973747400104C6A6176612F7574696C2F4C6973743B4C001170726F63657373496E7374616E6365496471007E00024C0006726561736F6E71007E00024C000673746174757371007E00024C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E00014C000675736572496471007E00024C0008757365724E616D6571007E000278707372000E6A6176612E7574696C2E44617465686A81014B5974190300007870770800000163F9E00C007874002061346137343362666665393731316537623437323230316130363863363438327371007E0006770800000163FEF7CF0278737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000037371007E0006770800000164042CC400787400203765393832666139393863303434386538306231353832346333303439633562737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A65787000000000770400000000787400043230313874000CE6B58BE8AF95E8AFB7E581877070707071007E00087400037A786D, NULL); -INSERT INTO `act_ge_bytearray` VALUES ('247556', 1, 'hist.var-userLeave', NULL, 0xACED000573720018636F6D2E6C656E2E656E746974792E557365724C65617665000000000000000102000F4C0009626567696E54696D657400104C6A6176612F7574696C2F446174653B4C000863726561746542797400124C6A6176612F6C616E672F537472696E673B4C000A6372656174654461746571007E00014C0004646179737400134C6A6176612F6C616E672F496E74656765723B4C0007656E6454696D6571007E00014C0002696471007E00024C000B6F70696E696F6E4C6973747400104C6A6176612F7574696C2F4C6973743B4C001170726F63657373496E7374616E6365496471007E00024C0006726561736F6E71007E00024C000673746174757371007E00024C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E00014C000675736572496471007E00024C0008757365724E616D6571007E000278707372000E6A6176612E7574696C2E44617465686A81014B5974190300007870770800000163F9E00C007874002061346137343362666665393731316537623437323230316130363863363438327371007E0006770800000163FEF7CF0278737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000037371007E0006770800000164042CC400787400203765393832666139393863303434386538306231353832346333303439633562737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A65787000000000770400000000787400043230313874000CE6B58BE8AF95E8AFB7E581877070707071007E00087400037A786D, NULL); -INSERT INTO `act_ge_bytearray` VALUES ('247557', 1, 'hist.detail.var-userLeave', NULL, 0xACED000573720018636F6D2E6C656E2E656E746974792E557365724C65617665000000000000000102000F4C0009626567696E54696D657400104C6A6176612F7574696C2F446174653B4C000863726561746542797400124C6A6176612F6C616E672F537472696E673B4C000A6372656174654461746571007E00014C0004646179737400134C6A6176612F6C616E672F496E74656765723B4C0007656E6454696D6571007E00014C0002696471007E00024C000B6F70696E696F6E4C6973747400104C6A6176612F7574696C2F4C6973743B4C001170726F63657373496E7374616E6365496471007E00024C0006726561736F6E71007E00024C000673746174757371007E00024C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E00014C000675736572496471007E00024C0008757365724E616D6571007E000278707372000E6A6176612E7574696C2E44617465686A81014B5974190300007870770800000163F9E00C007874002061346137343362666665393731316537623437323230316130363863363438327371007E0006770800000163FEF7CF0278737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000037371007E0006770800000164042CC400787400203765393832666139393863303434386538306231353832346333303439633562737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A65787000000000770400000000787400043230313874000CE6B58BE8AF95E8AFB7E581877070707071007E00087400037A786D, NULL); -INSERT INTO `act_ge_bytearray` VALUES ('302553', 1, '请假流程.bpmn20.xml', '302552', 0x3C3F786D6C2076657273696F6E3D27312E302720656E636F64696E673D275554462D38273F3E0A3C646566696E6974696F6E7320786D6C6E733D22687474703A2F2F7777772E6F6D672E6F72672F737065632F42504D4E2F32303130303532342F4D4F44454C2220786D6C6E733A7873693D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D612D696E7374616E63652220786D6C6E733A7873643D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D612220786D6C6E733A61637469766974693D22687474703A2F2F61637469766974692E6F72672F62706D6E2220786D6C6E733A62706D6E64693D22687474703A2F2F7777772E6F6D672E6F72672F737065632F42504D4E2F32303130303532342F44492220786D6C6E733A6F6D6764633D22687474703A2F2F7777772E6F6D672E6F72672F737065632F44442F32303130303532342F44432220786D6C6E733A6F6D6764693D22687474703A2F2F7777772E6F6D672E6F72672F737065632F44442F32303130303532342F44492220747970654C616E67756167653D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D61222065787072657373696F6E4C616E67756167653D22687474703A2F2F7777772E77332E6F72672F313939392F585061746822207461726765744E616D6573706163653D22687474703A2F2F7777772E61637469766974692E6F72672F70726F63657373646566223E0A20203C70726F636573732069643D2270726F636573735F6C6561766522206E616D653D22E8AFB7E58187E6B581E7A88B2220697345786563757461626C653D2274727565223E0A202020203C73746172744576656E742069643D22737461727422206E616D653D227374617274222F3E0A202020203C757365725461736B2069643D22757365723122206E616D653D22E7BB8FE79086E5AEA1E689B9222061637469766974693A61737369676E65653D223062373632356665646161303565383566323832343836653163396339316239222061637469766974693A63616E64696461746547726F7570733D226533343665393633363834383463386661376632313763653535306130313836222F3E0A202020203C73657175656E6365466C6F772069643D227369642D30443235384332342D314631392D343233332D413937362D4130443843423944414541432220736F757263655265663D22737461727422207461726765745265663D227573657231222F3E0A202020203C757365725461736B2069643D22757365723222206E616D653D22E4BABAE4BA8BE5AEA1E689B9222061637469766974693A61737369676E65653D223938623035316230333638316465363032383939336135643134616339336362222F3E0A202020203C6578636C7573697665476174657761792069643D227369642D35353636443037362D414234432D344134322D393938462D323533373738394638313831222F3E0A202020203C73657175656E6365466C6F772069643D227369642D33334642463234452D464537302D343730412D394442352D3942313838314531333834372220736F757263655265663D22757365723222207461726765745265663D227369642D35353636443037362D414234432D344134322D393938462D323533373738394638313831222F3E0A202020203C6578636C7573697665476174657761792069643D227369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535222F3E0A202020203C757365725461736B2069643D227573657222206E616D653D22E8B083E695B4222F3E0A202020203C656E644576656E742069643D22656E6422206E616D653D22656E64222F3E0A202020203C73657175656E6365466C6F772069643D227369642D34373638373538312D333535422D343335342D383433432D43333034323333323836414622206E616D653D22E5908CE6848F2220736F757263655265663D227369642D35353636443037362D414234432D344134322D393938462D32353337373839463831383122207461726765745265663D22656E64223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D747275657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C73657175656E6365466C6F772069643D227369642D46423539344242452D383030352D344544432D423343382D39373831454432323643393522206E616D653D22E4B88DE5908CE6848F2220736F757263655265663D227369642D35353636443037362D414234432D344134322D393938462D32353337373839463831383122207461726765745265663D2275736572223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D66616C73657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C73657175656E6365466C6F772069643D227369642D39394343413337462D413233352D343835332D383437322D44453233334144324544333222206E616D653D22E9878DE696B0E794B3E8AFB72220736F757263655265663D227573657222207461726765745265663D227573657231223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D747275657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C6578636C7573697665476174657761792069643D227369642D39353037343945412D344242362D343237362D423637412D444530334533344130353733222F3E0A202020203C73657175656E6365466C6F772069643D227369642D30344339463239412D304242352D343639312D383034432D37363445344530413237313622206E616D653D22E58F96E6B688E8AFB7E581872220736F757263655265663D227573657222207461726765745265663D22656E64223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D66616C73657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C73657175656E6365466C6F772069643D227369642D30413541464638362D414541342D343231322D423146342D3932373541343430364332442220736F757263655265663D22757365723122207461726765745265663D227369642D39353037343945412D344242362D343237362D423637412D444530334533344130353733222F3E0A202020203C73657175656E6365466C6F772069643D227369642D37463032463244352D413642412D343233342D413732342D3346383938443233354134422220736F757263655265663D226368696C6422207461726765745265663D227369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535222F3E0A202020203C73756250726F636573732069643D226368696C6422206E616D653D2273756250726F63657373223E0A2020202020203C73746172744576656E742069643D22737374617274222F3E0A2020202020203C757365725461736B2069643D22616C6C6D616E6167657222206E616D653D22E680BBE7BB8FE79086E5AEA1E689B9222061637469766974693A61737369676E65653D226438313861633661383663663161363464323138346266303639396436376138222F3E0A2020202020203C6578636C7573697665476174657761792069643D227369642D31434331333342322D343442312D343833302D394335392D374433353634433933334641222F3E0A2020202020203C656E644576656E742069643D227369642D46363844434341302D463741342D343444342D394534342D353641363832443837454341222F3E0A2020202020203C656E644576656E742069643D227369642D36393442374132412D393841442D343530442D383146452D313135424335363237354244222F3E0A2020202020203C73657175656E6365466C6F772069643D227369642D33453941414432332D343444412D344138352D383242442D4436433833304134433439382220736F757263655265663D2273737461727422207461726765745265663D22616C6C6D616E61676572222F3E0A2020202020203C73657175656E6365466C6F772069643D227369642D41323335414337362D354242452D344133382D383243342D31304545383141463834363522206E616D653D22E5908CE6848F2220736F757263655265663D227369642D31434331333342322D343442312D343833302D394335392D37443335363443393333464122207461726765745265663D227369642D46363844434341302D463741342D343444342D394534342D353641363832443837454341223E0A20202020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D747275657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A2020202020203C2F73657175656E6365466C6F773E0A2020202020203C73657175656E6365466C6F772069643D227369642D44413934353339452D463639342D343041312D424534412D42434343314439424431314422206E616D653D22E4B88DE5908CE6848F2220736F757263655265663D227369642D31434331333342322D343442312D343833302D394335392D37443335363443393333464122207461726765745265663D227369642D36393442374132412D393841442D343530442D383146452D313135424335363237354244223E0A20202020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D66616C73657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A2020202020203C2F73657175656E6365466C6F773E0A2020202020203C73657175656E6365466C6F772069643D227369642D34454238313431392D314141372D343937452D413545452D4535414546313743354530422220736F757263655265663D22616C6C6D616E6167657222207461726765745265663D227369642D31434331333342322D343442312D343833302D394335392D374433353634433933334641222F3E0A202020203C2F73756250726F636573733E0A202020203C73657175656E6365466C6F772069643D227369642D41453541454438342D303734362D343738372D393836462D36413739323743333443333422206E616D653D22E5908CE6848F2220736F757263655265663D227369642D42453337324431342D463530392D344544422D383745382D37423231303738333541453522207461726765745265663D227573657232223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D747275657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C73657175656E6365466C6F772069643D227369642D35313046453036322D433042432D343643382D394231372D38413338303732413242433622206E616D653D22E4B88DE5908CE6848F2220736F757263655265663D227369642D42453337324431342D463530392D344544422D383745382D37423231303738333541453522207461726765745265663D2275736572223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D66616C73657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C73657175656E6365466C6F772069643D227369642D38344442433035362D303639312D343733452D383243462D44333235454637333641373222206E616D653D22E4B88DE5908CE6848F2220736F757263655265663D227369642D39353037343945412D344242362D343237362D423637412D44453033453334413035373322207461726765745265663D227369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D66616C73657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C73657175656E6365466C6F772069643D227369642D30443039333043392D394241312D344636382D383545412D33383445313642343039413022206E616D653D22E5908CE6848F2220736F757263655265663D227369642D39353037343945412D344242362D343237362D423637412D44453033453334413035373322207461726765745265663D226368696C64223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D747275657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A20203C2F70726F636573733E0A20203C62706D6E64693A42504D4E4469616772616D2069643D2242504D4E4469616772616D5F70726F636573735F6C65617665223E0A202020203C62706D6E64693A42504D4E506C616E652062706D6E456C656D656E743D2270726F636573735F6C65617665222069643D2242504D4E506C616E655F70726F636573735F6C65617665223E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227374617274222069643D2242504D4E53686170655F7374617274223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2233302E30222077696474683D2233302E302220783D2233302E302220793D223232382E37303337303339393831383338222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227573657231222069643D2242504D4E53686170655F7573657231223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2238302E30222077696474683D2239392E39393939393939393939393939342220783D223132302E302220793D223230332E37303337303339393831383338222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227573657232222069643D2242504D4E53686170655F7573657232223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2237392E3939393939393939393939393937222077696474683D2239392E39393939393939393939393938392220783D223531302E30393038383236333634343631372220793D223230332E3730333730333130343131343233222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227369642D35353636443037362D414234432D344134322D393938462D323533373738394638313831222069643D2242504D4E53686170655F7369642D35353636443037362D414234432D344134322D393938462D323533373738394638313831223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2234302E30222077696474683D2234302E302220783D223731352E353435343431333138323233312220793D223232332E37303337303339393831383338222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535222069643D2242504D4E53686170655F7369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2234302E30222077696474683D2234302E302220783D223337302E353435343431333138323233312220793D223232332E37303337303339393831383338222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D2275736572222069643D2242504D4E53686170655F75736572223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2238302E30222077696474683D223130302E30303030303030303030303032332220783D223334302E3534353434313331383232332220793D223336382E37303337303636343732373932222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D22656E64222069643D2242504D4E53686170655F656E64223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2232382E30222077696474683D2232382E302220783D223838302E353435343431333138323233322220793D223232392E37303337303339393831383338222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227369642D39353037343945412D344242362D343237362D423637412D444530334533344130353733222069643D2242504D4E53686170655F7369642D39353037343945412D344242362D343237362D423637412D444530334533344130353733223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2234302E30222077696474683D2234302E302220783D223236342E39393939393939393939393939342220793D223232332E37303337303339393831383338222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D226368696C64222069643D2242504D4E53686170655F6368696C64223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D223137322E3130323038303930333236363038222077696474683D223431312E36303837323832303738373235362220783D223138342E37343130373732313432383638362220793D22312E34323130383534373135323032303034452D3134222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D22737374617274222069643D2242504D4E53686170655F737374617274223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2233302E30222077696474683D2233302E302220783D223230332E32353935393536373832393732352220793D2237312E3035313034303435313633333034222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D22616C6C6D616E61676572222069643D2242504D4E53686170655F616C6C6D616E61676572223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2238302E30222077696474683D2239392E39393939393939393939393939372220783D223237342E37343130373732313432383638362220793D2234362E3035313034303435313633333034222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227369642D31434331333342322D343442312D343833302D394335392D374433353634433933334641222069643D2242504D4E53686170655F7369642D31434331333342322D343442312D343833302D394335392D374433353634433933334641223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2234302E30222077696474683D2234302E302220783D223431392E37343130373732313432383638362220793D2236362E3035313034303435313633333034222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227369642D46363844434341302D463741342D343444342D394534342D353641363832443837454341222069643D2242504D4E53686170655F7369642D46363844434341302D463741342D343444342D394534342D353641363832443837454341223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2232382E30222077696474683D2232382E302220783D223530342E37343130373732313432383638362220793D2237322E3035313034303435313633333036222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227369642D36393442374132412D393841442D343530442D383146452D313135424335363237354244222069643D2242504D4E53686170655F7369642D36393442374132412D393841442D343530442D383146452D313135424335363237354244223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2232382E303030303030303030303030303134222077696474683D2232382E302220783D223432352E37343130373732313432383638362220793D223133352E30222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D30344339463239412D304242352D343639312D383034432D373634453445304132373136222069643D2242504D4E456467655F7369642D30344339463239412D304242352D343639312D383034432D373634453445304132373136223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223339302E35343534343133313832323331342220793D223434382E37303337303636343732373932222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223339302E35343534343133313832323331342220793D223439342E37303337303636343732373932222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223839342E353435343431333138323233322220793D223439342E37303337303636343732373932222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223839342E353435343431333138323233322220793D223235372E37303337303339393831383338222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D38344442433035362D303639312D343733452D383243462D443332354546373336413732222069643D2242504D4E456467655F7369642D38344442433035362D303639312D343733452D383243462D443332354546373336413732223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223330342E353930383639353736373134332220793D223234342E3131323833343432313436393437222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223337302E363430313837323338373936332220793D223234332E373938343439393138373537222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D41323335414337362D354242452D344133382D383243342D313045453831414638343635222069643D2242504D4E456467655F7369642D41323335414337362D354242452D344133382D383243342D313045453831414638343635223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223435392E333632383732303836303831372220793D2238362E3432393234353537393833383138222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223530342E373431333631313932383236322220793D2238362E3134303231303631373337343835222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D35313046453036322D433042432D343643382D394231372D384133383037324132424336222069643D2242504D4E456467655F7369642D35313046453036322D433042432D343643382D394231372D384133383037324132424336223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223339302E393837353134343839383930352220793D223236332E32363136333038323635313634222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223339302E36363730323138363333373736372220793D223336382E37303337303636343732373932222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D30443235384332342D314631392D343233332D413937362D413044384342394441454143222069643D2242504D4E456467655F7369642D30443235384332342D314631392D343233332D413937362D413044384342394441454143223E0A20202020202020203C6F6D6764693A776179706F696E7420783D2236302E302220793D223234332E37303337303339393831383338222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223132302E302220793D223234332E37303337303339393831383338222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D34454238313431392D314141372D343937452D413545452D453541454631374335453042222069643D2242504D4E456467655F7369642D34454238313431392D314141372D343937452D413545452D453541454631374335453042223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223337342E37343130373732313432383638362220793D2238362E3236373439303636383038333235222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223432302E31353431323036393235343737342220793D2238362E3436343038333932393839333932222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D33334642463234452D464537302D343730412D394442352D394231383831453133383437222069643D2242504D4E456467655F7369642D33334642463234452D464537302D343730412D394442352D394231383831453133383437223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223631302E3039303838323633363434362220793D223234332E3834353738353439363831313337222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223731352E393838343436343031363631392220793D223234342E3134363730393038313632323632222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D34373638373538312D333535422D343335342D383433432D433330343233333238364146222069643D2242504D4E456467655F7369642D34373638373538312D333535422D343335342D383433432D433330343233333238364146223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223735352E313035353637393030353031362220793D223234342E3134333537373431353930353333222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223838302E3534353531303937373036392220793D223234332E3734373836373831363239343733222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D44413934353339452D463639342D343041312D424534412D424343433144394244313144222069643D2242504D4E456467655F7369642D44413934353339452D463639342D343041312D424534412D424343433144394244313144223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223434302E303837373235313633333532342220793D223130352E3730343339323530323536373534222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223433392E383533313635313630393039322220793D223133352E3030303434383731313033393938222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D30443039333043392D394241312D344636382D383545412D333834453136423430394130222069643D2242504D4E456467655F7369642D30443039333043392D394241312D344636382D383545412D333834453136423430394130223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223238342E32343236393939353539333433372220793D223232342E34363130303430343232343934222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223139332E34393435373938303736303230372220793D223137322E3130323038303930333236363038222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D37463032463244352D413642412D343233342D413732342D334638393844323335413442222069643D2242504D4E456467655F7369642D37463032463244352D413642412D343233342D413732342D334638393844323335413442223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223339302E35343534343133313832323331342220793D223137322E3130323038303930333236363038222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223339302E353435343431333138323233312220793D223232332E3730333730333939383138333738222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D39394343413337462D413233352D343835332D383437322D444532333341443245443332222069643D2242504D4E456467655F7369642D39394343413337462D413233352D343835332D383437322D444532333341443245443332223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223334302E3534353434313331383232332220793D223430382E37303337303636343732373933222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223136392E39393939393939393939393939372220793D223430382E37303337303636343732373933222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223136392E39393939393939393939393939372220793D223238332E37303337303339393831383338222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D46423539344242452D383030352D344544432D423343382D393738314544323236433935222069643D2242504D4E456467655F7369642D46423539344242452D383030352D344544432D423343382D393738314544323236433935223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223733362E303435343431333138323233312220793D223236332E32303337303339393831383338222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223733362E303435343431333138323233312220793D223430382E37303337303636343732373932222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223434302E35343534343133313832323332352220793D223430382E3730333730363634373237393236222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D41453541454438342D303734362D343738372D393836462D364137393237433334433334222069643D2242504D4E456467655F7369642D41453541454438342D303734362D343738372D393836462D364137393237433334433334223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223431302E31303138303630343037373735352220793D223234342E3134373333393237353632393338222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223531302E30393038383236333634343631372220793D223234332E3835313539323539373636343134222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D30413541464638362D414541342D343231322D423146342D393237354134343036433244222069643D2242504D4E456467655F7369642D30413541464638362D414541342D343231322D423146342D393237354134343036433244223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223231392E39393939393939393939393939342220793D223234332E393230313534323134363334222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223236352E343133303433343738323630382220793D223234342E31313637343734373634343437222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D33453941414432332D343444412D344138352D383242442D443643383330413443343938222069643D2242504D4E456467655F7369642D33453941414432332D343444412D344138352D383242442D443643383330413443343938223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223233332E32353935393536373832393732352220793D2238362E3035313034303435313633333034222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223237342E37343130373732313432383638362220793D2238362E3035313034303435313633333034222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A202020203C2F62706D6E64693A42504D4E506C616E653E0A20203C2F62706D6E64693A42504D4E4469616772616D3E0A3C2F646566696E6974696F6E733E, 0); -INSERT INTO `act_ge_bytearray` VALUES ('302554', 1, '请假流程.process_leave.png', '302552', 0x89504E470D0A1A0A0000000D4948445200000396000001F80806000000316A727D000062194944415478DAECDD097C54D5FDFF7F5CEBBFF5E752BF55DBAAB5D65A977EADD6B57611BFB5162B5AA424933B4920ECC862485804110822A8280209680111152C8A451414902433804650401417108CB2C85264515C5204BDFFF3B9B967B8339949662699C9CCDCD7D3C779CC649604CFDC39E7BCEF39F7DE162D80CC77FCB5D75E3BFBDC73CFFD5ADD3729140A8542698A72D65967FDF7861B6E582CFD0C5D2D0000191E2ACF38E38C8D37DD74D3772B57AE346B6A6A4C00001AEBE0C183E63BEFBC63B66BD7CE3CEDB4D33E215C020090C18E3BEEB87B6EBCF1C6830C81000089D2B66DDB43279D74D2787A5D00003237586E90994A00001265DDBA75E6F1C71FBF9D5E170080CCC5F257004042C9B2D816B5C75D0200804C0D960000241AC112000082250000044B0000D03CC1D21E48983939398CAA0080600900000896F10F26CE38E38C3A8FB76FDF3E103C8F39E618F3B2CB2E33DF7BEF3D465F0040B004000004CBE882A5F3B96FBFFDD6BCF3CE3BCD162CCD050082250000C8DC60F9AF7FFDCB3CFBECB3CDA38E3A2A30D328BA74E962DDBFFEFAEBCD03070E043DA70713BD7AF5322FB8E002EB7E595959D860D9AF5FBFC0FB9CBFE7D1471F0DFA9DBB76ED32FFF18F7F041EEBD3A78FF57AEDF3CF3F37F3F2F202CFCF9D3B37F09CBCF7C61B6F0C3C273F37F4FFD7D07300008225000004CBD806050DCE4ACE9E3DDBFAF98D37DE087A9F84C701030604FD8E9FFCE42781E72FBAE822F3EDB7DF0EFB3777EFDE5DE731B94C8A04C3D07F57B76EDDAC9FB76FDF6E85CAD090AB7F1E3D7A74C4E762F97F0700102C0100205846E9934F3E092C579599BB2D5BB6840D963ACC39836568E80CF7BE480391534F3DB5CE63575E7965E0E770BFF357BFFA55D8DF77CD35D70442626858ACEFFFAFBEE70000044B00000896718834DB27B392F7DC738F757FD5AA557566FB64D96AACC1F2C4134F0C3B7B2817DC9665AFA101512F83DDBB77AFF5FC934F3E19F6DF2925D2C98242FFFFA27D0E0040B004008060598F9B6EBA2910CC4E3FFD7473E6CC9981E72444EAE7E4184A67D8935B79AD7EACBABADA7ADC7956D82FBEF822E86FC9CFA1338BFA384A59FE7AEBADB7061E2F2C2CB496C53A67175BB66C59E7EF899D3B779A7FFDEB5F03CF2D5BB62CAAFFBFFA9E0300102C01002058020040B0040000044B0000C1120000102C0100044B000040B004008060090000C112000082250000205802000896000080600900205802000082250000044B000008960000102C010000C1120040B0040000044B0000C1120000102C0100044B000040B0040080600900000896000082250000205802000896000080600900205802000082250000044B000040B00400102C010000C1120040B0040000044B0000C1120000102C01002058020040B004008060090000089600008225000020580200089600008060090000C112000082250000044B000040B00400102C010000C1120040B0040000044B0000C19260090000C11200008225000020580200089600008060999E0EAAFFE67C38C79C5F35DF5C5CB1D82C2F2FA724B1489D2F5CBAD07C7FC3FB6C8C00C1120000102CD39384CA05CB169853374F35C7EF1D4F69863279EB64F365FFCBE6860D1BD82001822500002058A61F99A92454A646B8ACACAC648304089600008060997E642926C12E358A2C8D0540B004000004CBB42361865047B004089600008060898407CB29DBC79A152B869A2BCB075945EECB630442822540B0040000044B826514A1F24173F5A281E6DB2F0D082AF2983C4728245802044B000040B02458D65BE6BD35A24EA8D465FE5B77130A099600C1120000102C0996F5079EE5958323064B798E5048B00408960000806049B0ACB7AC5C7C47C46029CF110A099600C1120000102C0996044B822540B0040000044B243058960F8A1C2CD5738442822540B0040000044B8265BD65D9B2211183A53C4728245802044B000040B02458D65B6654DF67AE7AB9EE7258794C9E2314122C01822500002058122C1B0E3D2B86D50996F21881906009102C010000C19260D960E099B067BCB9E4D5BBEA044B794C9E2314122C01822500002058122C239629DB1F6CF0184B790DC1906009102C010000C1926059679672CE7BF7986B160E8C182A7591D7C86B99BD245802044B000040B0245846354BC9EC25C11220580200008225EA0D96D1CC52D6377B4948245836C6A64D9BA804102C010000C132DD8365BCA152174222C1325E23478EB406F9720B102C010000C1328D83258560D91CEEBFFF7EF388238E302FBDF452EB76D8B0617C4141B0040000044B82258560195BA8D46152662C8F3CF248C22508960000806049B0A4102C630F950D3D0E102C010000C1926049215806C8CC647DE1513FCF31972058020080B409969B376F3667CE9C698E1E3DDAECD3A78F59505060E6E4E498F9F9F966CF9E3DCDE1C3879B53A74E353FFEF86382258560D944A1B2A1D0C8CC6578D5D5D5E6B871E3ACB6292F2FCF340CC36AAFA4E4E6E69A3D7AF430C78C1963BD0E044B0000089649307FFE7CB3A4A4C4ECDBB7AF3979F26473C58A15E6B66DDBCC9A9A1AEB79B9DDB56B97B97AF56AF389279EB05E77C71D77984F3EF924C19242B06CC4F2D7686722637D7D269B356B96D9A54B9740888CA674EEDCD99C366D1A099260090000C13211366CD86005CA01030658A1F1D0A14351BFF7ADB7DE32EFBCF34E2B64AE5DBB9660492158C6182A639D81747BB85CBF7EBDD9B56BD798026568E9D8B1635AB757044B00009072C172EEDCB9D6523199AD8C2550865AB4689135D84BD7D94B8225C1321D42A5DB97C54E9F3E3D68A9AB5EEE7AEFBDF79A3E9FCFDCB2658BB97FFF7EEBB55F7DF595B5E2A2AAAACA5A2A2B4BF99DEF93DFC3EC25C11200008265138529398652662C9BC2A64D9BCC5EBD7A998F3EFA28C19242B08CA0A113F524FBF7A48BD9B367D70994722CB82CCF8FC6BE7DFBACD7CBFB9CBFE7E1871F2651122C01002058C66BCE9C3956A88C7650162DF97D72120D99592058520896E1C360532D6375CBCCA5B427CE30585C5C6CCD4EC643DE27CBFE9DBF8F994B8225000004CB387CF0C10766F7EEDD9B6CA632DCCC65A74E9DCC356BD6102C2904CB9010A843E5B7DF7E6B9D7C466E6311FABE4C3FE6528EA9742E7F95B352EBE5AEF19265B2A3468D0A5A169B4EED15C1120000A444B01C326488754C6522C9319772EC26C19242B0AC3BB328A1F0BCF3CEB306F2721B6DB88CF4BE4C0E97CE33BFCA4C656343A5335C3A672EE5843E044B8225000004CB283DFFFCF3D660EA9B6FBE49F820A5A8A8286D9698112C0996C90A953A2CD983F8A8C3A53354EAD2AD5BB73ACB6C336959AC5C52C4794C65BCCB5FEB5B16EB3CE6D2ED4B6209960000102CA376D75D775997144906399DFF6DB7DD46B0A4B83658460A7BE142627DE132DAD767DA3197CED94A39F14EA2C3ABDB672D09960000102CA3F2F1C71F5B27EC69CC65456225CB61E518A9E61E9C2E5EBC986049B04CE836142954465A9E1A6D588C3584A6CBB2D886EAB4BABA3A68B672CF9E3D09F977C8D9629D972269EEF68A60090000523E58CA6540927D2990C71E7BCC1C33664CB30E96F4805106B2959595044B826542B6A178C25D43A131D650E9FCFB471E79644ACF5C3654A772ED49FD9A44B721C9FC5B044B000090F6C1B2A4A4C45CB1624552072AB2EC562E3F920A03585DBA76ED5A67A6846049B06CEC3614EF72D448E1F1E0C1837185CA8696E1A64B9D4ABBA19F5BB2644942FF2D55555581BF2567CC265802000082653DE478C71D3B762475A022D7B5CCCBCB4BA901AC73A6440F64099604CBC66E43F184CAFAC2E5B1C71E1B77A86CECBF2715EA54DA0DFD58539FB427D4B66DDB027FCBEBF5122C010000C1B23EEDDBB7376B6A6A923A5091BF27D7884BC501AC73A6846049B06CEC3624A531212E5CB86C4CA88C75596EAAD5A9B334D5254622914B8F38FF1EC1120000102C1B18C8A5FA00B2B90AC132F582653A6C37BAB46DDBD61A94FFEA57BF6AD4774596BF86CE54CACFF278635C7AE9A5D6EF4AA73A4D76D02358122C010020584649CE7CC88CE5E1D2A1430773F6ECD9E6810307121A2C4BDE29317BCFEF1DF8593ED39B87DF1CF6B5BD5EE8653DFFD0AE87CC1E737A98577AAF34BB3DD3CDBCA8D545E655B95735E9BF4BFECEADA36E6DF0357F2EFCB375BFD3139DCC71BBC7051EEF30AD83EB672C9DDB5043678165C632B63A65C69260090000523458CA49299AE3184BB954402A0D609D61404BF48CA57C8EFD7CFDCC31DBC658F78B2B8B23BEAEEDBD6DAD60A9439C7EFC86FE37047E1EFDD168F3BC6BCFB342A704BC9F5FF973F3B27697593FEB30DA7E6A7BF398E38E09BCA7EFCB7D839E3FF1F413CD5F5CF30BEBBE942E4F75314F39FB943AFF1EEF246FE0BEFC4E7D5F82A65B8365B86D88632C6BF52DF599031F596A8E98FE5AC432FFB56AEB755D074D8858A71C6349B0040000291A2C070E1C98F4B3C22E5FBEBCD9CFB2A8078C050505D6C5D043C3402283E5909543ACC076FC8F8EB7C2DBD1DF3BDAFAF9F4F34FB702A4F3B55D67750DCC6CCAE7FE97E2BF04EEFFE6E6DFD4F9DD123EE53999D9D4AFCB7D24D7BA95F02881F3E4334E0E0A89CE30283FB71EDA3AF0F351C71C1508AF23DE1B61FD7BE535E7FEE15C2B50CAFDA16F0E0DBC77F0EB83ADDB760FB4734DB0AC6F1B8A778630D3CE0A2B81F1B197DE89EA753D4A1E0BAAD39D7BBF32074F5E6695821EFD382B2CC1120000A462B02C2B2B33A74E9D9AD481CAA449939AFDBA7091669792112C7BCEED6905B6D0C78F3BE138F3E2D617077ED6214D42A7737652EECBEF904028F70B1716D699519400A8EF4B9095DB82E905E6A80F4759F7477E30D27A7EECCEB1E6ED2FDD1E98A194E7AECEBFDABA2FC155C268B81954E78CE509A79E1058AE2BB39B320BEA8619CB68B6A178660A13751DCB279F7CB2D9AE632981F1AD8DFF3117BCFE719D59CA992FBF673DBF7EF3EEDA99CD092FD6A953FDFFD66D7019D7B12458020080540C96D5D5D5668F1E3DCC43870E256DA0D2B1634773FDFAF5293FA06AEE60294B64255CCA72D9332F39D30A88F21AF959BFE6EE75775B033F99D97C60C703817028C12F6B6C9675BFF38CCE11672C753894D7848652F977CADF0B172C65C672E02B0303CB79F5E3F237DDB214361E0DCD18461B1A630D973AD40E1A34A859FEBF75B03C70E06083AF1B3AEDD5C0CF4BDEDC6C963CF69A552484DEFEE03CD330BC56D893E5F47BF6EC49C8BF77DFBE7DD6F1E73A58A6437B45B0040000CD1A2C459F3E7DCCD5AB57276590F2C61B6F58C1321D243258CA67F8872E7FB0C29E3EBE511EBBAED7757596CDCA73121A25C8C971987A76512FA3D5B3877A06527E8FCC20EAB0A7672965C6529E1FF6F6B03A41F19CABCFA9336329C75B86CEA0CA497BE4354699113694BAE918CB78459AB98C352C46FBFAE60E953A30CEF6AD0FDC1FFCCF6541C7554E7B716DD860596307D1E232BF39C87E4FFBAE7D02816FE6CC9909F9F7CA325CFD37D2A5BD2258020080660F9632882A2C2C4CCAACA51CAB346DDA345707CBBB56DD65151DC66E1A7293755F02DF3D1BEEA913FAA41495175927EE9163281B0A71CE594709983A30CA6CE505D75F5067796BB4C1524E0E2467B36D11B2D4D6192CF5F2DDD0FF0F8265DD99CBD065A95DBA748979796BB870D9AD5BB7A867489B2B58FE7BC90741CFE9E32F438365B8F73B439FCC5A36F5497CE4F7C9EFD57F235DDA2B8225000068F660691DBBA406A32FBCF042420728322094BDFFD11E939689C1528E6D94B0274B5B5BDED6D29A89D4414C429B2C91BDA6C33575DE27814DCEF81AE9A43BCEF2FD93BE6FFD7E39D6517EBF7EBDCC58469A410D174AE5A43C3A00D7778CA5FCDBF4B25839C18F044DE7D96B0996F52F8BD527F47186C4584EC813E97DA97449918682E553E5EB1A0C96FD27F9AD194E6BD6B24BAF40F02B2E2E6EB24B8FC82546060C1810345B992EED15C1120000A444B0946388E44C8C1B366C48C8E0E4A38F3EB26601D6AC59933603AAA60E96F76FBD3F705911097F57E45C11F4BCF3B21DCEE327E56CB112D89CD7B094C72FF9FB2581FB1222F56CE2A9E79E6A2D7F9520AA2F3FD2C23EC652DF9713023534DB195A6419AD5E6A9B3F393F68465582A4DCDE38F8C63A9741215846BF2C5642A1ECE489F51222A1EF6BECF533131D2CFB4D5A12B414564EEA134BB01C5CF6A269E41E3E0672F8F0E18D0E97122A478D1A15F89D72ADDD746AAF08960000202582A5983E7DBAB51C4FAE33D99476EEDC699D0823DD969425F23A9672B21D1DCAE458CBDF77FA7D60F62FD27BA2990594E017CBEB63099652F4196A9D27EC719E4C285125538365B870998865B6A9162C9F5BB631E8B97FBEF076BDC1B272F516EBB223424268F1C425567BE5BC8EA8CC5CC6BB2C56DEE79CA964092CC11200008265234D9E3CD9ECD4A993F9C1071F34C9EFDBB871A3152A478F1E9D7603AA44064B0AC13211E1B2A9436A22826543AF0B0D96CF541C0EA4231F7F2D70FFAEA9AF5AED554E8E1174CCA59CD047CEEA1A0D799D2CD1771E5329251DDB2B8225000048A960A9672EF3F2F2CC7FFFFBDF8D3AA18F0CD8BC5EAF35F84B47044B8265323576F96AAA2D7F0D0D8C53E7BD1DF6B9CFBF3A600E7C64A9351329AF9BF8DCE1E5A79B77EEB71E7B7FD39EA06331777F5E1358F6DB7DD894A070A903A65C7B72C99225D66CA45E262BCB5DB76DDB6656555599A5A5A5D6F27FE7FB64F96BBAB657044B00009072C152C831975DBB76B5CEE2BA6AD5AA98DEBB62C50AEB782F39F1453A1FA344B024583657B88C75C631954ED41329583E5DB92EE2F3727D4B798D94D0F7C9352CAD1D5E0BDE09BC46CAE819CBCD11D3ABACFBABDF7EC75AC6EF0C89B196746FAF08960000202583A53663C60C6BC0267BF6EFBBEF3EF395575E313FF9E413B3A6A6C67AFEEBAFBF3677ECD861CD003CF8E08366FBF6EDAD019AECF54FF7B329122C0996E9B02C365597BF3607DD5EC51A2833A1BD2258020080940E965A7575B53976EC58B367CF9E758E4792E5AE32B3294BCF64A63353102C0996A91E2E9F7CF249EB7583060D2201B9BCBD2258020080B408966E44B02458A6C2B2D848CB5BF5D95F099520580200008225C19242B08C79E692E5AF20580200008225C19242B08C3B5C122A41B0040000044B822585601977B8BCF4D24B099520580200008225C19242B08C8F1C5329DF7D39010D40B0040000044B8225856019974D9B36112C41B0040000044B82258560D938044B102C010000C19260492158122C41B0040000044B8225856049B004C1120000102C41B02458122C0182250000044B102C0996044B80600900000896044B0AC1926009822500002058122C29044B8225089600008060098225C1926009102C01002058826049B0245802044B000040B02458520896044B102C010000C19260492158122C41B0040000044B102C0996044B8060090000C112044B8225C11220580200008225C19242B0245882600900000896044B0AC13211C1B262E52673C4F42ABBBC6695F9AF55078AF3B1BEA53EB3A8D41FF43BE4B1818F2C0DBC2E5CD1EF7D70D6CA7AFF3D2BDEDD6EBD6EE7DEAFF87008960000806089508B2B1613EA089629192C6B0E1C0CFB9C04BCFE939634F83BE4758FBDF44E54AF1B3AEDD5A0C724400E9EBCCC2ACE007AD7D4576BEF97F9AC9F41B0040000044B280B972D34A76E9E4AB06BE6327BD36CB3B2B2920DB281A5B095ABB758816EC99B9BA30A8C6F6DFC8FB9E0F58FEBCC52CE7CF93DEBF9F59B775BB7231F7FADCEFBBFFDF6DBC0EFF9E70B6F5BF73FDCBAD7FA79F11B9B825E03822500002058BADAC6EA8DE6CBFE970997CD1C2A2B2A2BCC0D1B36B8721BECDEBDBB1524EB2B1D3A74300F1C386885BA6897A4EA607920C2CC67A4194B09AD258FBD66153D3B59A45EA3672D6569AE5E8E2B3F1797F9694808960000806089EAEA6AD3E7F3594B3129C92F3253E9D65029962D5BD660B09C3D7B7660E650CF34F69FE437EF7BEAF57A03E36CDFFAC0FDC1FF0C5ED63AEDC5B56183A55E822B817190FD9ED019CF221536CBFEFD268D07C1120000102C01A48AAE5DBB460C95050505E6538BDFB102608D3D6B39755EEDD254098EF2F3FB9BF634182CFFBDE483A0E7F4F197E18EB10C7D7FB8E7E4F84B102C010000C112401ACC5A8E7A648E15E4F67D511308753A580A39DE511E7BE05F6FC4142C9F2A5FD760B0945951E719689D339EF7CE5CC10747B0040000044B00A924DCB19685E3CBCD810F2FA913F89CC152CC78F9DD3A3397A1C1B2DFA42541C1504EEA43B004C11200008225800C9DB5340CAF15DE463D32376CE00B0D96424ED453DF8CE573CB36063DA7CFF41A2958CA1968F549822484164F3C1C70E5ECB09FECFA920F8D60090000089600524D8F1E3D42CE047B206CB0D4A1B03EF51D2319FABAD060F94CC5E140AA2F45A2AF63293EFFEA8039EFD50FADC70898044B000040B0049042E40CB93A583EF7DC731183E023CFBF1555600C37B3A983E1C047965A3391F2BA89CFAD093CB779E7FEC0B25AE7B198BB3FAF09BAB6A5044A799FDC07C1120000102C01A4107DAC65B8D9CA5867229FAE5C17F179E7753143DF27D7B014D317BC13788D94D133965BD7B194FB124EE577481005C1120000102C013413B986EAB871E3CC9E3D7B9A797979A661188119CBDCDC5C6B69EC983163ACD701044B000040B00410306BD62CB34B972E112F3112AE74EEDCD99C366D1A9507822500002058026EB67EFD7AB36BD7AE3105CAD0D2B1634773EDDAB5542608960000806009B8CDF4E9D38396BAEAE5AEF7DE7BAFE9F3F9CC2D5BB698FBF7D71EAFF8D5575F99DBB66D33ABAAAAACA5B2F9F9F941EF93DFC3EC2508960000806009B8C8ECD9B3EB04CA9933679ABB76ED8AEAFDFBF6EDB35E2FEF73FE9E871F7E98CA05C1120000102C0137CC543AC3607171B1353B190F79DF800103827E1F33972058020000822590C1E4984AE7F2D7E1C3870796BBC64B96C98E1A352A6859EC9A356BA86C102C010000C112C844CE33BFCA4C656343A5335C3A672EE5843E00C1120000102C810C239714711E5319EFF2D748E4F7398FB964492C0896000080600964F06CA59C7827D1E195594B102C010000C112C820D5D5D541B3957BF6EC49C8DF91B3C53A2F4522C77402044B000040B00432805C7B5287BD3163C664CCDF02C1120000102C012449CF9E3D03616FC9922509FD5B55555581BFD5BD7B772A1F044B000040B00432415E5E5E20EC35F5497B426DDBB62DF0B7BC5E2F950F8225000020580299C079EDCAA6BAC4482472E911FDB7A400044B000040B0043240B2831EC112044B000040B00498B164C612044B000040B0047018C75882600900000896001A85B3C282600900000896001A85EB5882600900000896001AA5BABA3A10F6727373CD3D7BF624E4EFECDBB7CFCCCFCF0FFCADF5EBD753F9205802000082259029BA74E912087C3367CE4CC8DF98356B56E06F74ECD8914A07C1120000102C814CE20C7D326BD9D427F191DF27BF57FF8D69D3A651E92058020000822590693A77EE1C087EC5C5C54D76E911B9C4C880010382662B0F1C3840858360090000089640A691631E9DD7B41C3E7C78A3C3A584CA51A346057EA7FCFE356BD650D92058020000822590A9A64F9F1E08817AE632DE65B1F23EE74C254B6041B0040000044BC025264F9E1C1406E5D84839A18F9CD5351AF23A3966D3794CA594D1A34753B920580200008225E0D6994B1D30E5DA934B962CB16623F5325959EEBA6DDB36B3AAAACA2C2D2D350B0A0A82DE27CB5F25AC02044B000040B0045C468EB9745E86249E2227EAE1984A102C010000C11270B9193366C41C302550CA2C25677F05C1120000102C01045457579B63C78E357BF6EC59E7F849AFD76B76EFDEDD5A2A2B339D00C1120000102C0100044B000040B00400102C010000C1120000822500006E0A963535358C7800000973F0E0418225000099EC88238E78F7F5D75FFF8A610F002051DE7FFFFDFF1E75D4511FD1EB020090B94A2EBCF0C2F719F6000012E5D24B2F7D57F537F7D2E5020090B98E5765E5CF7EF6B355555555DB65B91200008D25FDC9DAB56B3FF9F5AF7FBD46F533EBECFE0600006478B82CB13B7E9342A1345CE41A90D40385527F39E288233E54B70F102A01000050AFACACACE355C87A4095831E8FE72B757BBB1BFEBFED6009000000008857CB962D8F360CA3AF0A585B2564D9658F7AEA08822500000000A0A150D54E95771C815297675C5407044B0000000088555656D6B92A50CD0F132875E94FB00400000000846518469E1C47594FA8945240B00400000000D417A66409ECC79182A5C7E3B99A600900000000A8574141C1499196C3CA1962099600000000806883D50C550E3882658DCBFEFF099600000000102FFB243E9FCAD257C330CAED60B99260090000000068504949C9912A542D53E576FD980A98EAC79CE9044B00000000408354882C9460A9EE1EE17CBC65CB9647132C0100000000F5722C81FD85DBEB82600900000000310AB70496600900000000885AA425B0044B00000000408358024BB00400000080B8B104966009000000008DC21258822500000000C48D25B0044B00000000881B4B60099600000000D0282C8125580200000040DC58024BB00400000080B8B104966009000000008DC21258822500000000C48D25B0044B00000000881B4B60099600000000D0282C8125580200000040DC58024BB00400000080B8B104966009000000008DC21258822500000000C48D25B0044B000000348112B3E4E899EB673E3BEFB579DF2EAE586C969797539258A4CE172E59B87BB17F711E5B6392B77D96C0122C41BF40BF000040D390C1C382650BCCA99BA79AE3F78EA7344399BC75B2B968C9A2CF2B2A2ADAB145264FE812D8BEA53EB3B0D4B7BC7082EFA948A56F99BF8DF5BA09BE87EAFBDD85E37D57C9EBFA942EFB11C112F40B14FA050040C6933DD20C1E9ABF4CD932E5407979F93AB6C8E408B704D60E960DCE5ECAEB5479DEF99804C8BE65BEA5529C01B46FA97F817DFF4B553E2358827E8142BF0000C848B2E4860E3C358A1A401C648B4CBC484B60AD6039BEE2E2C289FED6A1B39445137CDDE4F9E28915E7C96DD184CA19E17EEFE180EABF43EE178DAB38A7F6F5FE56CED7102C41BF40A15F00006414399E83CE3B6506100CD49320D2596075B02C29997D6C7DEF0F9DB12C9E50715D51A97FB6147B76727F51A96F6F60D96C59E52CEB7E6016D3B7956009FA050AFD0200C095038829DBC79A152B869A2BCB075945EECB6374FC0C20D2497D6781B542DF84CA7C4778F4072F6BADEC1B2E58964CF71F673FBE4D05CAAA70C7651696FA76A8E0393293EA926049BF40BF40BF0000404C038829DB1F34572F1A68BEFDD280A0228FC97374FE0C20D241436781AD1B2C2B0DE773FAF8CB70C75886BE3FCC739FC9F197044BD02F50E8170000AE1D40CC7B6B449DC1832EF3DFBA9BCE9F01445A88B40436EA6059E6EFDC60B02CAD5C6BCD50863993AC0A96930996A05FA0D02F00005C3B80585E3938E200429EA3F3670091EAEA5B021B3958FAD6075D6264A2BF35C1926049BF40BF40BF0000409C0388958BEF88388090E7E8FC1940A4B28696C0460A9685657E8FF3397DA6D748C1B2A8D47FBDBE6EA584501524AB03CFC9D961C72DFB31C112F40B14FA050000030806100C20D250434B60C305CB065F17122C8B26F83BE8E7F4A548F4752CE57ECF49FEE3D5CF6DADC7322460122CE917E817E8170000886D00513E28F200423D47E7CF00225545B304362458F60FF79C04C3A252DF2A6B26D25AD6EA1FAE9F2B9EB4F44C79AC5F99FF7CE7B198B73DFCCAC9CE6B5B4AA094F7C9FD340C91F32548365056B2C5D12FD02FD02F00001840442CCB960D89388090E7E8FC1940A4A26897C03A8365515965C7C8BF6FF6B1F66CA559E77DA5FED972BFB0B4B2B77E8D7526D8D2CAA9D6752CD5CF124EE57748104DC36079B92A07EB0B962ABCB766ABA35FA05FA05F0000308088586654DF67AE7AB9EEB227794C9EA3F36700918AA25D028BA8C3E5C27A82E5F2962D5B1E4D2DD12FD02FD02F00001840D4DFB9AD18566700218FD1F133804845B12C8145D4C1F2F248C1D2308C36D410FD02FD02FD0200800144BD65C29EF1E69257EFAA338090C7E4393A7F0610A924D625B088295C863BD67225B395F40BF40BF40B00000610F5766A53B63FD8E0B134F21A06000C2052054B60131A2CEB1C6BC9B195F40BF40BF40B0000441C40C81EE739EFDD63AE593830E2E04117798DBC96BDD40C209A1B4B609312DCE7325B49BF40BF40BF00004083038886F646B3979A01442A62096CD282E5D58E632B5B5123F40BF40BF40B0000841D4044B337BABEBDD40C06184034C2498D083C2C814D92ECECEC45122C99ADA45FA05FA05F406AF585009052038878070FBA30186000112799FD32EDDB98B00436B99FD30F7FF8436BC692AAA05FA05FA05F40EAF48500907203080A03886670BD2AFB541967DF467D421896C036CFE764074B4EDC43BF40A15F400AF48500C00082C200E27047AA3B50D94BFB69B41D2A4B60D3E37302FD02857E01B4B100184050184024AB236DE8F1202C814D8FCF09F40B14FA05D0C60260004161009128AD1AE830F5F3618F3361096C7A7C4EA05FA0D02F803616480BB9B9B967783C9EDE1D3A7498979797B7C9EBF57E6D9F0AFFBFEAFE16FB9A6BFDE575D4160308061029D79136D45146DC5BCB12D8F4F89C40BF40A15F006D2C523743A9B1D4B3AA6C54E50B3B43D5A8F2B1AB329461186DBA75EBB6B27BF7EE9F959696EE5DB16285B96DDB36B3A6A6C61472BB6BD72E73F9F2E55BC78E1DFB8E0A9E9FA8CAF1ABF7E5B12931806000D1ACAE8F71EF6B9DD7B304363D3E27D02F50E817401B8BD4CB50AA94DB01D28CB264668652FF6367AB30F97A6161E197AB57AF360F1D3A64464B85CC759D3B77DEA07EC72B323065D36200C100A2D93AD2D671BCEF0BE95059029B1E9F135548BF40A15F006D2C522B43A9B230863019AE644E862A2828C8EFD4A9D3D7F3E6CDFB36964019EAA9A79E7A43A5EE9DCC5E3280600091161D69D0FBAFBDF6DA292C814DFDCFA9054BB6E81728F40BA08D454AF0783C39B2D2CB1912737373CD7BEFBDD7F4F97CE6962D5BCCFDFBF75B39E9ABAFBEB2568156555599E3C68D33F3F3F343C3E517699FA1EEBCF3CE82DB6EBBEDC0860D1BCCA6F0E1871F7E9C9797F789AA982E0C20E8BC1940245C43272788CAF7BFFFFDBFDF72CB2DDF9E75D6595DE92652F7736AC2DF03FA05FA05D0C6D2C6A271A1B2B50A83079D8172E6CC99D62183D1D8B76F9FF57A799F3360A66D86EAD7AF5F4FE59B682B205A3B77EEDC61874BD7CE5C3280600091C48EB44996EEA87079131D6AEA7F4E2DD8AB4EBF40A15F006D2C9A3B54E63843657171B1353B190F79DF80010342C3657A65A86EDDBAFDA26BD7AEDF34D54C65B8994B7B59ECF90C20280C209A5CE8C90664F96A8716B12F630D7D1F2731E07302FD02FD026863696311817D4C6560F9EBF0E1C303CB5DE325CB64478D1A15BA2C367D3254BF7EFD3E9A3F7FBE9948D3A74FAF908351194050184024A4236DEDE810A7A962DAB7D176A891DE4787CAE704FA05FA05D0C6D2C6220CFBCCAF8199CAC6864A67B80C99B94C8F0C3562C488DBFAF7EFFFDD37DF7C63265AFBF6EDD7B971492C0308061049EA485BD87B594D4789A6437576A4BAB4773CCF71267C4EA05FA05F006D2C6D2C8243651BE73195F12E7FAD6F59ACF398CBB4C85083060DDA2E97144986575F7D75A91B672D194030804880481D5CB88EB1BE0E35DCEB1F0DF37A8E33E17302FD02FD026863696371385806662BE5C43B89306BD6ACF499B57CFAE9A7AFE8DDBBF7778DB9AC48ACF2F2F236C97A6406101406108DEE485BC5D04186EB50A3ED48433B549602F139817E817E01B4B170ADDCDCDC33F4097B645671CF9E3D09C94D72B6D8904B91A46E862A2B2B7BFAD1471F3593E99E7BEE91632DFB67CA9E0A55FEC000820144A2B7A1383AB4863AD4583B52E7DFFFD46D7B6BF99C40BF40BF00DA58DA58B649CDE3F1F4D6616FCC983109CD4E729D4B47B04CDD0C3562C4882D2B56AC486AB0F4F97CAFAA4A999F091B9D63CD73B9DAC0AE6600C1002251DB5048471A6D4716A9433D32CE8E34742FB16B3A543E27D02FD02F80369636966DD2F1FCB3FA354B962C496876AAAAAA7206CBD4CD507DFAF439B063C78EA4064BF5F76429ECD64CDAE81C6561B8BD1B0C20184034761B6A11FF711DE13AD40F1AD19136F6DF93D1DF753E27D02FD02F80361699BF4DAA9F37EAE79AFAA43DA1B66DDBE6FC77A46E86EAD0A1C377353535490D965F7FFDF56E55293519BAD105F66E38373E06100C201AB90D3576AF68B80EB5311D696887DACA851D0C9F13E817E817401B4B1BEBD26D52AE2DA91F6BAA4B8CD477E911C7BFA126A52BAD39C8DFCDE48DCEB97743A6CF1940308088771B6AD3A64D85DDE98D6BE49F3A32CCDED90FECC71B639CFDBB4E726307A34B565656C529A79CC2E784B4E817645BB83CFBF2A85FDFED996EE6A9E79E1AD3EFBF75D4AD0DBEE6CF857FB6EE777AA293396EF7B8C0E31DA6752058F2BDA12F44AAB7E58192ACECA44BCA565A41418199EC194BF5F70EC6F261654249F600A2D70BBDACC6F2A15D0F993DE6F430AFF45E690D0C2E6A75917955EE554D3E4049B70144BA6D3FD75E7BAD79ECB1C79A8DD81B5ADF5EDA582E1C1D712FADDBBED3F5153E274AB4A53983E579D79E17F639699FCFBEFC6CABE8BEE3C4D34FB48ADC9792FB48AEF53BEED9708FF59EBE2FF7B51E77BEFE17D7FC22F0FA2E4F75314F39FB943AFF06EF246FE07EFBA9ED03F7A59FA05FA0D01752D2A5306369EBD3A7CF37C93EC672E7CE9D3B32F8184B5D567A3C9ED62D5BB63C5A5E97EC60298D64DB7BDB5AC1528738FDF80DFD6F08FC3CFAA3D1D6E0423A7E09783FBFF2E7E665ED2E0B1A2048677FCC71C704DE9309038874DC86EC8EEB8B168939AE249E0ED5EDC758F23921ADFA85D036F9F81F1D1FF179E93B86BD3DCCBCE0FA0BEA04CBCE333A9BA79D775A9DDFE76CCBE5E7D6435B077E3EEA98A3027DCF88F74658BF475E73EE1FCEB5FA03B93FF4CDA181F70E7E7DB075DBEE8176CC58F2BDA18D454A6E93EAF6438EB10C317AF4E83DC93E2B6C5555D5864C3B2B6C3D0D608B640F20BACEEA6AF69EDF3BD041FFA5F82F81FBBFB9F937610710F29CCC6CEAD7E9BDD1121E25709E7CC6C90C209A791B0ADD2BDA888EF4D116E1CF84174B879AB267C22B2AADBCA1B0AC72965526F89E92D2B7CCDF4697A0C74A7DA62AFF71BE5F1E2B2CF52DD7AFD3A5FBD029A62E1D7A0E92F799A5CFAD7DBEBECFE9AABFB62F94D7F5295DF6233EA7C488F479398BFEACD5FD87EAFB5D85E37D5745F979A55DBF103A2329DBD2D1DF3BBADED74980FCDEF1DFAB132C7F70CA0FEAF42563778E356F7FE9F6C00E46F9FD57E75F6DDD97D74A5F122EDC3A77389E70EA0981D536B273527662B214D6D58378FA42DAE5266B9713B14D7256D8301E7DF4D105C9BE8EE5030F3CB02253AE63E9F890971B86D126420398B401840E69326BD8C2313B29F77BCEED690542B95FB8B0B04E072F03007D7FC8CA21D66DC1F40273D487A3ACFB233F18C900A219B7A138F68E36746DAE682F1C1DEAF216297CEDAE92E9FEE3227574AABC1B6587787B439F93FDFB9E77BE463ABEBE65BEA5523A0EFF57E52F2FB9F6CBDAD7F917D89DA8FCFC199F53930F606E8FE675F57D5EC13B1BEAFDBCD2AE5F082DFD7CFDACEDE8FB277D3F68454B68911D8A524283E54F7FFDD3B03B29E5774A180DED53A4EF39EE84E3C2BE5E76380E7C65A0755FFE5DFAF1ACB1591C63E9DE60495F48BBDCE4ED7222B649AE6319C6EBAFBF9ED5A74F1FF3D0A143490B96050505DB54A59C9D210D617D7BD4923E8018B36D8C152EA5833EF39233AD80281DBAEEB0A5DCBDEE6EABE19499CD07763C10088712FCA433D783831611662C194034CF3614E35ED2682FF81C6B87AA9720B549A7EF6951A9FF7AE9988A27545C17558738BEE2E2C289FED6417B58873CB87196AF7AA2F57B26569C27B745132A67D409B6252547EADFD3EEF6095297FBCEBBA46597DAD7FB5B395FC3E7D4440398309F970C408A26F8BAC5F2791596FAEFB0B6977115E744F8BCD2B25F88747CA5EC6094FBF52D87D5F7254C4AD127F291F785865279EC9CABCFA9B3C35102E9C5AD2F0EDA012AC7DCCB6B8C32236C9FE2F643245C1A2CE90B699713D62E27629BCCCDCD3D43BDC63A6F8CBA6FEED9B32721B969DFBE7D667E7EBE3358A676861A3162C4D7AB57AF4E4AA85CB366CD1E5521AFBAED4B96CC01848449E9CC25344A902BAE2C0ECC2E4A91E54F7AF650CF404A232A3388BA53D7B394326329CFCBB1360C20524EA4BDB5D176A4B176A8FAEFA555475A5232FB587BAF68544B69748728EF8B654FAB84561560674BB1F7AAEE2F2AF5EDBD216FD070796DC1F0994B034B726BDFBB95CFA9E906304DF5790596679555CE0AF379A56DBF10BA0C560E77D06DF02D77DF12F41A3984E1C21B2EB44AB893F7B4BAA395795DAFEB02AB5B62ED17E4D8FE92774AEAAC9471F60B7AF58D3E3910FD02E80B699793D12EC74A2E3DA203DFCC993313929D66CD9AE50C95AFA4FC06307DFAF43103060C48CAAC65F7EEDD3F561F421EC132B17BA3A5149517598308BDD7B9BE10E7ECE02560EA8181CC56CAC91B4297B732804819B2E72E74294E8716B15F9B2B5C87DA3E86BDC2A9DDC195FAEF08EC212DAB7C5FDD7FB8DE8E6E4265BEA3D3F3072FC7A9EC1BAE43D44B70D563DB544758E5DC4BDB71D853BE5F5E7AEDE7BDC72EDAAB3ACC917C4E4DFBF936F5E7A5DF5F58EADBE1F8BCD2BA5F70B6DDCEF67CD0F241412754D3E1538AF38CE20D1D63A957AC84EB53E498FABB56DDD5E02112D217E8552D126EA59FA86FA92EFD02E80B6997532058B6D1A14F662D9BFA243EF2FBE4F73AAEA1991E196AC89021FBE7CF9F9FD050F9FCF3CF6F97D9CA189739102C1B71BCA5F374F2F5054B39D64696CECAB18E32D3A95F2F3396E15ECF0022E53A54E7490C9C1D632C177C8EF4BEB4BDF07351596547E9B8A4B3B23B3AEBB804E9F0E4E77E65FEF31BEE102B8DE0905A7BDC48B8634342DF1FFA39DD36E6C5EFBA8F7EEE1D3EA7440E609AECF392E73E93E37C32A55F6811E1046EB203519EFBE59F7E19B4FC55074C7D9928BD43506629C3B5F391765686165905A357CAE44FCE0FDA21AA67546F1C7C639DB398D32F80BE907639D1ED723C54B6F1EBE0575C5CDC64971E914B8CC8C49F73B6326D32D4DCB973FFDCBD7BF7EF366CD8909050B969D3A643797979BB55D23EDF8D5FB2640D20F4F193A79F7FBA15D89C7B9CE5F14BFE7E49E0BE84483D9B2817BE96E5AF1244F5E547F49E6D7D5F4E08C4002265852E053AC2DECB1AEB69D343DFD72A5D3B52E9C86A97BF2E38C1D151050E7897E334ECC7C6C7D42196F93B37D8219656AE759E81D6B9A7F62FDE0107F89C92388069E4E7A5063093D3BD5F9013AFC909D3E4B8FA48AF919D85D20EEB338AEB223B1AF5D9BCDBDCD326A6101BA95F90A24F30E73CDEDE792E80641782257D216D2CED722382E5D9AA7CAA03E0F0E1C31B1D2E25548E1A35CA192ABF48BB0CF5F8E38F3F2A27F2D9B56B5793864AF97D9D3A75DAE3C625B0CDB567DAB9C7B9A1D748F08BE5F50C20D2A6436D8ABDBF6979C63B396B5C51A96F55988E2EE84C6A4565953D42672EC32CE1591F746AF489FED68DE9103B0C7DF2453EA7440E609AF6F3CA8460492158BA3C5CD2C6D22E279CC7E3C9D127F2D13397F12E8B95F785CC549A699BA19E7CF2C939122E9B6AE672D3A64D66972E5D3E53153EC8CD5F3206100C20D2AC434DCB0B3EEB13F5C812D8081D5D9D5374CB0906EAEB100BCBFC9EA03DADF619EA22758872065A7D9220E93C5507581D784ECE6A376ED98FDDFE3925720093A0CF8B7E817E01F4857041BBDC182A001638C3A51C1B2927F491B3BA467BF65739518FF3984A29699FA1A64E9D3A5185C1EFE498CBC69CD067C18205FFEDD0A1C36752D16EFF923180600091448D5DB293914B7E9C9D59B41D6283AF0BE9108B26F83BE8E7F429D4F5F5B7E47ECF49FEE3D5CF6DE5B19F9D7FA597CFA969073089FCBC123190A15FA05F007D21ED726AB5CB8D253397AAEC730643098A729DCB254B9658B3917A99AC2C77DDB66D9B59555565969696CAE5188302A52C7FCD980C3565CA942B860C19B25BA662DF7AEBAD9802E5DAB56B650AF7B3F6EDDBAF74EB31950C201840A448871AEB5ED68C3D39416D47E71B1C658718F6E2C3D2A1C9125B6B0FAAB51CC73F5C3F573C69E9997A59ADF31892DB1E7EE564E735B9A42394F7C97D3EA7261BC024EBF3A25FA05F007D2132B85D6E0A72CCA5F332247196573232433DF4D04377297B6579ECA38F3E6AAE5CB9D2DCB16387595353638548B9956328257CCA746FAF5EBD6ABA76EDFAAE246C379EFD95010403881412EB129E8C5EF213CB1ED4704B6935E77531EBBCAFD43F5BEE179656F6D6AFB1CE60575A39D5BAFE96FA593A55F91DD281F23935CDE79AE4CF8B7E817E01F485C8D076B98903663B3B601E8C2550BA22433DF1C413973EF0C0034F0C1D3A7463B76EDDBEC8CBCBFBD69EDE3DD4B973E72F54F05CADCA2849E97CA51840308048BB0EF57255BE68C1059FF99C40BF40BF00DA58DA5834199595CE5001B3AFCA48CFAAF2B12A358E20B95595F9AAF42743810104038874D0CAEE285BD5F3FCA774A47C4EA05FA05F006D2C6D2C12CF0E9326AB3BC1008201443A8AB4B796253F7C4EA05FA05F2058D2C6D2C622493C1ECFD57A79AC61181CC70B06100C2032A243A523E57302FD028560491B4B1B8BE406CBB98EA5B02BA9113080600091EE1DEA383A523E27D02F50E81768636963913C2A485E1E7A321F1534D9FEC000820144DA926517FA5217E07302FD02FD02FD026D2C909C60393FCC99605772AC25184030804867275105E9F13949A74335D02F50E817401B8BB40F959747BAF48861189C340A0C2018400009EF88D85EE91728F40BA08D45FA6F6B0BEBB97EE5726A080C201840000C7A40BF40BF00DA58A0BEED2CE26C25C75A820104030880410FE817E817401B0B44B39DCDAF2F54728658308060000130E801FD02FD0268638198E4E7E7FF406D7B5F52136000C1000260D003FA05FA05D0C60271C9CACA3A5E6D7B5F50136000C1000260D003FA05FA05D0C60271B9E5965BFE9F6118FBA909308060000130E801FD02FD02686381B8E4E6E69EA0B6BDCFA909308060000130E801FD02FD02686381B86465659DA8B6BDCFA809308060000130E801FD02FD02686381B81414149CE4F178F651136000C1000260D003FA05FA05D0C60271F17ABD27AB6D6F2F350106100C2000063DA05FA05F006D2C1097ACACAC1FAA6D6F0F350106100C2000063DA05FA05F006D2C1097F6EDDB9FA2B6BDDDD404184030800018F4807E817E01B4B1405C0CC3F81FB5ED7D4A4D800104030880410FE817E817401B0BC4252B2BEB476ADBDB454D800104030880410F1A6D71C562DAE4D42835AA5F38C816491B0B248B6118A7A96D6F27350106100C2000063D68B4054B17EC98BA792AED723397C73E7CEC69D52FAC638BA48D0592252B2BEB74B5EDEDA026C000820104C0A0078D56EE2BFFFBCBFE973F537DC3D7B4CFCDB3A3D1EA132ACA37575454B4638BA48D0592252F2FEFC76ADBDB4E4D800104030880410F9A846A8F5A979797AF949514B24C9F92D42275BE8E3E8136965A40336C773F51651B350106100C2000063D00401B0BC4252B2BEBA76ADBFB849A806B6567675F4F030C30E80100DA58207EB9B9B967A86D6F2B35013737BEAFA8F21D350130E80100DA5820EEEDEE4C55B6501370EB17A0A534BE520CC3F803350230E80100DA58207659595967A96D6F333501B736BC7E47B02CA74600063D00401B0BC4CEEBF5FE4C6D7B9BA809B88E0A92AD74A864D61260D00300B4B140A3B6BBB355F9989A801B37FE574283A52AF3A91980410F00D0C602B1C9CACAFAB9DAF63EA226E0B606B75D98506915AFD77B09350430E80100DA58207A6A0C7D8EDAF6AAA909B8ADC17D2752B0340C6316350430E80100DA58207A595959E7AA6D6F233501D750C1B14DA450A98BC7E3F935350530E80100DA58203A5EAFF7976ADBDB404DC03554685CD350B054E5596A0A60D00300B4B140D463ECF3D4B6F7013501D7320CE37FD497E0536A0260D00300B4B1407CB2B2B27EA5C6D5EBA909B8567E7EFEA9AA01FE0F350130E80100DA58203E2A549EAFB6BD75D4045C2B2F2FEFC7EA4BB09D9A0018F400006D2C101F8FC77381DAF6DEA726E05A5959593F555F824FA80980410F00D0C602718FA92F340CE33D6A026E6E7CCF54650B350130E80100DA58203E2A545EA4B6BD77A909B896D7EBFD99FA126CA22600063D00401B0BC4472ED727D78AA726E05A5959593F575F828FA80980410F00D0C602F1C9CDCDFD5F152ED75213702DF505F8856A803FA42600063D00401B0BC4C7308C8BD5B6F7363501D7F27ABDBF545F820DD404C0A00700686381F8783C9EDFA86DEF2D6A02AEC5C55C01063D00401B0B347ABBBB549537A909B816D7DC0118F400006D2CD0E831F56FD5B6B79A9A806B716A6480410F00D0C6028DE3F57A2F53DBDE2A6A02AEC519AC00063D00401B0B347ABBBB5C9595D4045C8B038D01063D00401B0B347A4C7D85DAF6DEA026E0E6C697038D01063D00401B0B3482D7EBBD526D7BAF531370F39780F5E000831E00A08D051AB7DD5DA5CA0A6A02AEC5B43DC0A00700686381468FA9AF56DBDE726A026EFF12B0770560D00300B4B1409C0CC3F89DDAF65EA326E0E6C6F71A55AAA80980410F00D0C6028CA981B81886F107F52578859A0018F400006D2C109FECECECDFAB6DEF556A026EFE12FC4985CBA5D404C0A00700686381B8B7BB3FAAB28C9A809BBF042D55F1531300831E00A08D05E2C3640D5C4F7D01FE4F35C095D404C0A00700686381B8C7D4D7AA6D6F093501D7CACECEBE5E7D11CAA90980410F00D0C602716F77AC0284BB793C9E1BD497E0656A0248EEA0A7A8B4F286C2B2CA595699E07B4A4ADF327F1B5D821E2BF599AAFCC7F93BE4B1C252DF72FDBA7045BF57DD7FA8BE7F4FE178DF55F2BA3EA5CB7EC4A703806009C42E3B3BFB3AC3307CD4045C4B7D015AA906782135012477D05332DD7F5CB8E7EC10F96E43BFC30E96B747F33A559E773E2601B26F996FA994E0F0EA5F60DFFF5295CFF8A400102C81A8C7D41C5E0677F37ABD7FF3783C2F511340F30F7A8A4AFDD74BC02B9E50715D54C1727CC5C58513FDAD4367298B26F8BA59BF6762C579725B34A17246E8FB4B4A4A8E3C1C50FD77587F7F5CC539B5AFF7B772BE060008964083DBDD9F55A9A026E05A2A54B6565F82F9D404D0BC839E9292D9C7DAB38B512D49D5C152DED7D0EB9C3396125A55809D2DC59E9DDC5F54EADB1B58365B56392BB024B7F6BD5BF9C400102C81FA71DE12D0F8E6E4DCA2CA0BD404D0BC831E3D731898692CAB7C5FDD7FB8DEC038A132DF111EFDC1CB5A2BFB860B967A09AE7A6C9B0A9455E18ECB2C2CF5ED50C173249F14008225101D152AFFA2B6BDC5D404DCFC2568E3F178E6521340F30D7A8ACA2A3B4A0094D06707C6FE56F853C1517EEE57E63FBFE16059690487D4DAE32FC31D6319FAFE30CF7D26C75FF24901205802D1E18498E04BE0F1B4555F8239D404D03C831E0984B5CB5F179CE0087CFD03A17382BF95FDD8F898826599BF7383C1B2B472ADF30CB441339E65BEC97C520008964074BC5EEF5FD5B87A1135013737BEED5479969A00923FE891B3AF1695FA5685098CFD9D8F159555F6089DB90CB314767DD0254626FA5B132C01102C81E4E04A0BE04B6018D9EA4BF00C350124F37BE7B54ED2234B60C306BE906029E4443D615E17089685657E8FF3397DA6D748C152CE40AB4F1224215405C9EAC0737276D871CB7ECC270580600944872B2D8001AEA21AE07F5113406A0C7A9CA1B03EF51D2359E77521C1B26882BF837E4E5F8A445FC752EEF79CE43F5EFDDCD67A8C800980600944B3DDDDA4CA8BD4045CCBE3F1E4AA6C39939A00522758F69DE01B1C65B0EC1FEE390986B2C4D69A89B496B5FA87EBE78A272D3D532FAB751E8B79DBC3AF9CECBCB6A5044A799FDCE7130340B0041A1C5373093FB8BEF1CD57E5496A0248A56019DD4C64B8A5B49AF3BA9875DE57EA9F2DF70B4B2B7BEBD75867822DAD9C6A5DC752FD2CE1547E8704513E3100044BA07E8661DCACC2E53C6A026EFE1274500DF0E3D404C0A00700686381B8B73BAE0D0F77F3783C1D55B87C8C9A0018F400006D2C10F798FAEF6ADB7B9E9A809B1BDFCEAA3C4A4D000C7A00803616888F61186D54B89C4B4DC0CD8D6F5755A6501300831E00A08D05E2DEEE6E55E5396A02AE651846778FC7F34F6A0260D00300B4B1407CD478BAADDAF6E6501370F397E036F52578989A0018F400006D2C101FC330FEA1C6D5FFA626E0E6C6B7972A13A90980410F00D0C602716F77ED5479969A806B1986D1C7E3F194521300831E00A08D05E2A3C6D3596A5C3D9B9A809BBF0485EA4B309E9A0018F400006D2C10F776E751E5696A026EFE1214A9F210350130E80100DA58203E1E8F27C7308C59D4045C4B7D01FAA92FC283D404C0A00700686381B8C7D486DAF6FE454DC0B554A81CA0BE0763A80980410F00D0C602716F775E559EA226E0E66039487D09EEA32600063D00401B0BC43DA6CE350C632635013737BE77AA328A9A0018F400006D2C101F152AF3D4B637839A809B1BDFBB5419494D000C7A00803616887BBBCB57E5496A02AEE5F17886198631829A0018F400006D2C10F798BABD1A533F414DC0CD8D6F892AC3A90980410F00D0C602F151A1B283DAF61EA726E0E6C6F76E5586521300831E00A08D05E2DEEE0A54994E4DC0B50CC3B8C7E3F10CA12600063D00401B0BC4478DA73BAA71F563D404DCDCF88E565F82C1D404C0A00700686381B8B7BB4EAA4CA326E0E62FC17DAADC414D000C7A00803616888F61185D3C1ECF546A026EFE128C515F8201D404C0A00700686381B8B7BBAEAA4CA126E05A2A543EA8C2653F6A0260D00300B4B140DCDB5D375526531370F397E021558AA80980410F00D0C602F1310CA3BBC7E3F9273501377F09C6AB2F4121350130E80100DA5820EEEDAE872A8F5013702D152A4B55B8EC434D000C7A00803616887B4C7D9BDAF61EA626E0E6C677A22ABDA80980410F00D0C602F1310CA3A70A9793A809B8B9F17D58F6B0501300831E00A08D05E2DEEE7AC9840D3501377F0926CB59ACA80980410F00D0C602F1F1783CBDD5B657464DC0CD5F82A97241576A0248D80067BE0C721A282BA929002058227DC9394BE4DC25D404DCDCF84E53A513350124EC3B76B92A07EB0B96AA236A4D4D0100C11269BDDDDDAECA046A026EFE124C57A5809A0012FA3D5B584FB05CDEB265CBA3A925002058227DC9E5FBE4327ED4045C4B7D019E505F84F6D40490D041CEE59182A5FA0EB6A18600806089B4DFEE8A5479889A809BBF0433D4C0368F9A0012FE5D0B77ACE54A662B01806089F4E7F1788AD5987A2C35013737BE4FA9E2A52680847FD7EA1C6BC9B1950040B0446650A1B29FEAD71FA426E0E62FC12CF525C8A12680C453DFB5B9CC560200C11219B9DDF557E5016A026EFE123CA3C2653635012425585EED38B6B215350200044B644C1F3F40F5ED63A809B8B9F17D569576D40490B4EF9C75AC25B3950040B044E650A172A00A97F753137073E33B477D09DA521348752566C9D133D7CF7C76DE6BF3BE5D5CB1D82C2F2FA724B948BD2F5CB270F762FF624EF805806009046F7777A8721F3501D79263BEB8DC01D28184CA05CB169853374F35C7EF1D4F69A63279EB6473D192459F575454B0D20100C112383CA61EA4C6D4F752137073E3FB822AB750134875325349A84C8D3265CB9403E5E5E5EBD82A01102C815A2A540E56DBDE686A026E6E7CE773C903A403598649A84B9DA282E541B64A00044B20B0DDDDA9CA286A02AEA542E54B5EAFF76FD404529D1CE347A04BA960C9C00D00C112383CA61E6218C63DD404DCFC2558C4650F9049C172CAF6B166C58AA1E6CAF2415691FBF218619060098060092470BB1BAACADDD404DCFC2558AC82E55FA8096442B09CB2FD4173F5A281E6DB2F0D082AF2983C472024580220580289E0F17886A931F5086A026E6E7C2B54F93335814C0896F3DE1A512754EA32FFADBB0984044B00044B2051DBDD70554AA809B8966118BEECECECEBA8096442B05C5E393862B094E70884044B00044B2041DB5D89844B6A026EFE122C51E1F25A6A0299102C572EBE2362B094E70884044B00044B20116419AC2C87A526E0E6C677992A7FA42640B0A4102C01102C81B8B7BBBBE5043ED404DCFC2578353B3BFBF7D404322258960F8A1C2CD5730442822500822590A0ED6EA42A77511370F397E035C3307E474D201382E5B2654322064B798E4048B00440B0041241AE6129D7B2A426E0E6C677852A575113C8846039A3FA3E73D5CB7597C3CA63F21C819060098060092468BB1BA5CA9DD404DCFC2578C3E3F15C414D201382A51578560CAB132CE531C220C11200C11248E07637DA308CC1D404DCFC2558E5F57A2FA3269009C172C29EF1E69257EFAA132CE531798E4048B00440B004124185CA7B3D1ECF206A026E6E7CDF54E5526A02E91E2CA76C7FB0C1632CE535844282250082259080EDEE3E55EEA026E0E62FC15B1E8FE737D404D23558CA4CE49CF7EE31D72C1C183154EA22AF91D7327B49B00440B0049A92611863D4987A003501D7525F80B5B9B9B9FF4B4D201D836543B394CC5E122C01102C81246D770FA8D29F9A809BBF04EF1A8671113581740C96D1CC52D6377B49402458022058024DC1E3F13CA8C6D4FDA809B8B9F17D5F7D112EA026908EC132DE50A90B019160098060093405152AC7AA31753135013737BE1FA82FC179D404D231585208960040B0448A6C770FA952444DC0CD5F828D595959E752132058520896000896407C3C1ECF38C330FA52137073E35BEDF57ACFA12640B0A4102C01102C81F8A850395E85CB426A026E6E7C3F56E56C6A02044B0AC11200C112887BBB9BA0CAEDD404DCFC25D89C9595751635018225856009806009C4C7E3F1941A86D1879A809B1BDFADB9B9B9675013205852089600089640DCDB5D990A97BDA909B8F94BB04D959F5013205852089600089640DCDBDD44557A511370F39760475656D6E9D4040896148225008225101F8FC733C9308C9ED404DCDCF8FE273F3FFF546A02044B0AC11200C112887BBB7B44951ED404DCFC25F8D4308CFFA12640B0A4102C01102C81F8783C9E7FAA3175776A026E6E7CF7646565FD909A00C19242B00440B004E2DEEE26ABD28D9A809BF7AEEC2B282838899A00C19242B00440B004E2DEEEA6A8D2959A809BBF049FE7E6E69E404D806049215802205802F1F1783C530DC3E8424DC0CD8DEF17595959C7531348052D5BB63C9A6049B004008225D270BB7B5495CED404DCFC25F8EAE69B6FFE3E3581E66618469E0C06546947B024580200C11269B6DD4D53A5133501377F09FE5B5050701C3581E6929595756EFFFEFD5FFDF0C30F77EEDEBDBBA277EFDEABD4765916BA5D122CD32F58AACFF1728FC73397AD1C00C11299CE308CC7549FD7919A809B1BDF6FBA75EB760C3581649365AFF9F9F9C3E6CC99B3FBD0A14335E661FB5E7AE9A5C57979792B2474122CD32F584AA05465BE2A0719E0012058C225DBDD74550AA809B8F94B70480DDE8FA226904C8661FCE1FEFBEFFF68EFDEBDBBCD08F6EFDFBF7ED0A041DBF4D2588265EA07CBD040A90B5B3C0082255CB0DD3DAEC6371DA809B8F94BF09DBA39829A4032C8A56DFAF6ED3BF3CD37DF8C1828431C5CBC78F1B6AE5DBBFE73D1A24504BA140D961E8FE76A59F21A1A280996000896700B152A9F507D617B6A02AE6E7C255CAAF2AD3D28FC468EBB54A5464EECA3CA97EA8BB25F2E4B22D7BC54B77B55D9ADCAA7AAFC47959DAA6C57456696B6AAB24595CDAA7CACCA47AA7CA8CA46553E50BF67BDBA7D5FDDBEA76EDF51BF6FADBA7D4BDDAE51B7AB559163EBDE50E5755596ABF29A2AAFAAF28A7ACF5275BB44DDFAD46DA5BA2D57B78BD57B17A9DB85EAF62575FBA2BA9DA76E5FB007B9CFA9DB7FABDB6755794695A755F9972A4FA932439527A51190A50BB22E5ECEE625A78A960BDCAADB7FAADB87D5ED2439DE4FDD96AAD78C57B7E3D4ED5875FBA0BA1DA36EEF57B7F7AAD78C56B7F7A8DB91EA7684BA2D51CF0D53B743D5ED10757BA7BA1DA46EEF50B703D46D7F755BAC6E8BD46DA1BABD5DDDF656B7BDD4ED6DEAB6875C6457AE872467189383C165DDBEEC0993464B4E74A36E73D5ADA16E73D44DB6BACD52B7FF50B76DD56D1B75FB77757BB3BA6DEDF57AFFA66E6F54B77F55B7376467675FAF7EE79FD5ED75EAB6A5BAFD93BAFDA3BAFDBDBABD468282BABD4ADD5E611F27F75B757BA9BAFD8DFA9D17ABDB5FABDB8BD4ED05EAF67C757B9EFADDBF54B7BF50B7E7646565FD5CDDFE4CDD9E959B9B7B86BAFD695E5EDEAF264F9E6CD6D4D41C3263B47FFFFECF1F79E411F3BEF5F711EA522858469AA10C2D72BCACDA06FE3F3951587E7EFE0FE44CD4B7DC72CBFF934B1DA9FB274A919D0E6A9B3959DDFF61FBF6ED4F51DBD5FFA8FB3F92A2DE73AAFAF93475FF74B51DFD58FDCE9FC83625DB9614F5F399B2ADC936A7EE9F6D6F7FE748916D529654DBDBE779EAFEAFEC6DF60229EAE70BED6DF9D7EA77FDAFBD7DFF468A7ACF25F676FF5B75FF32FBBB7085BA7FA514FB3B72B57ACFEFE47B23DF1F998D97EF92FD7DFA93FAF95AFB3B769DBAFF7FF2BDB3BF7BD7AB9FFF22DF47F95EAAFBADECEFE8DFA4A8D7DC24DF5DF90EABFBB7D8DFE73652D4CFB7DADFF37FC88CBEFDDDCF56F73D52EC36C150F7BD763B2127C6CA9762B71F1D64B996B429D2B6481B23A7C89762B739DDD4FDEED20E497BA4EEF79462B74FBDD5FD3E769B55A8EEF79576CC6ECB8AD5CFFDECF66D80BA3FD06EF30649513F0FB6DB426913EFB2DBC761765B395CDA4DBBFDBCDB6E4BA54D1D6597D1765B7B9FDDEE8E51F71F9062B7C763D5FD87EC367ABCBA3F41DA6D29D286AB32D16ECF1F56E51169E3ED765E2E683EC56EFBE58C8ED3ECFE60BA5D1EB7FB8927A5DF50F767DA7D88F425FF523FCFB2FB9667D4FDD9D2DF48BF63F73D73EC7E48FAA3E7EDBE699EFD9D996FF759D2772DB0FB31E9CF5EB6CB62BB9FABB0FB3CE9FBFCD20FDA7DA1F489CBA47FB4FBC92ABBCF7CCDEE3F57D87DA9F4A92BEDFE75B55DDEB4FBDDB75479DBEE8BDFB1CBBB761FFDBE2AEBEC7EFB035536D865A3DDAF57DB7DBCF4F59BEC7E7FB33D0690B1C027F6B840C6073BECB2D31E37ECB2C7103296D8638F2BF6DA638CCF64BC618F3BBE9031885D643CF2B53D369131CA017BBC72D02E87EC71CC77ECD042338EA9A59DC8A726E076479494941C29C7BCC9F19637DE78E3F76420A807817A00A8077E7AD0A7077B7AA0A70778CEC19D1ED4E9019D1EC8E9419C1EBCE9819B1EB4E9C19A1EA8E9019A1E9CE941991E90E981981E84E9C1971E78E941971E6CE98156C800ABB33DB0B206557A40A507527A10A5074F7AE0A4074C7AB0A407497A80A407477A50A407447A20A407417AF0A3073E7AC0A3073B21831C3DC0D1031B6B50A307337A20A307317AF0A2072E7AC0A2072B8E418A1EA0E881891E945883113D10D103103DF8700C3CF480C339D8D0838CEDC3870FDFB775EBD6EF620D96FBF6ED334B4B4BADC142AA86CBFB36DF270319B3F38CCEE643BB1E327F78D60FCDF3AE3DCFBCD27BA555BA3DD3CD7A3EF47DF2D82D77DF12F1E7140F96D1961A7B50F8953D48FC42EFB0B207929F39765CED71ECBCDA6517BD136B876347D627F6B6E5DCA1B5C9B153ABDA2E7AE7D606C70EAE75F6B6AB7774BDEBD8D9F5B6BD9DEB9D5E6F3A767CAD74ECFC7ADDFE8EE89D60557A4798FD5D5AA67788D9DF316BA7981D142AF4CE31F93EEA1D64F677F425BDA3CCFEEE5A3BCBECEFF35CBDD3CCFE9E5B3BCEEC40A3779E3D6DB709D64E34BB9D98610F78F4CEB4C71D3BD4A6E99D6A76B89AE2D8B9F688DEC16687B2897A479BB4597A679BB463765B66ED74B3DB376BC79BDDE6DDAB77C0D96DA1B513CE6E1F47E89D71D26EEA1D72765B6AED949362B7B1D6CE39BBDDB576D049B1DB636B479DDD465B3BEBA4DDB6DB6E6BA79DDD9E5B3BEEA48DB7C3B3B503CF6EFB033BF1A45F90A277E6D9FD85B543CFEE430CBD63CFEE5BAC9D7B767FF30FBD93CFEE87AC1D7D76DF64EDEC93227D96DEE967F763D68E3F29D2BFE91D80769F67ED04947ED0EE0BAD9D8176FF68ED10943E538ADE3168F7A5D6CE41BB7FFDADDE4968F7BBD68E42BB2FFEB5DE6168F7D1D64E43BBDFB6761C4AB1FBF3C00E44E9EBF54E44293206D03B13655C20E303D9212445C60B326E909D45328690B184EC48927185141963C84E26196FC8B8437640C918448A8C4764E7948C4D648CA2EE1F2BE31519B74891437A641CD382155868DE19CB99D246501340924907D0AFCC7F7EDF327F1B5586F72DF599AABC1BE9F545E32ACE91D7C87B02BF63BA3F70D6D0BE65BEDFDBBF635A437F5B5E5738C1F75043AF2B9CE86F1DEEF19E93FCC75BBFA3AC328B4F32762A271E5D5555B5E8BFFFFDEFB7D184CAD75E7B6D5BE7CE9DBF1C366C9879EFBA7B533A6C0D583AC03CF1F413CD71BBC75901F1AE557759B75963B302A151BFF6ACDF9E15089BB98FE49A3F38E507E6C057065A3F5FD4EAA2C073F23B527D29AC3D005E1E2958B2D5038D57545A7983EA7766596582EF2929761F6A95A0C76AFBC3FFD4E9FB4A7DCBF5EBC215FDDE86FAC8C2F1BEABE4757D4A97FD884F06A865AF66F052134082158EAF38AD4F69C585B74FF05DA63AA3B685657E8F744A45A5BE31CE8068EF710CB05FFFBCEEEC8A26F8BAA9DBAF5579BDA8D47FBDDD013E553CC1F7B7A2872A7F5A52E23F3A9A60D97782AFB8E1D7F9736B3BCE0527149556FC51FDED7FD7FE3B2A0DBBD37EDED181BFCEA71C9B59B366B5ABAEAEFE3A52A0DCBE7DFB7F478E1CB94B6629644F76BA9DBC474261FBA9EDADDB5FFEE9976651795150B01CF6F630B3EBACAE8160F9F32B7F6E767FB6BBD9615A87C0FB3B3DD129AD4EDE23B32EF68C1DC1126862CEBEB24E9F56CF8ED99060797B547DA4EADF9C8F4980EC5BE65B2A2538BCFA17D8F7BF54E5333E25B83C58CA2A32839A0012A86892FF5CD5E12C9212668FEA8B819F2754E6EBB0793868FA8F2E9AE06F253396D6EF52F7E535DD26CFFFBE7ADDB5A1B39875FE76ED6B16E93DBC81805AEAAB72FCDDFEEAB16FEA74E2EA6F174FAC38AFF6FEEC6325BC3A83A50AC79DD5FDBED67D159CF9A463274B9DE6CE9DFB5A4D4DCD411D28BFF9E69BEF9E7FFEF9AD1D3B76EC204B9CF46B533958DEB3E11E6B86F198E38EB102A40E8639A53981E028B396CE6029AF6F7547AB40003DF2A823CDD6435B9BBDE7F7368B2B8BADC7257CA6E3E546EC19CC5708964082FB577B076BF1848AEBA20A96E32B2E96D538A1B394F64E5B53FABCDA9DB89533EAF689B53B7E6B03AAFF0EEBEFDBAB89A46F76BE067023390C4196C75313400249400B3793581B2C2B1BDCB32321D27AED38FF2556075656D9431EB796D2AA9F655633D27B0B4B7D3B0A4B2BDFACF3771D339676D8FCBAC1FF0F7B6F7160296C84A5B288DDDD77DF5D505555656EDCB871D7942953C21E9F90EA33967AF96B97A7BA0482A5CC4886CE62EAFB23DE1B61CD4ECA633FBEF0C756D094C7EFDF7ABFF5D86FDBFE366DAF63E9E864650673395B389088BE75F6B1F60EDAA896A4EA6029EF6BE875CE194B09AD2AC0CE9662F797FB8B4A7D7B03CB66CB2A670596E4D6BE772B9F0EDCC83ECEDD434D0049A03A9B4F55792574C6D2DA5B5A56D9517E76767812E46489A9F5BCA31393A5B4B5B38EB57B6AADD95039BEA4B4B2B73D1B796DE06FD6CE821E52B7E323CE585A4B78FCF3F47B6449ADFD6FEAA16723F512A0704B618BCA7C3DAD9F2756FC8E4F397ECED9C9740C96A16152EE174C2FB002A31C7739FAA3D141C1F2ECCBCF367BCCE9613D26339EA79E7BAAB514367F727EE0444052E47DE91A2C0124B44FB5660E03338D6595EFABFB0FD71B18559FE8088FFEE0FEB8B26FB860A977AAAAC7B6E9BE3374C65376E2AA3E79249F0A5C1E2CE5448AD9D40490A44E5085B3EA903D9B2F068263A97F41E87B824ED0E3E8148515F8A4439DB4F44CDD4986F99B9B5579AB6EE75A67C632E8D8106B4FB0FD6F94632C6B7F56FF76158C9D274B501DF15AD98BCBA79B78E9122C87AC1C623EB0E381C032583D03298FEB6039F28391D6996325745ED6EE32EBF694B34F31FFD4ED4FD67D99F594D7DEFED2ED693D63092031023B636B77C04ADFD8DFEACFEC434AC21D225237581E5E31E43CFE32DC3196E1FAE090E73E939DAF7C327033FBECFC9CD811485AB074063A47C7661DBF58EAFB32F43DB26C47661303338DD62C62ED718D72863CB9ED35B1E294A60E968EC74D99C13CFCEF0D0EBFF66BFEC3A74BB0741E5779DA79A7054ED62327E0915B59FADA22E47223B27CB69FAF9F75ABCF022BB772BCA53E890FC11240701F56BB6A46767A3A025FFF40E8B4CF45202B75620A9665FECE0D06CBD2CAB5CE33D006CD7896F926F3E9C0CDECEBA6B7A326806405CB883396FE91FAA43CCEF7C88900FA8E5BF6E3D08ECF19FCACD7440896F65EDD6FEA5B0A2BB3A5A1C761460E96F2FF50DBA9EA633399B124583A83A52C65955B999194DBBBD7DD6DF67AA1579D632C9DEF19B47C901528E5DA97E972D65B8225D02CFDE897AACF5A152630F60FE9FB7A84CE5C86590ABB3EE81223F679030896407CE4DAC2720D5B6A02485EB0FC7D482765ED319599C94827E1B1CF38D7A1760F6DC585FA843DCE33C8D63363B9BFCE2C63C88CA55C4A24DCC97B74672927EBD167A0959312102C099691CAD89D63CDA16F0EB596BD3A1FD7D7A7946B5786BB8EA584D11B07DF685DCBF2AF03FF6A3DAE03AA1C6F49B004DC4D9FA847769686ED5B4382A5EE57C3BC2E102CE5B25FCEE7F4995E23054B39AF813E49908450D9511C784ECE0E6BEF0406DC2A2727678E0A976DA90920D1A17262C5EF5427F69C55225D6EA4F6E769211DE315FAA43EB581D2FFEBDAE5B1F67258FB3224F67B2BA30EB8D15CC7F2F0BF69BF3E13AC5CCB32CC6BB6F109132CE3398B6C3AFFFB0996408AF4AF8E50D870DF17FE18C93AAF0B0996B273573FA72F45E23C3CC4EE23DBD69EC19D8009D706CBE754B9959A0012ACF69223C1D7B78A74B911BD1CF6B6875F39F9F05959F512D6CA1B0E77A4872FF41C69C6B231C152CF92AABF3D3CB413951306D9C7787EC98C25C1D28D856009A44EB0547DDAE0288365FF70CFD92B73565933918E7E4FF7777A59ADF39014E9A39DD7B6944029EF93FB7C2A70238FC733D7308C36D4049020766755157A8AF2C3B381FE79218F3DA167269D41547ED6CB52EDF7E5D60DA9BE89D176C27AEF6B7D64C94F6199EF96A0F7D94B6F45E178DF55CEEB6A826049B004D03CC132BA99C8704B6935E77531EBBCCFDE81AA2FEB6597CFFA96564EB5AE6369F7CFF23B2488F2A9C08D7272725E50E5166A0248A0862EC60C102C09960000A4338FC733CF308C9BA9090020585208960000C425272767BE0A97ADA9090020585208960000C41B2C5F54E5266A02000896148225000071F1783C2F79BDDEBF51130040B0A4102C0100884B4E4ECE02152E6FA4260080604921580200106FB05C6818462B6A02000896148225000071F1783C8BBC5EEF5FA9090020585208960000C4252727E765152E6FA0260080604921580200106FB05C6C18C65FA8090020585208960000C44585CAF2ECECECEBA9090020585208960000C4252727A75285CBFFA32600806049215802001017152A7DD9D9D9D751130040B0A4102C0100884B4E4E8E5F9596D40400102C29044B0000E20D964B0CC3B8969A0000822585600900405C54A85C9A9D9DFD276A02000896148225000071C9C9C959A6CA1FA9090020585208960000C41B2C5F310CE30FD40400102C29044B0000E20D96AF666767FF9E9A000082258560090040BCC1B24A956BA8090020585208960000C41B2C5F330CE377D40400102C29044B0000E20D96CB3D1ECFD5D40400102C29044B0000E20D962B54B98A9A000082258560090040BCC1F20D8FC77305350100296E71C562025DEA941A152C0FB25502001008962B55B99C9A008014B760E9821D53374F25D4A54079ECC3C79E56C1721D5B2500008160B9CAEBF55E464D00408A2BF795FFFD65FFCB9FA970F935E1AEF9662AFFFFF6EE36468ABB8E03782488A8B5A156A4B5A9ADB5D6A6565A35A6698CF1348D29A610129DECC371B889C9455B28B7D437C5946C62782349E9EE1E8D2410638C8AC4E4FA82B424ECED5A1A20C6A78AD807A56839D0A3553815E15A03EBCCEECEB2777060266CCD6D3E9FE49F9DDDDB79E037243FBEFC67E61AA1B2B2FBD54AA5F2157F2B01A01D2C7F954AA53EA91200B34018661ED8BD7BF72FA2CB30A37BFC66E3181919A9CFD6636FD5FD45A112002E0896BF0EC727540280AE3B7EFCF8974BA5523D6C3C37AB0600F48E542AF59B6C367BB74A00D055F57A7DFE8913274E86EA8383833B5504007A473A9D7E3E0C9777A904005D353636F6837ACBBE7DFB8E653299E5AA02003D132C7F1BF6F6C52A0140D79C3A75EAAEB367CF9EAB77D8B061C3582E975BA03A0030FBA552A903FDFDFD1F570900BA667C7CFC707D9A898989F1B0011555070066BF743AFDBB305CDEA9120074C59123471EABCF60646464DC2F5306809E0896073399CCC75402802B2ECC8ED74D4E4EBE3953B03C77EEDC1BF97CFE405F5FDF5CD50280D92B0C95BF0F82E00E9500E08A3B7AF4E8FEFA651C3E7C782C6C4643AA0500B3573A9D7E31ECE7B7AB040057DCDEBD7B2F972BEB67CE9CF959D88CEAB95C6EBE8A01C0EC1486CA978220F8A84A0070C5AD5FBFFEA14B5D0A1BE5CA75EBD6FDC48C2500CC6EE974FAE5542A759B4A00D015DBB76F7F79A65479E8D0A1EF868D68BF7B2C0160D607CB3F64B3D98FA804005D1104C1AD61803C739107F71CECEFEF3FE8A9B000D013C1F28F51CF570900BA66E3C68DE530489EED0C965BB76EDD964AA536A90E00F444B03C14F6F50FAB04005D135DEABA6BD7AED7E250393131F1A3E87F3673B9DC02D501809E0896AF64B3D95B540280AE5AB56AD5174E9E3C39198EFAE0E0602593C92C571500E89960793808820FA904005DB765CB96674AA5523D954A8DA80600F454B0FC53386E560900BA2EBAF435FA9D956EEE07809E0B967FCE66B337A904006F55E3A9AB0200F45C7F7F3508820FAA040082250090B4BF1F09C78D2A018060090024EDEF478320B8412500102C0180A4FDFD58383EA0120008960040D2FEFE97152B565CAF120008960040D2FEFED72008AE530900044B0020697F1FCF64328B540200C1120048DADF8F0F0C0CBC5F2500102C0180A4FDFDB5200816AA040082250090B4BFBF9EC964DEA7120008960040D2FEFEB7952B575EAB120008960040D2FEFEF72008DEAB120008960040D2FE7E229BCD5EA312000896004022A954EA642E975BA0120008960040D2FEFE8FFEFEFEAB550200C11200482493C9FC73D9B265EF510900044B0020697FFF57100457A9040082250090B4BF9F1A181878B74A002058020049FBFBBF972E5DFA2E950040B0040092F6F7D34110BC532500102C0180A4FDFD4C2E979BAF120008960040D2FE3EB964C99277A8040082250090B4BFBF1104C13C950040B0040092F6F737070707DFAE120008960040D2FEFE9FBEBEBEB92A018060090024EDEF670B85C21C950040B0040092F6F773E1CBDB540200C11200D0DF01981D8DC7300CC3308CDE1BFE95030000000000C07985426DEE50B9B63C1E6B8AD51F36964BD5C9A1F2E80BFFCB36D63C51591C6DA7B9BDC29CCE87B384DBA9E74BB56F47CB8F946BB75FB0EE70ED818B6DF3C1CDB5ABA275D79447834BED3BFE4EF8FA7A389E6C1D7BFDE162F553E1EBCED6FBB1700C3BDB0000005D0B9785399D21AE15C67647A12F0A9AF18843DBDA62E5F3D382E5A2E8F3706C8BC35E1C4A1BCBC3957BD76E7EF6C6E6E7D5C7A606C35A7FF4F9EAD2D357E74B95CFE68BD59F36F7339A696DF3A978BFE1F8F9C58265B8CDCF34026CB13AD80E9B4F54EF89C269FB3BA56ACD99060000E8A256F87ABE15E24EE74BB51D71E0CC6FAADCD20C90D57B9A3390D5CF4D5F3FFCFE7D0F0D57AE5D5DDAB3B050D831AF19EE2A8B5B3396F735835FEDFE0B436D6DEEDAE1CA6DCDE51DF3D616AB5FEA0C966BCAB5AF85CB43ADED2DEA5C7775A972473394EE59D8F879A9FA703B58B6963BFE6C3B9D650000802E07CB30C4A51ACBCD7079AC1DCA36D5EE6E04CBD2E8AAE812D9F3A1B03027BFB976EBD48039FAC530D4ED0FBFF7FD8E99C697E2E5301C7EFA52C751F85E6D7EF4DABE1476864B653B02E3A98EE5B1F63E872BF70E95ABCF761CC33667190000E0FF142CF3C5DA57DBDF29561F9FB25E7174209E358C66365BF7365E1008E359CC6826B211401F1FBD21DA4FBE3CFAF57836B21904E33038F552D87CB9FA601C18A3F5DB97D6761C673C4BB9A65C5D1607DFC6BE8AB5FBA7CF76020000D0856039FD52D8E8F36F3CF9DC35EDE0D7113EA7AF1B5F8E3AB469CFF59DB394F1BD99AD07ECB4673FDB61B335A318DD63D97C5F7D257CFF5CE70385C29079203E9EA9C73B9A892E956DBF2F561FED7870CF531DF7674EE44BD5EF38CB0000005D0E96179BB1EC089D13D1ECE44CEBC7C1320EA2D14C64E7CFDBF75D4E7BCA6B1C2CA319CCF3FBAA3D7D91EF1C8FDF3F323C7A53637FADD0D83EFE69F755C6F76E364367ED5BCE320000C05B1B2C1B612C7A204FF4B4D5F8E9AB975A3F0C9EDF6C2F97475FB8DC8CE5CCC1325A7FCAAF3E393D7DC6B263DD89F3FBAF3E9A2F557F19EEEBC7D1BD9CD1A5B951B86CCE62D6EE74967BDF7F01C2B8EC92D1A67BA30000000049454E44AE426082, 1); -INSERT INTO `act_ge_bytearray` VALUES ('302558', 1, 'var-baseTask', NULL, 0xACED000573720018636F6D2E6C656E2E656E746974792E557365724C65617665B811E59153A6CD0702000C4C0009626567696E54696D657400104C6A6176612F7574696C2F446174653B4C000863726561746542797400124C6A6176612F6C616E672F537472696E673B4C000A6372656174654461746571007E00014C0004646179737400134C6A6176612F6C616E672F496E74656765723B4C0007656E6454696D6571007E00014C0002696471007E00024C000B6F70696E696F6E4C6973747400104C6A6176612F7574696C2F4C6973743B4C001170726F63657373496E7374616E6365496471007E00024C000673746174757371007E00024C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E000178720017636F6D2E6C656E2E656E746974792E426173655461736BA48CBC2F51BC802602000D4C0008637265617465427971007E00024C000A6372656174654461746571007E00014C0002696471007E00024C001170726F63657373496E7374616E6365496471007E00024C0006726561736F6E71007E00024C000673746174757371007E00024C000B7375626D697474696D657371007E00034C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E00014C000775726C7061746871007E00024C000675736572496471007E00024C0008757365724E616D6571007E000278707070707400043230313874000331313170707070707400352F6C656176652F726561644F6E6C794C656176652F343332303730666331663532633063633137376164393031613561616338643174002035393436613938356637333363353766316162373136383966376236616565617400087A68616E6773616E7372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017FDB8E2400787070737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000037371007E000C77080000017FE5DADC00787400203433323037306663316635326330636331373761643930316135616163386431737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A65787000000000770400000000787070707070, NULL); -INSERT INTO `act_ge_bytearray` VALUES ('302560', 1, 'hist.var-baseTask', NULL, 0xACED000573720018636F6D2E6C656E2E656E746974792E557365724C65617665B811E59153A6CD0702000C4C0009626567696E54696D657400104C6A6176612F7574696C2F446174653B4C000863726561746542797400124C6A6176612F6C616E672F537472696E673B4C000A6372656174654461746571007E00014C0004646179737400134C6A6176612F6C616E672F496E74656765723B4C0007656E6454696D6571007E00014C0002696471007E00024C000B6F70696E696F6E4C6973747400104C6A6176612F7574696C2F4C6973743B4C001170726F63657373496E7374616E6365496471007E00024C000673746174757371007E00024C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E000178720017636F6D2E6C656E2E656E746974792E426173655461736BA48CBC2F51BC802602000D4C0008637265617465427971007E00024C000A6372656174654461746571007E00014C0002696471007E00024C001170726F63657373496E7374616E6365496471007E00024C0006726561736F6E71007E00024C000673746174757371007E00024C000B7375626D697474696D657371007E00034C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E00014C000775726C7061746871007E00024C000675736572496471007E00024C0008757365724E616D6571007E000278707070707400043230313874000331313170707070707400352F6C656176652F726561644F6E6C794C656176652F343332303730666331663532633063633137376164393031613561616338643174002035393436613938356637333363353766316162373136383966376236616565617400087A68616E6773616E7372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017FDB8E2400787070737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000037371007E000C77080000017FE5DADC00787400203433323037306663316635326330636331373761643930316135616163386431737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A65787000000000770400000000787070707070, NULL); -INSERT INTO `act_ge_bytearray` VALUES ('302561', 1, 'hist.detail.var-baseTask', NULL, 0xACED000573720018636F6D2E6C656E2E656E746974792E557365724C65617665B811E59153A6CD0702000C4C0009626567696E54696D657400104C6A6176612F7574696C2F446174653B4C000863726561746542797400124C6A6176612F6C616E672F537472696E673B4C000A6372656174654461746571007E00014C0004646179737400134C6A6176612F6C616E672F496E74656765723B4C0007656E6454696D6571007E00014C0002696471007E00024C000B6F70696E696F6E4C6973747400104C6A6176612F7574696C2F4C6973743B4C001170726F63657373496E7374616E6365496471007E00024C000673746174757371007E00024C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E000178720017636F6D2E6C656E2E656E746974792E426173655461736BA48CBC2F51BC802602000D4C0008637265617465427971007E00024C000A6372656174654461746571007E00014C0002696471007E00024C001170726F63657373496E7374616E6365496471007E00024C0006726561736F6E71007E00024C000673746174757371007E00024C000B7375626D697474696D657371007E00034C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E00014C000775726C7061746871007E00024C000675736572496471007E00024C0008757365724E616D6571007E000278707070707400043230313874000331313170707070707400352F6C656176652F726561644F6E6C794C656176652F343332303730666331663532633063633137376164393031613561616338643174002035393436613938356637333363353766316162373136383966376236616565617400087A68616E6773616E7372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017FDB8E2400787070737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000037371007E000C77080000017FE5DADC00787400203433323037306663316635326330636331373761643930316135616163386431737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A65787000000000770400000000787070707070, NULL); -INSERT INTO `act_ge_bytearray` VALUES ('302573', 2, 'var-leaveOpinionList', NULL, 0xACED0005737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A657870000000027704000000027372001B636F6D2E6C656E2E656E746974792E4C656176654F70696E696F6E1956BF801DDE60870200065A0004666C61674C000A63726561746554696D657400104C6A6176612F7574696C2F446174653B4C00046F7049647400124C6A6176612F6C616E672F537472696E673B4C00066F704E616D6571007E00044C00076F70696E696F6E71007E00044C00067461736B496471007E00047870017372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017FDDEED97B787400203062373632356665646161303565383566323832343836653163396339316239707400033131317400063330323536367371007E0002017371007E000677080000017FDDEFA3BB7874002064383138616336613836636631613634643231383462663036393964363761387074000331313174000633303235383478, NULL); -INSERT INTO `act_ge_bytearray` VALUES ('302575', 2, 'hist.var-leaveOpinionList', NULL, 0xACED0005737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A657870000000027704000000027372001B636F6D2E6C656E2E656E746974792E4C656176654F70696E696F6E1956BF801DDE60870200065A0004666C61674C000A63726561746554696D657400104C6A6176612F7574696C2F446174653B4C00046F7049647400124C6A6176612F6C616E672F537472696E673B4C00066F704E616D6571007E00044C00076F70696E696F6E71007E00044C00067461736B496471007E00047870017372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017FDDEED97B787400203062373632356665646161303565383566323832343836653163396339316239707400033131317400063330323536367371007E0002017371007E000677080000017FDDEFA3BB7874002064383138616336613836636631613634643231383462663036393964363761387074000331313174000633303235383478, NULL); -INSERT INTO `act_ge_bytearray` VALUES ('302576', 1, 'hist.detail.var-leaveOpinionList', NULL, 0xACED0005737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A657870000000017704000000017372001B636F6D2E6C656E2E656E746974792E4C656176654F70696E696F6E1956BF801DDE60870200065A0004666C61674C000A63726561746554696D657400104C6A6176612F7574696C2F446174653B4C00046F7049647400124C6A6176612F6C616E672F537472696E673B4C00066F704E616D6571007E00044C00076F70696E696F6E71007E00044C00067461736B496471007E00047870017372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017FDDEED97B7874002030623736323566656461613035653835663238323438366531633963393162397074000331313174000633303235363678, NULL); -INSERT INTO `act_ge_bytearray` VALUES ('302588', 1, 'hist.detail.var-leaveOpinionList', NULL, 0xACED0005737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A657870000000027704000000027372001B636F6D2E6C656E2E656E746974792E4C656176654F70696E696F6E1956BF801DDE60870200065A0004666C61674C000A63726561746554696D657400104C6A6176612F7574696C2F446174653B4C00046F7049647400124C6A6176612F6C616E672F537472696E673B4C00066F704E616D6571007E00044C00076F70696E696F6E71007E00044C00067461736B496471007E00047870017372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017FDDEED97B787400203062373632356665646161303565383566323832343836653163396339316239707400033131317400063330323536367371007E0002017371007E000677080000017FDDEFA3BB7874002064383138616336613836636631613634643231383462663036393964363761387074000331313174000633303235383478, NULL); -INSERT INTO `act_ge_bytearray` VALUES ('302598', 2, 'source', NULL, 0x7B227265736F757263654964223A22333032353937222C2270726F70657274696573223A7B2270726F636573735F6964223A2270726F63657373222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C2270726F636573735F617574686F72223A22222C2270726F636573735F76657273696F6E223A22222C2270726F636573735F6E616D657370616365223A22687474703A2F2F6C656E6F73702E636E222C22657865637574696F6E6C697374656E657273223A22222C226576656E746C697374656E657273223A22222C227369676E616C646566696E6974696F6E73223A22222C226D657373616765646566696E6974696F6E73223A22227D2C227374656E63696C223A7B226964223A2242504D4E4469616772616D227D2C226368696C64536861706573223A5B7B227265736F757263654964223A227369642D33304636324437352D353136352D344532322D383433412D394441393335424135303331222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22657865637574696F6E6C697374656E657273223A22222C22696E69746961746F72223A22222C22666F726D6B6579646566696E6974696F6E223A22222C22666F726D70726F70657274696573223A22227D2C227374656E63696C223A7B226964223A2253746172744E6F6E654576656E74227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D32333931423338312D323736372D344134332D383237442D374333353037394145303745227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3137352E352C2279223A3134317D2C2275707065724C656674223A7B2278223A3134352E352C2279223A3131317D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D39363143373036422D413744312D343941312D394332382D414135433233433430364243222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C226173796E6368726F6E6F7573646566696E6974696F6E223A2266616C7365222C226578636C7573697665646566696E6974696F6E223A2266616C7365222C22657865637574696F6E6C697374656E657273223A22222C226D756C7469696E7374616E63655F74797065223A224E6F6E65222C226D756C7469696E7374616E63655F63617264696E616C697479223A22222C226D756C7469696E7374616E63655F636F6C6C656374696F6E223A22222C226D756C7469696E7374616E63655F7661726961626C65223A22222C226D756C7469696E7374616E63655F636F6E646974696F6E223A22222C226973666F72636F6D70656E736174696F6E223A2266616C7365222C22757365727461736B61737369676E6D656E74223A22222C22666F726D6B6579646566696E6974696F6E223A22222C2264756564617465646566696E6974696F6E223A22222C227072696F72697479646566696E6974696F6E223A22222C22666F726D70726F70657274696573223A22222C227461736B6C697374656E657273223A22227D2C227374656E63696C223A7B226964223A22557365725461736B227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D36463636323645392D383144342D343845392D394345332D433632464434433932454230227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3338352C2279223A3135357D2C2275707065724C656674223A7B2278223A3238352C2279223A37357D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D32333931423338312D323736372D344134332D383237442D374333353037394145303745222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D39363143373036422D413744312D343941312D394332382D414135433233433430364243227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3238342E393233383535393435353934382C2279223A3132352E303334373433383734303737367D2C2275707065724C656674223A7B2278223A3137352E38313234373231373934303531382C2279223A3131382E313536363632333735393232347D7D2C22646F636B657273223A5B7B2278223A31352C2279223A31357D2C7B2278223A35302C2279223A34307D5D2C22746172676574223A7B227265736F757263654964223A227369642D39363143373036422D413744312D343941312D394332382D414135433233433430364243227D7D2C7B227265736F757263654964223A227369642D35383442353134362D373630372D343239362D393143342D383746384646323636333436222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22657865637574696F6E6C697374656E657273223A22227D2C227374656E63696C223A7B226964223A22456E644E6F6E654576656E74227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3539382C2279223A3132397D2C2275707065724C656674223A7B2278223A3537302C2279223A3130317D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D36463636323645392D383144342D343845392D394345332D433632464434433932454230222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D35383442353134362D373630372D343239362D393143342D383746384646323636333436227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3536392E333832383132352C2279223A3131357D2C2275707065724C656674223A7B2278223A3338352E36303534363837352C2279223A3131357D7D2C22646F636B657273223A5B7B2278223A35302C2279223A34307D2C7B2278223A31342C2279223A31347D5D2C22746172676574223A7B227265736F757263654964223A227369642D35383442353134362D373630372D343239362D393143342D383746384646323636333436227D7D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A313230302C2279223A313035307D2C2275707065724C656674223A7B2278223A302C2279223A307D7D2C227374656E63696C736574223A7B2275726C223A227374656E63696C736574732F62706D6E322E302F62706D6E322E302E6A736F6E222C226E616D657370616365223A22687474703A2F2F6C656E6F73702E636E23227D2C227373657874656E73696F6E73223A5B5D7D, NULL); -INSERT INTO `act_ge_bytearray` VALUES ('302601', 1, 'var-baseTask', NULL, 0xACED000573720018636F6D2E6C656E2E656E746974792E557365724C65617665B811E59153A6CD0702000C4C0009626567696E54696D657400104C6A6176612F7574696C2F446174653B4C000863726561746542797400124C6A6176612F6C616E672F537472696E673B4C000A6372656174654461746571007E00014C0004646179737400134C6A6176612F6C616E672F496E74656765723B4C0007656E6454696D6571007E00014C0002696471007E00024C000B6F70696E696F6E4C6973747400104C6A6176612F7574696C2F4C6973743B4C001170726F63657373496E7374616E6365496471007E00024C000673746174757371007E00024C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E000178720017636F6D2E6C656E2E656E746974792E426173655461736BA48CBC2F51BC802602000D4C0008637265617465427971007E00024C000A6372656174654461746571007E00014C0002696471007E00024C001170726F63657373496E7374616E6365496471007E00024C0006726561736F6E71007E00024C000673746174757371007E00024C000B7375626D697474696D657371007E00034C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E00014C000775726C7061746871007E00024C000675736572496471007E00024C0008757365724E616D6571007E000278707070707400043230313874000332323270707070707400352F6C656176652F726561644F6E6C794C656176652F376538303465376562376162386633353461663133316362626336326336383374002035393436613938356637333363353766316162373136383966376236616565617400087A68616E6773616E7372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017FDB8E2400787070737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000057371007E000C77080000017FF0279400787400203765383034653765623761623866333534616631333163626263363263363833737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A65787000000000770400000000787070707070, NULL); -INSERT INTO `act_ge_bytearray` VALUES ('302603', 1, 'hist.var-baseTask', NULL, 0xACED000573720018636F6D2E6C656E2E656E746974792E557365724C65617665B811E59153A6CD0702000C4C0009626567696E54696D657400104C6A6176612F7574696C2F446174653B4C000863726561746542797400124C6A6176612F6C616E672F537472696E673B4C000A6372656174654461746571007E00014C0004646179737400134C6A6176612F6C616E672F496E74656765723B4C0007656E6454696D6571007E00014C0002696471007E00024C000B6F70696E696F6E4C6973747400104C6A6176612F7574696C2F4C6973743B4C001170726F63657373496E7374616E6365496471007E00024C000673746174757371007E00024C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E000178720017636F6D2E6C656E2E656E746974792E426173655461736BA48CBC2F51BC802602000D4C0008637265617465427971007E00024C000A6372656174654461746571007E00014C0002696471007E00024C001170726F63657373496E7374616E6365496471007E00024C0006726561736F6E71007E00024C000673746174757371007E00024C000B7375626D697474696D657371007E00034C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E00014C000775726C7061746871007E00024C000675736572496471007E00024C0008757365724E616D6571007E000278707070707400043230313874000332323270707070707400352F6C656176652F726561644F6E6C794C656176652F376538303465376562376162386633353461663133316362626336326336383374002035393436613938356637333363353766316162373136383966376236616565617400087A68616E6773616E7372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017FDB8E2400787070737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000057371007E000C77080000017FF0279400787400203765383034653765623761623866333534616631333163626263363263363833737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A65787000000000770400000000787070707070, NULL); -INSERT INTO `act_ge_bytearray` VALUES ('302604', 1, 'hist.detail.var-baseTask', NULL, 0xACED000573720018636F6D2E6C656E2E656E746974792E557365724C65617665B811E59153A6CD0702000C4C0009626567696E54696D657400104C6A6176612F7574696C2F446174653B4C000863726561746542797400124C6A6176612F6C616E672F537472696E673B4C000A6372656174654461746571007E00014C0004646179737400134C6A6176612F6C616E672F496E74656765723B4C0007656E6454696D6571007E00014C0002696471007E00024C000B6F70696E696F6E4C6973747400104C6A6176612F7574696C2F4C6973743B4C001170726F63657373496E7374616E6365496471007E00024C000673746174757371007E00024C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E000178720017636F6D2E6C656E2E656E746974792E426173655461736BA48CBC2F51BC802602000D4C0008637265617465427971007E00024C000A6372656174654461746571007E00014C0002696471007E00024C001170726F63657373496E7374616E6365496471007E00024C0006726561736F6E71007E00024C000673746174757371007E00024C000B7375626D697474696D657371007E00034C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E00014C000775726C7061746871007E00024C000675736572496471007E00024C0008757365724E616D6571007E000278707070707400043230313874000332323270707070707400352F6C656176652F726561644F6E6C794C656176652F376538303465376562376162386633353461663133316362626336326336383374002035393436613938356637333363353766316162373136383966376236616565617400087A68616E6773616E7372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017FDB8E2400787070737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000057371007E000C77080000017FF0279400787400203765383034653765623761623866333534616631333163626263363263363833737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A65787000000000770400000000787070707070, NULL); -INSERT INTO `act_ge_bytearray` VALUES ('302616', 1, 'var-leaveOpinionList', NULL, 0xACED0005737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A657870000000017704000000017372001B636F6D2E6C656E2E656E746974792E4C656176654F70696E696F6E1956BF801DDE60870200065A0004666C61674C000A63726561746554696D657400104C6A6176612F7574696C2F446174653B4C00046F7049647400124C6A6176612F6C616E672F537472696E673B4C00066F704E616D6571007E00044C00076F70696E696F6E71007E00044C00067461736B496471007E00047870017372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017FDDFADF437874002030623736323566656461613035653835663238323438366531633963393162397074000333333374000633303236303978, NULL); -INSERT INTO `act_ge_bytearray` VALUES ('302618', 1, 'hist.var-leaveOpinionList', NULL, 0xACED0005737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A657870000000017704000000017372001B636F6D2E6C656E2E656E746974792E4C656176654F70696E696F6E1956BF801DDE60870200065A0004666C61674C000A63726561746554696D657400104C6A6176612F7574696C2F446174653B4C00046F7049647400124C6A6176612F6C616E672F537472696E673B4C00066F704E616D6571007E00044C00076F70696E696F6E71007E00044C00067461736B496471007E00047870017372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017FDDFADF437874002030623736323566656461613035653835663238323438366531633963393162397074000333333374000633303236303978, NULL); -INSERT INTO `act_ge_bytearray` VALUES ('302619', 1, 'hist.detail.var-leaveOpinionList', NULL, 0xACED0005737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A657870000000017704000000017372001B636F6D2E6C656E2E656E746974792E4C656176654F70696E696F6E1956BF801DDE60870200065A0004666C61674C000A63726561746554696D657400104C6A6176612F7574696C2F446174653B4C00046F7049647400124C6A6176612F6C616E672F537472696E673B4C00066F704E616D6571007E00044C00076F70696E696F6E71007E00044C00067461736B496471007E00047870017372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017FDDFADF437874002030623736323566656461613035653835663238323438366531633963393162397074000333333374000633303236303978, NULL); -INSERT INTO `act_ge_bytearray` VALUES ('302630', 1, 'source', NULL, 0x7B227265736F757263654964223A2263616E766173222C227374656E63696C736574223A7B226E616D657370616365223A22687474703A2F2F6C656E6F73702E636E23227D2C226964223A2263616E766173227D, NULL); -INSERT INTO `act_ge_bytearray` VALUES ('302632', 1, 'source', NULL, 0x7B227265736F757263654964223A2263616E766173222C227374656E63696C736574223A7B226E616D657370616365223A22687474703A2F2F6C656E6F73702E636E23227D2C226964223A2263616E766173227D, NULL); -INSERT INTO `act_ge_bytearray` VALUES ('302633', 1, 'source-extra', NULL, 0x89504E470D0A1A0A0000000D4948445200000288000000CD08060000003B43814C000000206348524D00007A26000080840000FA00000080E8000075300000EA6000003A98000017709CBA513C0000000467414D410000B18E7CFB5193000000017352474200AECE1CE900000006624B474400FF00FF00FFA0BDA793000000097048597300000EC400000EC401952B0E1B000011F04944415478DAEDDD0B7454F59D07F09BC924194208E115E3A22B56A4BADAB55A1F548F055F80407B5C2B25984A715DDB7A56DAD5FA586B7DD5F6D45D75ABDBDD565B151FA841E8FAA8D64715A85B05179422281110C16208C86308904C1E33D97B69E8491110C883103E9F73AE776632B933FE90BFDFFBFFFFEFFF060100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005D44961200FBC203CB1EF87A8F648F9F146C2EE81FAF8B6B8B3A486376637D2637F34AF6E6ECEF8C183162A98A000222D0293C52F1C87D7DAAFA5C92EC970C36166D0CEABAD5294A07C94DE50685C9C2A0EFAABED5F1A678D9D9679FFDACAA00DBCB5602A023453D87C51F15DFBAF2332B83649F6490CE492B4A074AC7D3414D414DB0B9E7E6BCA2B545C3CA2E2C7B72F2E4C9EB55066829A60440478A8695A39EC328A4B0EFA4F253C1BAE275D5B158EC56D500B6175702A02345730E971FB47CD70DD3E67850B8B430C85D9F1B64356505754575C1A6819B82869E0D0AD88636F4DDD0BFEFEABE435502D89E1E44A063CF4AEBE259BB9A731885C33E6FF609F23ECE0BB2D25941900982BCF5795B5FCBD998A3806DA83E519F17EE4A54021010814EAD60794110ABFF64D31485C5E867000888C0016657BD8451EF22000222708089E61CEECDCF001010010010100100101081034EBADBCE17CECEE46614084040040E345B0EDDB2C320988967822D03B628108080081C6852C5A920D537B5C3D76B8B6B15084040040EC886A9F1934D53769D5BC7030888C001275EF3E7BBA824D6243EF1B3BC7579419F397DB6BE070001113800E457E66F0D80D1FD97772637991BF49DDD37E8BEA2BB351101DAF3845D09807DDA08D5C483C28AC2AD3D84BB23BAE55EE1E2C220B13611540FAA0E1A7A342822401BD38308EC53518FE0EE86C396A29EC6BEFFD75701010444A0AB897A04F79A651101DA852166609F5A75CE2A4500E864F420020020200200202002002020020020200200D06AAE6206000E68AFBFFEFA3F2C5DBAF4E2952B579EB67AF5EA1E1B376ECC49A552415E5E5E537E7E7E436161E187E1FEC5850B17DE3575EAD4A50222004017D4D4D4149F356BD68DD3A74FBFE2BEFBEE2B38E18413822143860403060C088A8A8A823010066148CCDAB469536E6565E5C0F0BD030B0A0A2EBBE28A2B962493C96F4C9A34E90D011100A08BD8B061C37161287C69DEBC79C55FF9CA57826BAEB926C8C9C9F9C4FB1289C4D6AD5FBF7EC171C71D175C7AE9A5B11933667C76EAD4A97FB8FCF2CBA7AD5EBDFAD2F0F1E6AE58237310018003C61B6FBC31E68E3BEE989B9B9B5B7CFBEDB707C3870FDF6138DC91ECECECE0ECB3CF0EEEBEFBEEF8E0C183CFEBD1A3C7FCD2D2D201022200C07E1C0E1F79E491F230DCC5C78F1FBF7518796F44BD8A65656589281C868F5FEB8A2151400400BABC6858F999679E796CF8F0E1B1D1A347B7C931CF39E79CD8B871E37AE5E6E6BE3066CC9802011100603F115D90326DDAB497060D1A146FAB70B8CDB061C3BA9D79E6997DF3F2F2FE5D400400D84FCC9E3DFB96B7DF7EBBF8820B2E6897E38F1D3BB64F3C1EFFFA85175EF879011100A09D959696FE60DCB871E70D1D3A74AF575E79E59557BE336AD4A8BD9E73F869A239895FFBDAD7EAC3877708880000EDEFD6A6A6A6274B4A4A9263C78E9D1C86C5117B32DF2F5A047BD9B26505679E7966BB7EC961C386F5C9CACA3A31FC6E03BB42D1AD834887995CF5D2590B6A975D5E99FA78F087756BFAAC6FAC8ED766EAB2F2623941AF7861E380C4411B8A737ACF39A5E0EFFE73EC4167BEA86200B4D03D0C606561582CCBCECEAE2E2D2D7D3A7CFE585E5EDECC071F7C30B5B35F5ABC78F1A5D122D8BBBB94CDDE8A96C039EAA8A33E7CE79D77CE0BBA404FA28048BBFBD6E23BAF5ADB90BC7ED2EADF169D52787470E141E70483BA1D1A94E4F60EF26389A026930A36346C8A2FAEFD53BFD7AB178EFC65D53323CF7FE7FA4DBD730AEFBA6FD0B537AA2000DB290CB78BC2B078512A346EDCB827C2E74FAE5AB5EAD999336736B67C63F8DAE033CE38A343BED4B061C3BA870171888008BB7059C5ED7FBF2ABDFEF90FEB561D7CF521E3B2BED4F3B8203B2BFB13EF8B42627E5E22E89FD72F38A3E884E0FABF1D1FBCBA717E8FBB3E7AE286910BAEBA6C407EC9C89F1F71D51C15ED1CA2F940E1AE229D4EBFD055EF2000EC571261501C1FEEC7979494443D8B2F656565DDBFAD67B1B2B2B2E0B0C30EEB902F127E4E34C9F1D8AE5054019176F1CD25B7DFF4D6E6A537FE53C9E8D8C5079DBBC360B82B51988CB647D6BCD8F7BF2B9F9CFDED2577DC76CF91575DAFB29DC2AD5B1B8F783C3376ECD877C286F87FC2A7331389C4EC5D0DF3D0F9D4ADAB0BDE7AEBAD28F4DFAC1A741151CFE2056160BC20954A45FF6DBF5F5D5D9D535858D8211FDEB367CF9270D7254E9C0544DADC75CBEEF9C16B9B16DE74CFC0EF657DBEE0C8561DEBA2E2E1C1890547C5BEBDF48EEB2E5B7C678F5F0CFADE7754B873081BE058180E3F173E8CB69B9A8779DE085F7F36168BBD1C9EB52FDC7EA887CEE5E3D91F072BE7AD8C1EDEA41A745147D4D5D5B5DBD5CBDB8BAE660E758905B30544DAD49845375CF9874D0B6F79FCB337664543C66DE1E8FCC382C7C2E38D7BEF87FF3C76D1CD95538EBEF93695DE77CACBCBB3C2B3F2A61DB58D61388CE6DE0CC96432414949C986F07D33C2E7BFC9CECE7EF9D1471F5DA97A9D4BBFC1FD827E95FD8279F3E6DDA21A7462BB7302930EDB9FA6F0A4F5AF724DF87C593C1E1F50535313EB8890585B5BFB51B8EB2920420BA7CEFDE611CB6BAB6EFBE59157C7DA2A1C6E131DEFDE8157C5BEF1DE8F7F387CE195CFBF78EC7FCC57F14EAF57B89D1F6DE9743A1AEA49878F1755565606C11714A733C8EB93171C73C231C1B5D75E7BB36AD059856DC70E03629807A3118A4C180273C37D76B88F5E4B86FB97C3EDD1BCBCBC17A2692F975F7E79AABABA3AAF2302623299DC18EE1A044468A15B4EFEF317179F95D3DA61E59D897A1227F6FF6ACEA455CF3D1D3E1DA0E2ED63C2840989542A551236B42561239BD87E1FBEE5A0BD3C743411F5D879F3E60503BEEC8F0FD82BD162D4D1C966B716BD85D19CBF17C26D4AB76EDD5E0E4361B2E52F1416162E5BB162C5D1252525EDFEE5162C58B0283AF71210A1D997E64D2CCBC9CAFE4C3467B03D45C79FB2E6954386CC9F78D9EF8FFBD92F547EC7C68C1953929D9D9DD855C80BF745D1F3F071F4FC2FFB686277243A1BDFD17E0F4543D12D7FB1E2F8E38F3F6A43B0C11F12B037725B84C269E1F65C229178765717C885A1F1B773E7CE3DFA94534E69F72FF7FCF3CF47DD94D30544D8F637363BE7966B0EBD303B5AF4BABD7DFF6F2FCABE71F9FDD7850FBB7440DC55C88BC5623D5B3EDF3EE46D3BC6AE425EF87B3BFBE8A8A1AD6ADE52E1EF5485EFDDB6AF6B7EFDD36ADFD8DCBE441FB830FCBD7BC3467A7274667FC92597340988C01E9F6D3635453D8333C3F6EFA1E6256C92BBF37B15151577E5E4E4FC4B434343767B2E969D4EA7575455559D14EEBBC4C5940222AD367076D9213599DA43A365693AC2A9859F0B1A9B322547CD2A1D50F1C5F2E5FB63C06B3154BB7DB06BB9DF69C8DB16EE7611F2AA5A04BD1D86BCE6B93A7F793D6CD45253A74EADDA9D7FB7D2D2D21D05C4C6F038B1E8EAE6E6B6E5854C2673E79A356B66BA9A1968851BC2B66579229198B6374B694517C85D79E5958BA64F9F7EECF0E1ED37CA3569D2A437C3EF5918B6A34B0544081DDCAD68FC909E9F8FEFE95A87AD716EEF53729E5EFFDAC5413B2ECF3161C284A2542A55149EAD168541A7287CA96FB815B445C0DB4D3B0D79E1F7D9B85DE8DBE390D7866AC22D1A568987DF2B0A9DF785DFE3DEAED24802FB567979F98F5A7B8C6432F9F5279F7C72CEE9A79F9ED31E17ABD4D6D62E0E03E869615B3CBAABD45D40A4D57283F8974F2BFC5CAC233FF3E41E4707CF6F7863D4A705C49DF5E2853F3A24DCF29A876B0BB61BA68DD6B0EABB6D2E5EB4644B4B6D11F05A0CD56EFF7A2A3C4BAEDACF169C8E5ADBBF1A46F6B702E84C1E78E081F913274E7C74CA9429632FBEF8E26E6D7CF8E4F5D75FFF5AD8066E09C3EC5C01119AAD6FDCF499E80AE38E54940C63E9CCF5C7949696DE1E85B9F02F665174D145D0DCCBD762FF57A16EFB70D772B87607A249D06B9B8762A3D0B3367AAD0B06BCD6308C0CEC17162C5870694D4DCDC9C5C5C5478C1A35AAADAE346EBCF3CE3B1FAAACAC8CD67F3DBD2BD54B40A4D55299FAA27E39451DFA9915731606FD66A5A31EBFAB7614FC5A58BB2DE8B508777FE9C50BF7D1E2CDA9743A5D153EDEBC0F8769F7375787757ACA3032B0BF884E62FBF7EF3FFC89279E9813B6FF3D468F1EDDBD95874C46E170EEDCB96785FFEFF87257BB37BD8048AB353435E6E6C7121DFA99434EFB5270CFAAA783BF9915DC103E5DB92DF46D0B8389442269A8B3FD949797DFA10AC0FE26BA60A5ACACECA45FFFFAD7CF5556561E3C7EFCF87ECDB7C7DB23D19CC3685839EA398CC261D8262EEF6AB5121069FD7F4459F1BA9A4C2AAF2343625149EF60F5A9B18657BFFBD88FFC0900B0272171E8D0A15FA8AFAFFFB759B366FDE3F9E79FDF3072E4C87ED9D99F7EA165B494CDC30F3F3CE777BFFBDDE9D19CC36858B9ABF51C0A88B499BCAC9C0D1F37244B0ECB2BE9B0CFDCD0B029C8C98A57AB3E007BAA79CEF4F7C68E1D3BE9B1C71EBBBDBCBC7CC8A04183169F75D65985871F7E786EAF5EBD0ECACFCF8FD7D6D6AE4E2693EBDE7DF7DD779E7DF6D982AAAAAAE3A3F9EE61303C6FCA9429B3BB728D04445AAD29C8CC7DB766F9B96140ECB0756E16D7FE29FC67D65BAA0FC0DE0A43DEC270776E5959D921151515A3172D5A343C0C80C7067F5E8122BAD0319AA7581B6E3DC2ED956811EC0365EEB58048AB6D694ABDF84AF2CD53CFED35B877477DE6AB1BE7276B33752FA93E00AD150D3B87BB7B9A37423125A0B5B2D2F1A76624E7C5D24DE90EFBCCE7D6CFCAE4A4B7DE8713001010E96C960E7E74654DBAEE8FD3936F75C89CC0FFDD387FF39674ED92CE7C9B3D00101039E03564D277DFB0FCFE9A8EE845FCFEF25F6EAC6F4AFF97AA0380804827F6FE298F3FB5BEB1FABDBB2BA7AD68CFCFB967D5532B3FAEDFB0E2902DABCA551D0004443AB9EC74D3845FADFA4DF7B736BDD72E6B42BD53B3BCE6EE8FA6259A62C12533CF705B37001010E9F4A239810D41E3C46F2CFEC99695756BEADAF2D8D1F1C655DCBCB9B12973C5E2131FAF506D001010D94FBC7FD294F2BA4CDDBF8E5878F586B99B2AD6B5C531176EF9605D74BCDA74EAA74B4F7E7CB22A038080C87E66C9C9E50FA69AEAAEB8B0E287C18F3F7CF88FADB970E5A71F4D79FBABEFFE205D9FA9BF6EE9C9536E535D00687F16CAA65D443D8947CD2A9D3D69F50BBF9AF2F1F4F77F72F8B752A37A7FF198DDFDFD979373165FF3C1BD0D9B1BB6546765678D5D7262B96165001010D9DF35AF5378CEC039A5177CF7FD9F7DEBEA0F7EDEEBB8EE03579CDF6748E2841E47161F9CDBA7283F96E85E93496D595B9FDCF076CD07EB9F5AFB6AF5ECEA770FABCFD4AF09B282FBFBD7544D76410A00088874314B4F2A8FEE78326DE0ECB243E66E7EEF82B9D515A7356505BDB28260DBBD9BB7ED3F6C0A82DF47774859D2BC08F612E5030001912E1C14076FBDD7E55DCD1B00D049B94805000001110000011100000111000001110000011100000111000001118076905202404004F6B9744E3A95579BA7109D40A226313FDC55A904202002FB54434EC30B3D933D332AB1EF1DFCA7832B9A9A9A66AA04202002FB54417DC1C4DE55BD3775DBD24D31F6A1FCEAFC5F75DBD4EDAC4C2673836A00DBCB5602A0233DF4D043D513C64F985BB4AE6864BC31BEA63EB7BE5B3A27EDBEF01D2395A849BCD9FF83FE2F1557168F88C562970D1B366CB6B200DBCB5202605F983163C621E974FAD6F0E1D0A6A6A6012AD261AAA261E5A8E770C488114B9503000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E854FE1F5EFD99B91416FC3A0000000049454E44AE426082, NULL); -INSERT INTO `act_ge_bytearray` VALUES ('302635', 1, 'source', NULL, 0x7B227265736F757263654964223A2263616E766173222C227374656E63696C736574223A7B226E616D657370616365223A22687474703A2F2F6C656E6F73702E636E23227D2C226964223A2263616E766173227D, NULL); +INSERT INTO `act_ge_bytearray` +VALUES ('142518', 20, 'source', NULL, + 0x7B227265736F757263654964223A22313432353137222C2270726F70657274696573223A7B2270726F636573735F6964223A2270726F636573735F6C65617665222C226E616D65223A22E8AFB7E58187E6B581E7A88B222C22646F63756D656E746174696F6E223A22222C2270726F636573735F617574686F72223A22222C2270726F636573735F76657273696F6E223A22222C2270726F636573735F6E616D657370616365223A22687474703A2F2F7777772E61637469766974692E6F72672F70726F63657373646566222C22657865637574696F6E6C697374656E657273223A22222C226576656E746C697374656E657273223A22222C227369676E616C646566696E6974696F6E73223A22222C226D657373616765646566696E6974696F6E73223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22247B666C61673D3D747275657D227D2C227374656E63696C223A7B226964223A2242504D4E4469616772616D227D2C226368696C64536861706573223A5B7B227265736F757263654964223A227369642D41343530344644322D303230342D343246352D393036312D344134323938324442343938222C2270726F70657274696573223A7B226F766572726964656964223A227374617274222C226E616D65223A227374617274222C22646F63756D656E746174696F6E223A22222C22657865637574696F6E6C697374656E657273223A22222C22696E69746961746F72223A22222C22666F726D6B6579646566696E6974696F6E223A22222C22666F726D70726F70657274696573223A22227D2C227374656E63696C223A7B226964223A2253746172744E6F6E654576656E74227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D30443235384332342D314631392D343233332D413937362D413044384342394441454143227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A36302C2279223A3235382E373033373033393938313833387D2C2275707065724C656674223A7B2278223A33302C2279223A3232382E373033373033393938313833387D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D34363841393635452D393339422D343733312D413232392D353137384436413042423834222C2270726F70657274696573223A7B226F766572726964656964223A227573657231222C226E616D65223A22E7BB8FE79086E5AEA1E689B9222C22646F63756D656E746174696F6E223A22222C226173796E6368726F6E6F7573646566696E6974696F6E223A2266616C7365222C226578636C7573697665646566696E6974696F6E223A2266616C7365222C22657865637574696F6E6C697374656E657273223A22222C226D756C7469696E7374616E63655F74797065223A224E6F6E65222C226D756C7469696E7374616E63655F63617264696E616C697479223A22222C226D756C7469696E7374616E63655F636F6C6C656374696F6E223A22222C226D756C7469696E7374616E63655F7661726961626C65223A22222C226D756C7469696E7374616E63655F636F6E646974696F6E223A22222C226973666F72636F6D70656E736174696F6E223A2266616C7365222C22757365727461736B61737369676E6D656E74223A7B2261737369676E6D656E74223A7B2261737369676E6565223A223062373632356665646161303565383566323832343836653163396339316239222C2263616E64696461746547726F757073223A5B7B2276616C7565223A226533343665393633363834383463386661376632313763653535306130313836222C226E616D6556616C7565223A22E589AFE7BB8FE79086222C222424686173684B6579223A2231494C227D5D7D7D2C22666F726D6B6579646566696E6974696F6E223A22222C2264756564617465646566696E6974696F6E223A22222C227072696F72697479646566696E6974696F6E223A22222C22666F726D70726F70657274696573223A22222C227461736B6C697374656E657273223A6E756C6C7D2C227374656E63696C223A7B226964223A22557365725461736B227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D30413541464638362D414541342D343231322D423146342D393237354134343036433244227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3231392E39393939393939393939393939342C2279223A3238332E373033373033393938313833387D2C2275707065724C656674223A7B2278223A3132302C2279223A3230332E373033373033393938313833387D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D30443235384332342D314631392D343233332D413937362D413044384342394441454143222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D34363841393635452D393339422D343733312D413232392D353137384436413042423834227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3131392E31393533313234393939393939372C2279223A3234332E373033373033393938313833387D2C2275707065724C656674223A7B2278223A36302E363438343337352C2279223A3234332E373033373033393938313833387D7D2C22646F636B657273223A5B7B2278223A31352C2279223A31342E3939393939393939393939393939367D2C7B2278223A34392E39393939393939393939393939372C2279223A34307D5D2C22746172676574223A7B227265736F757263654964223A227369642D34363841393635452D393339422D343733312D413232392D353137384436413042423834227D7D2C7B227265736F757263654964223A227369642D37363845453443392D333233432D343744422D423438302D344230323746333136433835222C2270726F70657274696573223A7B226F766572726964656964223A227573657232222C226E616D65223A22E4BABAE4BA8BE5AEA1E689B9222C22646F63756D656E746174696F6E223A22222C226173796E6368726F6E6F7573646566696E6974696F6E223A2266616C7365222C226578636C7573697665646566696E6974696F6E223A2266616C7365222C22657865637574696F6E6C697374656E657273223A22222C226D756C7469696E7374616E63655F74797065223A224E6F6E65222C226D756C7469696E7374616E63655F63617264696E616C697479223A22222C226D756C7469696E7374616E63655F636F6C6C656374696F6E223A22222C226D756C7469696E7374616E63655F7661726961626C65223A22222C226D756C7469696E7374616E63655F636F6E646974696F6E223A22222C226973666F72636F6D70656E736174696F6E223A2266616C7365222C22757365727461736B61737369676E6D656E74223A7B2261737369676E6D656E74223A7B2261737369676E6565223A223938623035316230333638316465363032383939336135643134616339336362227D7D2C22666F726D6B6579646566696E6974696F6E223A22222C2264756564617465646566696E6974696F6E223A22222C227072696F72697479646566696E6974696F6E223A22222C22666F726D70726F70657274696573223A22222C227461736B6C697374656E657273223A6E756C6C7D2C227374656E63696C223A7B226964223A22557365725461736B227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D33334642463234452D464537302D343730412D394442352D394231383831453133383437227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3631302E3039303838323633363434362C2279223A3238332E373033373033313034313134327D2C2275707065724C656674223A7B2278223A3531302E30393038383236333634343631372C2279223A3230332E37303337303331303431313432337D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D35353636443037362D414234432D344134322D393938462D323533373738394638313831222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C226173796E6368726F6E6F7573646566696E6974696F6E223A2266616C7365222C226578636C7573697665646566696E6974696F6E223A2266616C7365222C2273657175656E6365666C6F776F72646572223A22227D2C227374656E63696C223A7B226964223A224578636C757369766547617465776179227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D46423539344242452D383030352D344544432D423343382D393738314544323236433935227D2C7B227265736F757263654964223A227369642D34373638373538312D333535422D343335342D383433432D433330343233333238364146227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3735352E353435343431333138323233312C2279223A3236332E373033373033393938313833387D2C2275707065724C656674223A7B2278223A3731352E353435343431333138323233312C2279223A3232332E373033373033393938313833387D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D33334642463234452D464537302D343730412D394442352D394231383831453133383437222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D35353636443037362D414234432D344134322D393938462D323533373738394638313831227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3731352E313133303933303035303039392C2279223A3234342E31343432323136333535323135377D2C2275707065724C656674223A7B2278223A3631302E3537383039383232383233392C2279223A3234332E383437313639393931393532327D7D2C22646F636B657273223A5B7B2278223A34392E39393939393939393939393939352C2279223A33392E3939393939393939393939393938367D2C7B2278223A32302E352C2279223A32302E357D5D2C22746172676574223A7B227265736F757263654964223A227369642D35353636443037362D414234432D344134322D393938462D323533373738394638313831227D7D2C7B227265736F757263654964223A227369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C226173796E6368726F6E6F7573646566696E6974696F6E223A2266616C7365222C226578636C7573697665646566696E6974696F6E223A2266616C7365222C2273657175656E6365666C6F776F72646572223A22227D2C227374656E63696C223A7B226964223A224578636C757369766547617465776179227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D41453541454438342D303734362D343738372D393836462D364137393237433334433334227D2C7B227265736F757263654964223A227369642D35313046453036322D433042432D343643382D394231372D384133383037324132424336227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3431302E353435343431333138323233312C2279223A3236332E373033373033393938313833387D2C2275707065724C656674223A7B2278223A3337302E353435343431333138323233312C2279223A3232332E373033373033393938313833387D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D42324633433135342D434432322D343230412D424538422D363836444534373531423731222C2270726F70657274696573223A7B226F766572726964656964223A2275736572222C226E616D65223A22E8B083E695B4222C22646F63756D656E746174696F6E223A22222C226173796E6368726F6E6F7573646566696E6974696F6E223A2266616C7365222C226578636C7573697665646566696E6974696F6E223A2266616C7365222C22657865637574696F6E6C697374656E657273223A22222C226D756C7469696E7374616E63655F74797065223A224E6F6E65222C226D756C7469696E7374616E63655F63617264696E616C697479223A22222C226D756C7469696E7374616E63655F636F6C6C656374696F6E223A22222C226D756C7469696E7374616E63655F7661726961626C65223A22222C226D756C7469696E7374616E63655F636F6E646974696F6E223A22222C226973666F72636F6D70656E736174696F6E223A2266616C7365222C22757365727461736B61737369676E6D656E74223A22222C22666F726D6B6579646566696E6974696F6E223A22222C2264756564617465646566696E6974696F6E223A22222C227072696F72697479646566696E6974696F6E223A22222C22666F726D70726F70657274696573223A22222C227461736B6C697374656E657273223A6E756C6C7D2C227374656E63696C223A7B226964223A22557365725461736B227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D39394343413337462D413233352D343835332D383437322D444532333341443245443332227D2C7B227265736F757263654964223A227369642D30344339463239412D304242352D343639312D383034432D373634453445304132373136227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3434302E35343534343133313832323332352C2279223A3434382E373033373036363437323739327D2C2275707065724C656674223A7B2278223A3334302E3534353434313331383232332C2279223A3336382E373033373036363437323739327D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D46313234303339432D394237422D344134382D384531332D413635353335384246443345222C2270726F70657274696573223A7B226F766572726964656964223A22656E64222C226E616D65223A22656E64222C22646F63756D656E746174696F6E223A22222C22657865637574696F6E6C697374656E657273223A22227D2C227374656E63696C223A7B226964223A22456E644E6F6E654576656E74227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3930382E353435343431333138323233322C2279223A3235372E373033373033393938313833387D2C2275707065724C656674223A7B2278223A3838302E353435343431333138323233322C2279223A3232392E373033373033393938313833387D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D34373638373538312D333535422D343335342D383433432D433330343233333238364146222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22E5908CE6848F222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22247B666C61673D3D747275657D222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D46313234303339432D394237422D344134382D384531332D413635353335384246443345227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3837392E3932343335323534333835352C2279223A3234342E313431393535363839373437337D2C2275707065724C656674223A7B2278223A3735352E363139363535303932353931322C2279223A3234332E37343938323733303636323033327D7D2C22646F636B657273223A5B7B2278223A32302E352C2279223A32302E3530303030303030303030303030347D2C7B2278223A31342C2279223A31347D5D2C22746172676574223A7B227265736F757263654964223A227369642D46313234303339432D394237422D344134382D384531332D413635353335384246443345227D7D2C7B227265736F757263654964223A227369642D46423539344242452D383030352D344544432D423343382D393738314544323236433935222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22E4B88DE5908CE6848F222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22247B666C61673D3D66616C73657D222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365222C2273686F776469616D6F6E646D61726B6572223A66616C73657D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D42324633433135342D434432322D343230412D424538422D363836444534373531423731227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3733362E303435343431333138323233312C2279223A3430382E373033373036363437323739327D2C2275707065724C656674223A7B2278223A3434312E313234353432383830373233312C2279223A3236342E343831303438303538363234377D7D2C22646F636B657273223A5B7B2278223A32302E352C2279223A32302E3530303030303030303030303030347D2C7B2278223A3733362E303435343431333138323233312C2279223A3430382E373033373036363437323739327D2C7B2278223A39392C2279223A34302E3030303030303030303030303033367D5D2C22746172676574223A7B227265736F757263654964223A227369642D42324633433135342D434432322D343230412D424538422D363836444534373531423731227D7D2C7B227265736F757263654964223A227369642D39394343413337462D413233352D343835332D383437322D444532333341443245443332222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22E9878DE696B0E794B3E8AFB7222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22247B666C61673D3D747275657D222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365222C2273686F776469616D6F6E646D61726B6572223A66616C73657D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D34363841393635452D393339422D343733312D413232392D353137384436413042423834227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3334302E3534353434313331383232332C2279223A3430382E373033373036363437323739337D2C2275707065724C656674223A7B2278223A3136392E39393939393939393939393939372C2279223A3238342E363634363432313339373631367D7D2C22646F636B657273223A5B7B2278223A302E393939393939393939393939393939392C2279223A34302E30303030303030303030303030397D2C7B2278223A3136392E39393939393939393939393939372C2279223A3430382E373033373036363437323739337D2C7B2278223A34392E39393939393939393939393939372C2279223A34307D5D2C22746172676574223A7B227265736F757263654964223A227369642D34363841393635452D393339422D343733312D413232392D353137384436413042423834227D7D2C7B227265736F757263654964223A227369642D39353037343945412D344242362D343237362D423637412D444530334533344130353733222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C226173796E6368726F6E6F7573646566696E6974696F6E223A2266616C7365222C226578636C7573697665646566696E6974696F6E223A2266616C7365222C2273657175656E6365666C6F776F72646572223A22227D2C227374656E63696C223A7B226964223A224578636C757369766547617465776179227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D38344442433035362D303639312D343733452D383243462D443332354546373336413732227D2C7B227265736F757263654964223A227369642D30443039333043392D394241312D344636382D383545412D333834453136423430394130227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3330342E39393939393939393939393939342C2279223A3236332E373033373033393938313833387D2C2275707065724C656674223A7B2278223A3236342E39393939393939393939393939342C2279223A3232332E373033373033393938313833387D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D30344339463239412D304242352D343639312D383034432D373634453445304132373136222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22E58F96E6B688E8AFB7E58187222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22247B666C61673D3D66616C73657D222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365222C2273686F776469616D6F6E646D61726B6572223A66616C73657D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D46313234303339432D394237422D344134382D384531332D413635353335384246443345227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3839342E353435343431333138323233322C2279223A3439342E373033373036363437323739327D2C2275707065724C656674223A7B2278223A3339302E35343534343133313832323331342C2279223A3235382E343330323636363433303536327D7D2C22646F636B657273223A5B7B2278223A35302E3030303030303030303030303131342C2279223A37397D2C7B2278223A3339302E35343534343133313832323331342C2279223A3439342E373033373036363437323739327D2C7B2278223A3839342E353435343431333138323233322C2279223A3439342E373033373036363437323739327D2C7B2278223A31342C2279223A31347D5D2C22746172676574223A7B227265736F757263654964223A227369642D46313234303339432D394237422D344134382D384531332D413635353335384246443345227D7D2C7B227265736F757263654964223A227369642D30413541464638362D414541342D343231322D423146342D393237354134343036433244222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D39353037343945412D344242362D343237362D423637412D444530334533344130353733227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3236342E363438343436383730303037352C2279223A3234342E313133343337353334343137367D2C2275707065724C656674223A7B2278223A3232302E36323838393638373939393234352C2279223A3234332E39323238373637313139357D7D2C22646F636B657273223A5B7B2278223A34392E3939393939393939393939393938362C2279223A33392E3939393939393939393939393938367D2C7B2278223A32302E352C2279223A32302E357D5D2C22746172676574223A7B227265736F757263654964223A227369642D39353037343945412D344242362D343237362D423637412D444530334533344130353733227D7D2C7B227265736F757263654964223A227369642D37463032463244352D413642412D343233342D413732342D334638393844323335413442222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365222C2273686F776469616D6F6E646D61726B6572223A66616C73657D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3339302E353435343431333138323233312C2279223A3232332E34303037363130373131373438387D2C2275707065724C656674223A7B2278223A3339302E353435343431333138323233312C2279223A3137322E363031353334383239363530357D7D2C22646F636B657273223A5B7B2278223A3230352E38303433363431303339333632382C2279223A3137312E303333383031323134313530327D2C7B2278223A32302C2279223A32307D5D2C22746172676574223A7B227265736F757263654964223A227369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535227D7D2C7B227265736F757263654964223A227369642D30353145353938322D454646442D343337372D423137392D333730343841323346433232222C2270726F70657274696573223A7B226F766572726964656964223A226368696C64222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C226173796E6368726F6E6F7573646566696E6974696F6E223A2266616C7365222C226578636C7573697665646566696E6974696F6E223A2266616C7365222C22657865637574696F6E6C697374656E657273223A22222C226D756C7469696E7374616E63655F74797065223A224E6F6E65222C226D756C7469696E7374616E63655F63617264696E616C697479223A22222C226D756C7469696E7374616E63655F636F6C6C656374696F6E223A22222C226D756C7469696E7374616E63655F7661726961626C65223A22222C226D756C7469696E7374616E63655F636F6E646974696F6E223A22222C2269737472616E73616374696F6E223A2266616C7365227D2C227374656E63696C223A7B226964223A2253756250726F63657373227D2C226368696C64536861706573223A5B7B227265736F757263654964223A227369642D39443541314632382D393042372D343644322D414637462D353446464637383631343146222C2270726F70657274696573223A7B226F766572726964656964223A22737374617274222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22657865637574696F6E6C697374656E657273223A22222C22696E69746961746F72223A22222C22666F726D6B6579646566696E6974696F6E223A22222C22666F726D70726F70657274696573223A22227D2C227374656E63696C223A7B226964223A2253746172744E6F6E654576656E74227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D33453941414432332D343444412D344138352D383242442D443643383330413443343938227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A34382E3531383531383436343031303338342C2279223A3130312E30353130343034353136333330337D2C2275707065724C656674223A7B2278223A31382E3531383531383436343031303338342C2279223A37312E30353130343034353136333330337D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D32333041443633362D423038332D344132412D383446342D464445353430464443314333222C2270726F70657274696573223A7B226F766572726964656964223A22616C6C6D616E61676572222C226E616D65223A22E680BBE7BB8FE79086E5AEA1E689B9222C22646F63756D656E746174696F6E223A22222C226173796E6368726F6E6F7573646566696E6974696F6E223A2266616C7365222C226578636C7573697665646566696E6974696F6E223A2266616C7365222C22657865637574696F6E6C697374656E657273223A22222C226D756C7469696E7374616E63655F74797065223A224E6F6E65222C226D756C7469696E7374616E63655F63617264696E616C697479223A22222C226D756C7469696E7374616E63655F636F6C6C656374696F6E223A22222C226D756C7469696E7374616E63655F7661726961626C65223A22222C226D756C7469696E7374616E63655F636F6E646974696F6E223A22222C226973666F72636F6D70656E736174696F6E223A2266616C7365222C22757365727461736B61737369676E6D656E74223A7B2261737369676E6D656E74223A7B2261737369676E6565223A226438313861633661383663663161363464323138346266303639396436376138227D7D2C22666F726D6B6579646566696E6974696F6E223A22222C2264756564617465646566696E6974696F6E223A22222C227072696F72697479646566696E6974696F6E223A22222C22666F726D70726F70657274696573223A22222C227461736B6C697374656E657273223A6E756C6C7D2C227374656E63696C223A7B226964223A22557365725461736B227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D34454238313431392D314141372D343937452D413545452D453541454631374335453042227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3138392E39393939393939393939393939372C2279223A3132362E30353130343034353136333330337D2C2275707065724C656674223A7B2278223A38392E39393939393939393939393939372C2279223A34362E30353130343034353136333330337D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D31434331333342322D343442312D343833302D394335392D374433353634433933334641222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C226173796E6368726F6E6F7573646566696E6974696F6E223A2266616C7365222C226578636C7573697665646566696E6974696F6E223A2266616C7365222C2273657175656E6365666C6F776F72646572223A22227D2C227374656E63696C223A7B226964223A224578636C757369766547617465776179227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D41323335414337362D354242452D344133382D383243342D313045453831414638343635227D2C7B227265736F757263654964223A227369642D44413934353339452D463639342D343041312D424534412D424343433144394244313144227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3237352C2279223A3130362E30353130343034353136333330337D2C2275707065724C656674223A7B2278223A3233342E39393939393939393939393939372C2279223A36362E30353130343034353136333330337D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D46363844434341302D463741342D343444342D394534342D353641363832443837454341222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22657865637574696F6E6C697374656E657273223A22227D2C227374656E63696C223A7B226964223A22456E644E6F6E654576656E74227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3334382C2279223A3130302E30353130343034353136333330347D2C2275707065724C656674223A7B2278223A3332302C2279223A37322E30353130343034353136333330347D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D36393442374132412D393841442D343530442D383146452D313135424335363237354244222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22657865637574696F6E6C697374656E657273223A22227D2C227374656E63696C223A7B226964223A22456E644E6F6E654576656E74227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3236392C2279223A3136337D2C2275707065724C656674223A7B2278223A3234312C2279223A3133357D7D2C22646F636B657273223A5B5D7D5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D37463032463244352D413642412D343233342D413732342D334638393844323335413442227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3539362E333439383035343232313539342C2279223A3137322E31303230383039303332363630387D2C2275707065724C656674223A7B2278223A3138342E37343130373732313432383638362C2279223A312E34323130383534373135323032303034652D31347D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D33453941414432332D343444412D344138352D383242442D443643383330413443343938222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D32333041443633362D423038332D344132412D383446342D464445353430464443314333227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3237332E38323738383237343432393137342C2279223A38362E30353130343034353136333330347D2C2275707065724C656674223A7B2278223A3233342E323333353534303139323935382C2279223A38362E30353130343034353136333330347D7D2C22646F636B657273223A5B7B2278223A31352C2279223A31357D2C7B2278223A35302C2279223A34307D5D2C22746172676574223A7B227265736F757263654964223A227369642D32333041443633362D423038332D344132412D383446342D464445353430464443314333227D7D2C7B227265736F757263654964223A227369642D41453541454438342D303734362D343738372D393836462D364137393237433334433334222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22E5908CE6848F222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22247B666C61673D3D747275657D222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D37363845453443392D333233432D343744422D423438302D344230323746333136433835227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3530392E35363538353533373434373936372C2279223A3234342E3134363035383632333436327D2C2275707065724C656674223A7B2278223A3431302E3533343738323038383137322C2279223A3234332E383533313435353137393831367D7D2C22646F636B657273223A5B7B2278223A32302E352C2279223A32302E357D2C7B2278223A34392E39393939393939393939393939352C2279223A33392E3939393939393939393939393938367D5D2C22746172676574223A7B227265736F757263654964223A227369642D37363845453443392D333233432D343744422D423438302D344230323746333136433835227D7D2C7B227265736F757263654964223A227369642D41323335414337362D354242452D344133382D383243342D313045453831414638343635222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22E5908CE6848F222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22247B666C61673D3D747275657D222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D46363844434341302D463741342D343444342D394534342D353641363832443837454341227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3530342E32343839303939393834363832362C2279223A38362E34323734383336353430383030367D2C2275707065724C656674223A7B2278223A3435392E36333934393434333031303534362C2279223A38362E31343333343732343931383630327D7D2C22646F636B657273223A5B7B2278223A32302E3530303030303030303030303031342C2279223A32302E357D2C7B2278223A31342C2279223A31347D5D2C22746172676574223A7B227265736F757263654964223A227369642D46363844434341302D463741342D343444342D394534342D353641363832443837454341227D7D2C7B227265736F757263654964223A227369642D44413934353339452D463639342D343041312D424534412D424343433144394244313144222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22E4B88DE5908CE6848F222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22247B666C61673D3D66616C73657D222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D36393442374132412D393841442D343530442D383146452D313135424335363237354244227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3434302E30383436333334333233383532362C2279223A3133342E333339333232313439353833337D2C2275707065724C656674223A7B2278223A3433392E38353834353834393631383834362C2279223A3130362E303930353433323636373635397D7D2C22646F636B657273223A5B7B2278223A32302E3530303030303030303030303031342C2279223A32302E357D2C7B2278223A31342C2279223A31347D5D2C22746172676574223A7B227265736F757263654964223A227369642D36393442374132412D393841442D343530442D383146452D313135424335363237354244227D7D2C7B227265736F757263654964223A227369642D35313046453036322D433042432D343643382D394231372D384133383037324132424336222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22E4B88DE5908CE6848F222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22247B666C61673D3D66616C73657D222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D42324633433135342D434432322D343230412D424538422D363836444534373531423731227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3339302E39383338303830363836333436332C2279223A3336372E38363338363638373439393039357D2C2275707065724C656674223A7B2278223A3339302E36363935373435363738313135342C2279223A3236342E34383130343334333933333531377D7D2C22646F636B657273223A5B7B2278223A32302E352C2279223A32302E3530303030303030303030303030347D2C7B2278223A35302E3030303030303030303030303131342C2279223A34307D5D2C22746172676574223A7B227265736F757263654964223A227369642D42324633433135342D434432322D343230412D424538422D363836444534373531423731227D7D2C7B227265736F757263654964223A227369642D38344442433035362D303639312D343733452D383243462D443332354546373336413732222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22E4B88DE5908CE6848F222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22247B666C61673D3D66616C73657D222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3337302E363730303939393039323233372C2279223A3234342E31303931303034353732383030387D2C2275707065724C656674223A7B2278223A3330352E33373533343134303839393932352C2279223A3234332E37393833303735333930383735357D7D2C22646F636B657273223A5B7B2278223A32302E352C2279223A32302E357D2C7B2278223A32302C2279223A32307D5D2C22746172676574223A7B227265736F757263654964223A227369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535227D7D2C7B227265736F757263654964223A227369642D30443039333043392D394241312D344636382D383545412D333834453136423430394130222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22E5908CE6848F222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22247B666C61673D3D747275657D222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365222C2273686F776469616D6F6E646D61726B6572223A66616C73657D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D30353145353938322D454646442D343337372D423137392D333730343841323346433232227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3238342E323935353338353539393932382C2279223A3232342E34393134393033323031333735337D2C2275707065724C656674223A7B2278223A3139332E35383236343937343733333034362C2279223A3137322E313532383934353937323330387D7D2C22646F636B657273223A5B7B2278223A32302E31363137303636333435343032382C2279223A312E323837353339313237343833333730337D2C7B2278223A362E3530383031393933353239333633372C2279223A3137302E38303635303532363235393035357D5D2C22746172676574223A7B227265736F757263654964223A227369642D30353145353938322D454646442D343337372D423137392D333730343841323346433232227D7D2C7B227265736F757263654964223A227369642D34454238313431392D314141372D343937452D413545452D453541454631374335453042222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D31434331333342322D343442312D343833302D394335392D374433353634433933334641227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3431392E333839353234303834323934342C2279223A38362E34363037373339383738363638347D2C2275707065724C656674223A7B2278223A3337352E333639393734303934323739332C2279223A38362E32373032313331363533393932347D7D2C22646F636B657273223A5B7B2278223A35302C2279223A34307D2C7B2278223A32302E3530303030303030303030303031342C2279223A32302E357D5D2C22746172676574223A7B227265736F757263654964223A227369642D31434331333342322D343442312D343833302D394335392D374433353634433933334641227D7D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A313230302C2279223A313035307D2C2275707065724C656674223A7B2278223A302C2279223A307D7D2C227374656E63696C736574223A7B2275726C223A227374656E63696C736574732F62706D6E322E302F62706D6E322E302E6A736F6E222C226E616D657370616365223A22687474703A2F2F6C656E6F73702E636E23227D2C227373657874656E73696F6E73223A5B5D7D, + NULL); +INSERT INTO `act_ge_bytearray` +VALUES ('142519', 14, 'source-extra', NULL, + 0x89504E470D0A1A0A0000000D49484452000003BF00000221080600000086FB0D1D000000206348524D00007A26000080840000FA00000080E8000075300000EA6000003A98000017709CBA513C0000000467414D410000B18E7CFB5193000000017352474200AECE1CE900000006624B474400FF00FF00FFA0BDA793000000097048597300000EC400000EC401952B0E1B000020004944415478DAECDD097854D5F9C7F17726FB4A080989088208B20B620444145454A854AD08844544C5B58A50A46E55B0EE555BFBB7D52A5A5141826241C50A8A821659944D0908B21804214080908410B2FECF7B3213424820099964327C3FCF739FC9EC933377EEBDBF7B368700A7A0952B575E565454342E3737B77B767676A3C2C24207A50200288FC3E190D0D0D08C9090901F9C4EE7DF3B77EE3C935201807AB83DA708702AF9F2CB2F3B040505CD34C1F7EC264D9A38A3A2A2A4418306620E66281C0040B90A0B0B25333353D2D3D365E7CE9D66175294626E4EECD9B3E7B7940E00107E01AFF3BFFFFDEFB70505051F9C79E69901CD9A35B367F20100A8AA6DDBB6C9962D5B0A222222EE3CEFBCF326532200503FF85104385582AFB978AF73E7CE41717171045F0040B5698BA1989818A709C1FDEFBCF3CE6D93274F5E4DA90000E117A873F3E6CD6B6B2E3EEBD2A54BA81EB0000070B2020303253A3ADAB975EBD67EC3860DFB70EAD4A9BB291500F06E7474C4A9708032F9ACB3CE0A22F802006A527878B898FD4BB0F10EA50100845FA04E7DF6D9675D9C4EE739CD9A35F3A7340000354DC790F0F3F36BF5F9E79FF7A0340080F00BD41987C331F0F4D34F2FA48F2F00C0539A366D1AEC743A8750120040F805EA8C9F9F5FBFE8E8E8284A0200E029515151FE26FCF6A7240080F00BD49982828273E8EB0B00F0A4888808C9CFCF6F4D490000E117A84B814E27AB3900C0830753C5FB1976360040F8050000000080F00B0000000000E1170000000000C22F0000000000845F0000000000E1170000000000C22F0000000000845F000000000008BF0000000000107E010000000020FC020000000040F8050000000080F00B0000000020FC020000000040F8050000000080F00B0000000000E1170000000000C22F0000000000845F000000000008BF0000000000107E0100000000845F000000000008BF0000000000107E010000000020FC020000000040F8050000000080F00B0000000000E1170000000000C22F0000000080F00B0000000000E1170000000000C22F0000000000845F000000000008BF0000000000107E0100000000A80C7F8A00404D397CF8B07CB7E53BC94ECB16E761CEADD5967CFF7C713472C8392DCE91D3224EA34000000008BF003C65EFBEBDB2227985EC8DD92B07CE3A2087430E5328B52430275022D32365F5CAD5B2AFCD3EE910DF814201000020FC02A8695AE3BB3A79B56C3D73AB6487675320B52C373857D2E2D3242B324B6483485C789CC484C75030000000A5D02E11C0494BD99A227B62F6107CEB584E688EEC6BBC4F92372553180000006550F30BE0A4EDDABD4BD25BA69FF07121BB43242C254CFC33FCA5C8AF4872E27224F3EC4C29F42FA4106B48465486C4FE144B410000009441CD2F8093969B937BC23EBE213B43A4C10F0D24E04080388A1CE2CC774AE8AFA1D2E8BB46E22870508835F55D04E78A338F4D3B000000E117409D08DF126E436F59FE59FE12921A420101000080F00BA09E6F68729DE29F5D712F8B808C000A09000000845F00F5DB099B35D3E517000000845F000000000008BF0000000000107E01D4AD82A00229721455787F6120ED9E01000040F805E0035B9A43A71D2AF72E3BDF6FE31CCA08000000845F00F5DF810E07A420A4E098DB33DA66485E833C0A08000000845F00BEEB8423410300000035C09F2200E06901990112B93E52FC0EF91D735FE44F91E2CC734A668B4C4EC701000080F00BA0FE711439246C6B98846F09AFB886B750247C73B804EF0A9603ED0E486E542E0507000000C22F80FA21E0408034D8D0C05E566A6394E52FD1CBA325FB8C6CC96895412D3000000008BF00BC3FF8C62C8FB1B5BA55E1AE29F6CFF6977D5DF65190000000A831D4AD00A871B68973E1493E1F3849D9D9D9140200002841CD2F801A971B9D2B3B2FDF4941A0CE7CFFFDF7F2CC33CFC8030F3C209D3B77A64000000035BF0000DFB27CF972F9BFFFFB3FE9DFBFBFFCF39FFF9475EBD651280000809A5F0080EFF8EAABAF64DAB4693266CC185BE3DBBE7D7B79E18517E4E1871F96962D5B7AF4BDD7AF5F2FFEFEFE76294F7A7ABAA4A6A64ABF7EFDCABDFF89279E90112346488B162D243F3FBFC2D7010000845F00C0296CD1A24536F86A536777D04D484890912347DA26D07FFEF39F253E3EDE63EFBF74E9521B70BB74E952729BBE5F70707049385EB162C551E177E1C285F6322B2B4BC2C3C3ED750DC89B376F96DB6FBFDD7E7E000040F80500C0FAF0C30F65EEDCB947055FB7DEBD7B8B9F9F9F3CF5D453F2C8238F486C6CACC73E8706DF3E7DFA9404DAB4B43449494991EDDBB74BD3A64D252C2CECA8C7BB1F7BE79D77CA2BAFBC229B366DB24DB5274F9E2C39393925CF030000845FC0EBA4E6EE93CFD3BF936F337E941FB3B7CA9EBC74C92ECC91206780C4044449FBD0E6D235BC8D0C88EE29F181D11418709266CD9A25F3E7CF978913275658B3DBAB572FC9CBCB93C71F7FDCE301D85D9B5B9ABB29B39B06DB3973E6484C4C8CBD7EE18517DAE769D8BDEAAAABECDF5A53FCEBAFBFDAFF8B26D00000107E01AFF1F9FEE53275F767F2EBE13DD23DB29D5CD5E80219D774B00DB8A1CE601B80F7E765CA4F87B6C9E28C6419B1FE717BDFA0D84BE49A46BD2840A01A66CE9C295F7FFDB54C9A34E98481F6924B2E916DDBB6D900FCE4934F4A444484473E93D6FE6A187707DBD5AB57CBB5D75E6B9B33BB6953E8EBAFBF5E9292926C736777EDAE865C0DC09F7CF289ADFD8D8A8AF268F9EDDBB7CF8E8CAD8B968D5ED760AE9F4FCBA759B366D2B1634739F7DC733DDA641C0000C22F500F68D87D74EB1BB6C6F7BEA689727183CEE2E7F03BE6711A80438382E5F4A058B924AAAB3C7CC648F9FAC0F7F2E2AFEF49D2EEF9F24CCB3BA4791007974065BDF6DA6BB69970556A72B5FFAF863B0DBF1A98DDFD716B8ABBEFAEF6ED7DFAE9A7ED6D6FBDF596DC7DF7DDE53E5E3F8B8662773F6177C0D4D7F164F0D5A0ABC15B6B97BB76ED2ADDBA7593C18307DBF70C0D0DB59F2B33335376ECD8214B962CB127195AB76E6D1FE3E981C3000020FC025E68CEBEC5F2D42FEFC8CDF157C94D71FDCB0DBDC7A34159977776CF93A13F3E26F7371B4E2D3050C9E0BB65CB161B7CAB5A837BDB6DB7D9E76B1F60ED23AC61AFA6681F5FADBD2D5DCB6B77B6C769B65CBA9FB09B06664F282828B0A177F1E2C572F5D557CBD8B163252020E098C7E949015DF4A4828E9A7DEBADB7CA82050BE4B9E79E93EEDDBB4B6262628D9F38000080F00B78A905E92BE5F9ED49F272AB3F4897F0D627F55A3734BE5212C2DBCA9D9B5E90C385793238F6120A182887F6DBD5397CB579AE4E5F54DDA6CB1A805F7AE92579F1C51765C28409E506C0EAD2BEBD5A233D65CA14DBF4594780D69AD4F2E8FD5AFBAABEF8E20B3B389706650D98354DCB4CFFDF56AD5AD9105B95D0AF0386F5EDDBD7F69D9E3D7BB6AD351F3F7EBC47FB4E030050D39C140150755AE3FBD82F53645A9B474E3AF8BAB50B6D6E5FEFE59DB3E4C3BD8B2864A09CE0ABE1EDF0E1C3D5AAF12DEB8E3BEEB0A15783A0BE764DD1A0AB4D9E478D1A2503060CB0AF5F7AB0ABD221596DDDBA55DAB66D2B43860CB101586B81753A249DF7D71D8C6B22F86A60D5E6CDDAF4BBBAB5DD5ADBABB5BE1A84B5E67CCF9E3DAC980000C22FE0ABB48FAF36757EB1E53DB6FF6E4DD2D77BA5D5787976DB34D992B383C2064A05CA175E78C136DBD59ADA9A6872ABC1D7DDEC57A717D2D7AE09DAE7576B48DDB47677F9F2E576202BBDCF1D7C1F7BEC315BCB1B141464FBFAEAC0525A9BAA35C53ADAB3F613D6FFF964E9FFA5270DAEB8E20A1BC66B82865F1D955A3F5F45B5DA0000781B9A3D0355F450CA64DBC7B7A66A7CCBD21AE03B9B5C2B0FFFFC9A4C6F378902C7292F3B3BDB0E50A50151FB9E6A58D580A873E39675FBEDB71FD37FB6A2C76AE08D8E8E967BEEB9479E79E6193BBAB2BEBE36F1ADD60ED5045977B82D4D0791D2D19C6FB8E10679F3CD374BC2EF79E79D6743A44E83A4B5B2A56978D6E7FDED6F7F3BE9F2D33EBEDAD4B9A6826FE900AC7D9CF5F5B5961B00006FE74711C0978D1C3972524D8E4CAAD3197D99BE429E6A719BF83B3CF7F3E91CD64ADEDE3D5742FD82A56DE8195E5FCE3AF0D09E26347FF4168D7736F6991179DDC157A7DCD166CA818181F676ADF9D5DB3232326CB82D2C2CB4B7AF5DBB567EFBDBDF8AD379A461D3F3CF3F7F54F35C7DDE75D75D279D3A752A09AD3ACFAE4E2FB471E3463BAD4FE9E757D639E79C639B2F974743F6E8D1A34BA63FD2F7D4C7EAFBE86D1AD84B2FEEEFCFFDFF56978EEAFCDE7BEFC99831636AB45FB39B86EA37DE78C396A5A7A765AA0FDBC177DE79E731B64000E0BD68F60C5481CEE3ABD3190539033CFE5E0F341B6EA740AA0DB366CDB2CD326BAAD9274E4D35BD1E6960D5BEBDCD9B372FB746D63D28944ED5E3A64D705F7EF9E592EB8B162D929F7EFAA9E4BAD6CC6A70BEF4D24B8F7A2D0D863AF2B3865F13607CA64CB556569B27D7E488D6A569590E1C3850A64D9BC60F0000E0F568F60C5492CEE3BBF570AA9D9AA836F48CEC248FA6FCDBF631AEE9BEC56569CD903B0068EDD5E5975F2E6DDAB4F19AA94CF6A6EC95C0B04089882D1EE068C5FB2BA4F979CD25A665CC318FCDD89521E93BD2E58C738FAE312FCC2F94ECF46C098F09AFD27B17E416885F60F9B5FC8BDF5A2CDD8776AFF07EF7635AF66829F16DE2E5D735BFCAE99D4EB7B7EFDBB64FA29B45FBD46FC4BD1E69D0D240AA4D77ABBB1E69F0D5019534E00E1A34A8C2A6C8DA6459477DD6DA536D826BCB7CF162B9E69A6BE4B4D34EB35306951ECC4A3FCB5D77DD556E2DA87E6E0DC08F3FFEB87DEE95575EE935651A1212629B4957A54C75902B1D304BFB357BD225975C623FA74EEFE49EA71800006F44B367F8B49A6CF63C6BEFD712E1172A97459D576B9F7F67EE5EF935374DBA869FEDD1F7F9E0830F8A036261A1ECDCB9D3D696CD9D3B57525252EC4177A3468D8EDB0FD2D3CD9E43A342E5F5E1AF4BE7DF7616FF407F59F8CA42E93EBCFCA96016BDB1481C0E87C49D1D27DF257D678370DACF69F2DFA7FE2B7987F34A42F1C17D0725E5DB14D9BB75AFECFC71A7FCFCEDCFB274EA527BDFBACFD649E6EE4CF965D52FF2E3FC1FE5AC9E67D9DBD37F4D97E0C823A163F7C6DD927B28571A366D58725BD9C72C7B779974BEBAF8734FB9698A240C4A10A79F535E1BF29A741FD6DD7ED69A5657CD9EDDEB9186CD5F7EF9C5AE475F7EF9A5FCFAEBAF366C9E683D72DBB163873CFBECB3B629F2E0C1838FDB045943A0F69F3D74E890ECDDBB578A8A8AECEDAB57AF9675EBD6D941A6DCB769D3639D4AE878D308858585D9FBFFFDEF7FDBA6C975DD7CDC5DA6FA3FBACB544784D6323A51997EF3CD37B6D9748F1E3D3CFA19F5FBD1ED466666A69C7DF6D972AAA2D93300783F6A7E814AFA36E347B9AAD105B5FA9EDD22DAC9F43D5FC8E8F801B5FEFFEA7432CB962DB38B860077AD93F687ACEE8040D5A12155C36FB7A1DD2420284036FE6FA35CF5F0557260E7011B3283C2824A1EABB5B45AF37BD9BD97C9FA05EB8B83A6BFD3D6B286350A930B6FBAF048C8890EB30139796EB274B9A68B048707DB00DCFEF2F6F2DDBEEFA4E505C5A167DDE7EB4A9EB362E60A896F1B2F0E677160CDDC93693F83FB319B166DB2AFABEFAF35CD1AB60BF30A256D4B9AFD3FA29A4495D4126B6076BF8E2FD340F4D5575FD94583AA06CB8484840AD7239DF647FBF85E7DF5D5951EA0496B797FF8E10769D7AE9D242727DBDBB41678FFFEFD257D817544650DB6DAD7F74434243FF4D043F2E8A38FDACFA8359BDE242B2BABA44CF5FFD2705B5E996A595C7041ED6CB3F47BFDECB3CF6A7C502D000008BF401DF8317BABDCD72CB156DFF3EC9066E67D53EAFC7FD75A277710D683EDF6EDDBDB26A17AE98941744AD3A6C26BE7AD953697B4B181B6A8B0487E4DFE55367EBD519A7569265D071EE9EFB974DA52B9F28F57DAE6CD8BDF5C2CCD3A3713FF207FF9E4F14FA4C3951D6C20D530ECD6E0B406E217E0671FA3A1B420AFC006D91DC93B6C4D6D79F475DCB45659436C930E4DECF5B8D671D2A84523FBB706DFCC5D99367C854485D8DB97BEB3D47E367D4FB7C9C326CBF09787DB80EFEBB43FAE3BB4E91CBD3A48D2C5175F5CB21EB983EFD0A143AB1C3875B4E1BFFEF5AFB6E9B20E92654F8694EA27ABC15B1F53D91337B1B1B1B609F49FFFFC67FB9AC7AB2DAE4B7A92CA5DA61AEE3B77EE5C52A65A9E3A276F6D68D2A4891D5C0B0000C22FE003F6E4A54B6C40ED8E66DA3020420EEECD909933677AD5C1F6AA55ABECE20E099EAC5DD2B07A5AFBD36C8D6C695A935ABAFF6ECA772936B86A88DCF4CD2619F4C220C93F9C2F5FBFF6B50CFCCB401B9A678C9B216DFAB4B18159AF6B18D6C09B919A216929693694EAFBE86B9FDDBBB8F966E99A5FADD19DF7DC3C1BBAD5AE0DBB243C3ADC86E07DBFEC939C8C1CE93BAEAFBD4F6BA4835A06D960ADB5C1FA180DBE9BBFD92CD16714F7F5D5D7BA72C295351E7CB566D09BD699F2688DB0F6CDD5C5AEEB0D1BDA75AB3AC157E908CE3A4AF2CA952B8F1AE04A454646DAD7D44058153AD0D61FFFF8471BAA75D0A9B8B838AF2ED383070F1E55A6DAA45EFB4ED7463F5C3D99A1DF290000845FC0076417E648A8B3760780D2F78B48CE970F967CE0BD2705CCC1F5B7DF7E2B2DFAB5F0C8EB6B48AD88BB49AB6A717E0BB979CACDB2E1AB0D72FE90F3252B2DCB2EFD1FE85FF298A12F0D95590FCDB2E1579B1CFFF8C58FB649B23647D6005A999A5FED3FAC81556913EB3697B6B14177CB922DB2F797BD4707BC3D99F6F597BFB75CCE4F3CDFBE47A7AB8AA7D739907A40125F4A94C090C01A2F330D7FEE9313F5853651D690AA73C7569736B95DB06081ED835A7ADDD01A609DFEA83A7470291DFC4AFBDAD637DAD759478B764FE9E4495AB3AE35FB0000107E011FA041B4B603B0BE5F66477F19D8E41A8FBE8F7B509D13D19A24F7E0416E5A1BA6FD0DD324CD239F4D436AD69E2C1B4A5337A4DA5193D5C1BD07E5F48EA71FF5D8ED6BB6DBD0AACD8CB5FF6F5078906D32AD7FFB07FBDBA6D2DABFD7AD63FF8E92B5374B5AF56A6503ACD6CC96AEF9D57EC01A608F0ADCF98525B5C13BD7ED94D006A1F6B5F5EFC8F8C892C76918D6C1B734F0260C4E3826E436886FE091E0AB74D0A1BA1CF0AA3AB4E6579B2B6BD3FAEA3631D626CD5A7B5C3AF82ABDADEC7A5B591B366CB08339697FF7BAA8F9AD4C99EAEF5297B2FFB79E04D0FED0B54183AFB78C0E0F0000E1173849DAE4599B3E370FAABDA93CF6E7654A58A348B9FED2EBEBEC00BB74E0D54BEDFFA835491A06B47FA1F6D59C3F7FBEC7C26F6CCBE2699E34446AB3620D99DAFC58A73ADAB3F9C808D35A433CFBE1D9B66FF0B9D79D5BD20F57BD3DFA6D19F9FAC8639A4E977EAE8EECDCF692B63628BB9B43EFDFBE5F0EEE3F2851A71F69EEAECDB0DDAF53BAE6578372E99A5F1D304B97997F3C7EF363AD9DAEEAF44B27A273D99E4C0D6A6D84DFF2D623779F5F0DC1D569FAFCE1871F96F4F72D4DFBACBFF2CA2B72DF7DF755E9F5F4F3FCE52F7F915B6EB9457AF6EC5927DB9DCAFC36DD4BD932D526DBB515D8B5C9B3367D060080F00BF88076A1CDEDA057B5197E7F3AB4CDBC6F8B5AFF5FB506CD3D58901E546B8D8E1E4C6BDF5E3DB8D683ECDAE01EE04AFBE416362DB4CD95577EB0D2DEA7FD6D359CEA3CBAC3FE31CCD6108FF9EF187BA9E15547856E7D51EB0A5F5B43AED6E06E5EBCD986081D195A03F0E1ECC3B27BD36E1BB6B5E638A441C851CFD39AE7F26A7E752E621D3DFA8421614FA6ED1F5C12B0566C3D6A102D5F76A2F548FBD83EF2C823767E5F559500AC53FF7CF2C927929B9B7BE44445A9E6CF3AF5918E7EDCB163C74ABD9E36E77FE6996764C4881175167CCBDD69FBFBDB305F99DFA696A706F8DAE8F3ABE5AFFDAE010020FC023EA05B643B599C912CFD1AD6DEA8AFDF66FE68A73BAA6D1A7CDDD3D2E8F4295DBB76F5F8A8CE65E564E6D8519AC7CE1D2B2B3E582105F9C561DC3DBAF3EA0F57CB75CF5C676B4E6D58D9BC473E7BE133898C8B9433BB9D59612DEF8EB53B6CAD704E568E0DB9EEE0ACCEEC7E667140DD9D696B6D75A02A7D7C695AEBEC56BAE6B72C6D429D7B3057F20EE515071513E2B7FFB05D56CF5E2D17DD7A917D7FA503616D5BBDAD64102D5F0CBC55598F3440E908CB1A807500A7CA4E9DF3AF7FFDCB3EBEF4FBEA929E9E5EB24EBFF4D24BF2EAABAF9EF8044566A67D7F9D63D8DBA639D2E05BD932D5A0AF0375D5C648D5DA5C5DA79A020080F00BF880CBA3CE9737523F9182A202F173D4CE3CB79FEF5F2E6FB579A8D6FE47AD35D211717BF7EE6D2F6BAB86B7DCD014112CE3BF1C6FFF3EEB82B3E4F3BF7D2EDF7FF47D49903CADDD69F6EFDE77F6B697B167C54ABF3FF62B996A68CD276B6C13650DB6DACFD75D5B9B9B9D2B118D23242236A224C86A1F5FED1BEC6E7EAC4D98B546D686F08C1C3B976F74B3E8634F12E415D8F0AA531C1D539651A17664670DE5EE707CCDE3D794D4F2F6BAA5972C9DBAD4F651D6E9927CC9C9AE473A82B8CEB3FBF8E38FDB66CC1A428F67CE9C39B6E6B1749F570D7E3AF54F4A4A8AADFDB4272B3232E4F5D75F97D1A34757F85AEE1A5F1D39DA9B826F75CA5483F1F4E9D3252F2FCFA327AFF4C482866C3D69010000E117F001F181D1B6C9F3D707BE974BA2BA7AFCFD1667AC91D88006727A50ACC7DF4BC385060EAD21AAED1ADECAD0409BF8F7C44A3DCECD3DAA7265680D6FB7A1DDAAFCB97A0CEF61E707AE887E86D29FA374F3E68A6AA6EBB39A5C8FF475DC4DA035BCE97CB5E5CDD1AB35BB1A7E4BD7FA6A9FE7DB6EBBCD7E86FBEFBFDF8E22ADC1577DFDF5D7D2AF5F3F69DAB4E931AFA5415B836FEBD6AD2B5DE3ECCD651A1D1D2D6DDBB6952FBFFCD2CECBED293AC2768B162D6AA57935000027C34911009537A2F115F2FCF6245BFBEB69FA3E898D6B67D0A2DFFDEE7776901C6F0CBEDEEC78C1F75454D3EB91BB06586B15274F9E5CD20FBDB4BFFFFDEF72E8D0A192EBFADE43860CB1832F69F3E061C3861D350AB106E9679F7DF698D7D1DB35F8EA28D9B7DE7A6BB941BB3E96A99E34F8E8A38FCA1D08AC26E828CF3A2897BE0F0000845FC0875CDE30411AFA47C89BBB3EF5E8FBBCB37B9E0439026440F405143A4E691A80274E9C689B2F970DC01A8A5353538F1AE44AE7E42D3DD2B5D6986A4DAED682BAE99CC23A3856E900A7A34C3769D244EEB8E30EAF09BE3541FB50EB805D3367CEF4C8EBCF9E3DDB96715D4CAD050000E117F0B067CFBC43FE9DFA89ACCEDAE891D7D711A55FD9315B9E3CF3B65AEB5B0C78B3A8A82879F4D1476DBFDE175F7CD106606DEEFCC20B2F940C68E576EFBDF71EF37CADFDDDB7EFC808DBFAFCA953A7DADBDC0361694DB137D5F8D624AD95DDB469937CFA69CD9EB4D3E6CE3A8A36B5BE0080FA823EBF4015691FDC87CEB841C66E7949A6B579A446FBE4FE7A788FDCB9E905B9BFD9706919DC84C2065C748027ED03AC8157C3EAEF7FFF7B3B98536568AD6F458FD551A2B5C9F38409137C32F82AFDBFC68E1D2B93264DB2D7FBF7EF5F23C157C3B4965BE966E5000078336A7E816A1810DD53C6341928C3373C5E6335C05AE3ABAF3734F632B9A6512F0A192843FBBD8E1F3FDE86D5E79E7BCE36573E19494949B6F657039CAFF777D713001A7E972C59226FBFFD76B5CB4E9FA7E5366FDE3C5B6EDA2C1D0000C22FE0E3AE8BE92DF7354D94DB363E27AFA7CE39A941B0B48FEF2D3F3D6303F5EDA75D43E102C709C05A8BA9CD947524E8EA86B869D3A6C9BA75EBEC6B9D2A03BD6900D6FED35A13AC271134C09637885879F4715ADB3B6EDC385BE61AA409BE0080FA8666CFC049D01AE073C35ACB4329936556DAD7B6B9F2C50D3A57FAF93A9DD1DF7E7DDFFC109D32B5ED233475062A1980EFB9E71E79EDB5D76C087BF8E1876D18AEAC59B366C99A356BEC734FB526BB1A7C870F37DBA98B2FB62700B4165707AC4A4848B0D33FE9B450DAC45C036E6666A61D504C6B8B57AD5A6507CFFAC31FFE600710030080F00B9C82B4CFEF5B6D1E92B9FB97C91BA99FC8A35BDFB001F8A2C8CE72766853890D88925067B06417E6C8FEBC4CD99CB343966424CBE7FB97DB797CDDCD9C19DC0AA81A9DCB5703B0865FED0F5C999A480DBE5A83A9A33B9FCA7D5535C83EF0C003B6D9F7CA952BE5ABAFBE92EDDBB7DB01C434F86AD9E809051D01BB63C78E72F5D557338F2F0080F00BA058BF86DDED929ABBCF06E18FF62E9235DBB6485A5EBA1C2ECC932067809D26A95D680BE916D1CE06E69A1C2C0B385503F0942953E4F1C71FB773021F2FA0CD9F3F5F3EFBEC33F9F39FFF5CA59A625FA64DA1756AA8D2D343010040F8055029F181D1322AAEBF5D0078DEA851A36C935DED035C5100D69ACD8F3EFAC8D676D2571500805313035E0100EA3DADB91C3C78B09D0F78CB962D47DDB77CF972DBBF558371F3E6CD292C000008BF0000D45FBD7AF5B28339697F5E1DC9592D5BB64CDE78E30D5BE34B9F5500004E6D347B0600F88CDEBD7B4B585898FCF5AF7F95B8B838D9B56B971DA1B865CB96140E0000A7386A7E01003E45A7ED39F7DC736DF367BD6CDFBE3D8502000008BF0000DFA3B5BEA52F01000008BF00009F939F9F6F2F030202280C000040F80500F8A68C8C0C7B1919194961000000C22F00C03715161616EFE49CECE6000000E1170000000040F80500A07E4A4F4FB7975151511406000020FC02007C535E5E9EBD64C02B000040F8050078B5ACAC2C993061C231B7A7A5A5C9A041832435359542020000845F0040FDB57AF56A090F0F97B3CE3AABA409B3DB942953E4F1C71F97F8F8F80A9F4FCD2F000028CB9F220000789B175E7841DE7CF34D69DBB6AD3CF9E493929C9C6CC370AB56ADE4C61B6F94EDDBB7CBA64D9B64C08001E53E3F3333D35E46444450980000C0A2E61700E075AEBAEA2A19376E9C6DDAAC7FDF7FFFFDF2DC73CF499B366D6C20EED1A3877CF3CD37153EBFA0A0C05EFAF9F95198000080F00B00F03E5AA3ABFD7A1F7EF8E172FBF53EFFFCF39293932341414114160000A8349A3D0300BCCAA2458B6C13E7E0E060E9D8B163C9ED7ADB575F7D25975D7659C914461F7EF8A124252555F85A63C68C39EAFAC08103E5FAEBAFA7900100380551F30B00F02AA3468DB2E1F6C1071F94F5EBD797DC1E131323C3870F973E7DFA88BFBFBF1C3E7C585AB46851A5D73EDE20590000C0B751F30B00F03A5ACBFBCA2BAFC8C2850B6D13686DE69C9292629B41CF983143F2F3F3E5CA2BAF94CE9D3BDB41ADDC035C1D8F3693EEDEBD3B850B0000E11700AA27242444427342253B389BC2A863813981E20870D4FBFF43C3AD9B065FBDAE41586B7F75B467BDD481AF544242822C58B040020303253737B7C2D7D426D44CF642C5FD00002000494441547D040000E11700AA2D363656CECE3C5B5607AFA630EA58C3030D25BA6174BDFF3FFAF5EB672FB3B2B264C4881147DDA761F89E7BEEB135BFDA7FF7820B2EB0E1B7A8A8E8B8AF79E9A597B282000040F80580EA6BDEBCB9ECFA76979C1579966C0EDA4C81D491E09C6089DB1D276D12DAF8CCFFD4B76FDF63FFCFE060DB24DA5D3BAC35C0DA47383D3DBDC2D7D15A61774D310000383531E0158093A67D293B74E8200D363690F3D3CE9726B94DCCC685CD4B6D093F1C2E6DF6B491B69BDA4AA7F69D243434D47702BD09BAE5D101AFDCF7695366EDFBAB2A9AD757E705F6A5720100005547CD2F801A111D1D2DDDBA7593CD9B374BD1A6226978A82185524BB456B361C38672D67967F944C09B33678E9DD2282C2CACE4B6A64D9BDAC05B9AD60AEBEDEAE28B2FB6CFA948D7AE5D5951000020FC0240CDD01AE0F6EDDB53103829AD5AB5B2CD98DDC1569B37EB28CFA507C15ABD7AB5EDF73B6BD62C7BBD4D9B3636F8676767977B7280F00B000008BF0000AFA2CD9935F8CE9E3D5BAEBDF65A7B5D9B2D97AEF9D581B0F436376DEE7CD14517C9BC79F3C4E9744A616161C97D5DBA74619467000040F8050078A73E7DFAD8CBA4A42459BB76ADFD7BD3A64DB6B65783AF4E7754DA39E79C63C36F593D7BF6A430010000E11700E09DB4E9B3D2797CEFBBEF3EFBF79429538E09BD6E3AE895F63DDFB76F5FC96D5A6BDCA953270A130000301C2B00C0BB68FFDEF8F8F82A3F4F9B3E970DBA5A1BCC28CF00004051F30B00F02A393939B6C676FBF6EDB6EFEFFAF5EB65E1C285F6BEEFBFFFDE36876ED1A245B9CF2D3BEAB3F60306000020FC0200BC7707E51AE0EAFAEBAFB74DA0F5BAD60A87878757F89CD6AD5B1F75DD3DFF2F000000E11700E055742467EDDBABB4D65769E02DDBD757AF77ECD8F1A8DB7454E7264D9AC88E1D3B24363696519E010000E11700E09DB496372D2DED9840AC8B9BCEF9ABC158C3AF0E70A5CDA175D9B66D5BC9730F1C382063C68C9166CD9AD9C79D7BEEB9D5EA4B0C000008BF0000D4B85EBD7AD9E54434E83EF7DC73360477EDDA55BA75EB2683070FB6E15907B9D2BEC3999999B61678C992253273E64CDB2C5A1FD3B2654B0A1A0000C22F0000754B6B76DD7D7ECB2A2828B073FF2E5EBC58AEBEFA6A193B766CB9CD9B75D02C5DB4F9B3F6FDBDF5D65B65C18205363077EFDE5D121313EDFD000080F00B0040AD9B306182FCFEF7BF3F6A44671DE86AD0A041D2BF7F7F5BA3DBAA552B1B62AB328D914E85D4B76F5F5BAB3C7BF66C993469928C1F3FDE86630000E0FB98E71700E055860F1F7ED475AD05BEE79E7BE40F7FF8830DC1DABC79E4C891D59EBF576B7BB5D65783F0534F3D257BF6ECA1D0010020FC020050BBB4CF6E69FFF8C73FE491471E9155AB56C915575C2103060CA891F7D1F07BD55557C90B2FBC606B93010000E11700803A919E9E6E43EA9A356B6C53E79A0ABEA50370972E5D6C1F62000040F80500A0D6E894460F3EF8A06CDAB449E6CC9923EBD6AD93FFFCE73F121717270B172E2C59B66FDF5E23EF77EDB5D7CAB265CB64EBD6AD143E00003E8C01AF00005E45E7E9EDDDBBB7DC79E79D929C9C2CE79F7FBE0DBE3A5D51695A2BDCB469D3937E3FED033C70E04099366D9A3CF4D0437C010000107E0100A81D23468C903BEEB843A64E9D6A03E937DF7C23CD9A35F3D8FB5D72C925F2DE7BEFD901B5E2E3E3F9020000F041347B0600789DF0F0707BA941546B8075A4E79494148FBD9F4E8394909020CB972FA7F0010020FC020050BBB4D9F3A5975E2A93274F96575F7DD54E7BE429DDBB77971F7FFC9142070080F00B0040EDD041AF940E42D5BC79733BFDD1C48913ED00589ED2A44913D9B66D1B850F0000E1170000CFEBD1A34749B3671DD42A3232D2FEAD0353E97D9EAAFD8D888890CCCC4CBE0000007C14035E0100BC8A865CB79C9C1C090D0D2DB9EEC9C1A8F47DF5FD0000806FA2E61700E0D541383B3BBB56DE4B836FE9E00D000008BF0000D40AEDEB9B9191512BEFA54D9EB5E933000020FC020050AB74B02B1DF4AA36ECD8B1C3A37309030000C22F0000E5EAD8B163ADCDBDBB6CD93269D7AE1D850E0000E1170080DAD5B56B5759B972A5E4E5E579F47D0A0A0A6CC84E4848A0D0010020FC020050BBA2A3A3A56DDBB6F2E5975F7AF47D162C58202D5AB4F0E868D2000080F00B004085121313E5A38F3EF2D8A8CF3ACAF3071F7C60DF070000107E0100A8133A0855CF9E3D65E6CC991E79FDD9B3674BF7EEDDA565CB9614360000845F0000EA8ED6CA6EDAB4493EFDF4D31A7D5D6DEEBC7AF56A6A7D010020FC020050F7FCFCFC64ECD8B136FCD65400D6E0ABAF357EFC78090E0EA690010020FC020050F774F0AB499326C992254BE4EDB7DFB67D75AB439F97949424F3E6CD93091326486C6C2C850B0000E1170000EF0AC013274EB435C15A63AB0156A729AA0C7D9CD6F68E1B37CE06600DD2045F00004E1DFE140100A03ED1E03B7CF870B9F8E28B65DAB469B6165707ACD2397A9B366D2A919191121A1A6A036E6666A6A4A6A6DADAE255AB56D9C1B3FEF0873F48EBD6AD2948000008BF804F395C585818E474D2C801F0351A641F78E001D9B76F9FAC5CB952BEFAEA2BD9BE7DBBA4A7A7DBE0ABFD78232222A4499326D2B16347B9FAEAAB99C7171E61F6337A5140490000E117A84BDFEDDFBFBF4DA3468D68DB08F8286D0ADDB76F5FBB0075213333B3C0E170FC4049008077A33A0CBE6EE1EEDDBBB7530C00004F494B4BDB5E5454F405250100845FA0CE9883910F5253534F3397F9940600C013B66FDFEE672E3EA0240080F00BD4992BAEB862754141C1EA8D1B372EA7340000356DCB962D9BF3F2F2365C7EF9E54B290D0020FC0275AAB0B070DC2FBFFCD272FFFEFD347F0600D4984CE3E79F7F6E60F63363290D00F07E7E14017CDDD4A953D36EBCF1C6D5A9A9A9BF8D8A8ACA0A090989A4540000271B7C972F5F9E51545474EB15575CB188120100C22FE015DE7EFBED2D23478E4CDEB163C7D0DCDCDCEF1A356AD4D4E170D0F2010050659B366D5AB176EDDA30F3E7AD7DFBF69D43890000E117F0BA003C62C4888F3233332FDBBA756BF8C18307576CD9B2C53179F2E406E63687CE071A1A1A2ACC098C53D99E3D7BE4D34F3F95D8D858090B0BA34000299EC7373D3D7DBBD977FC989C9C9CB76FDFBE1DE6B661D4F80240FDE2A008702AFAECB3CFBA381C8E81B366CD1A630E624A9A4107040448545494346EDCB8E45243B1DE0E9C0A56AE5C29AB56AD9273CF3D57BA76ED4A8100C574C680D5665968960F18DC0A0008BF40BD337CF8F01E0505054B4EF0B002B3AC3561799DB95C6696F54141414BA74C99924E09C2D72426264E321713CDF2585252D2244A040000F80A9A3DE394B666CD9AED1D3B767CCB04DBEBCDD58A06C2D276D07166E968967E6619919F9FFF8079DE1D1D3A74E8B576EDDA1994247C8559AFFB980B5DBE4A4E4E5E48890000005F41E7469CF2929292529C4EE705E6CF942A3E35DE84E66B294100000080F00BD40BD3A64DD339802FA96A0036C199AE0300000000E117A83FB406D8CFCFEFA2CA06E0A2A2A27C4A0D00000020FC02F58ED600BB02F0D6133D76C68C190C010D000000107E81FA1B80A578C09FE306E0C4C4C48F870C19D291120300000008BF40BDE46A02DDCBE1706C29E7EE22B364996580B9FF3B9D1A66D0A041E1941A00000040F805EA1DAD012E2A2ABACCFCF96B9960EC34C1B89DF973AE5982CD32D15CDF6842F07D7DFAF4F1A7E400000000C22F50AF680DB0B9E865966D6583B1B9AFBF148F10BDC82CF166792E3E3E7E8909C17D2839000000C0BBF85104C0F1252727A777ECD87196F9738409BC6165EE4B31CB9B9D3A75D2DAE1AE66696B96511D3A74E8626EDB6CEEDB4109A23E31EB7A1F29EEF3FE95597F175222000080F00B9C6201B873E7CED3D7AC599351C1FD2B131212DECCCFCFD766CFE7381C8E73CCE548132402CCEDAB8D1C4A11845F000000C22FE0F52A0ABE6E1A704D58F8BC5DBB766F9AF0DBCA2C3A12741F1388479B40516442F04AF318E60606E117000080F00BD47FEBD6ADCB5ABB76ED0C1322BE32577B98E50CB35C6142703F73DB466D2A4D2981F00B000040F8057C8286DC98989857C3C3C37F365713C4D51FD8848B1E9D3A755A61EE4FA39440F805000020FC02F55E4A4A4AA10910AB4DD87D478A4757D7BEC0EDCD32DADC16DEAE5DBB65EBD6ADCBA5A440F805000020FC02F59E0911D9DA1FB873E7CEEF1415159DE10AC0173B9DCE61266C1CD0804C2981F00B000040F8057C820E9A6502C5FBEDDBB75FE270387A9A9B5A9AE55A1338AE37B76D5CBB76ED164A09845F000000C22FE01334E4C6C4C4BC121E1EBEB3A8A8A89709C2679845A7464AE8D4A9D32AFA0383F00B000040F8057C82AB3FF0F2F3CF3FFFD5828202BD494786D641B1746AA48076EDDA2DA73F3008BF000000845FC027B8E607FEA253A74EEF9BABF1523C28561FFA0383F00B000040F8057C8E3675D6FEC0A5E6076E25DED31F38DE15887EE29B22FC020000107E01D44408B6F303474444EC97E2F9815B78417FE0A7CD72403F8B59B69B85E6D8845F000000C22F8093E3EA0FBC34212161727E7E7E94B9A98BD45D7FE08EAEF77FD62CEBCD72B1144FD5442D30E117000080F00BE0E4B9FA037F6202C93BE6AABF59BA99E5D25AEE0FFC86591E7705DE40B32C37CB2F6619609670B3ECE09B22FC020000107E019C341342D2CDF2E939E79CF371515191D6006B4D6C6DF407D666D73A14F57FCD926D962CB3F435CB3E5708769AE50A291EA42B996F8AF00B0000E0AD9C1401507FBCFBEEBBAB9392922E71381CBF33575334AB389DCECF1313135F193E7C78530FBCE5ED66F9872B043F679618B3CC318BBE978E4E9D2FC50373C5F0ED000000C09B51F30BD443C9C9C9EB1312125ECDCFCF2F282A2AEA62C2702F73795BC78E1D836AB03FF008B3AC90E2BEBD6F99E55E57C8EDE90ABD7F334BB4596E31CBFD6629E49BA9FFA8F9050000BE8A9A5FA09E9A32654A4E5252D224A7D3D9DA5C9D6A9660B34CF4F3F35B93989838EA245F5EFBF25E6596F9AE10AC035DA54A715367BDEF3257007ED82C8FB9FE76D35AE278D7DF7AE9CFB705000080BA46CD2F50CF252727679B6596AB3FB08ECCACFD6F4FB63FF03FCDF292144F6B146996196619EC0ABE774A7173E8AE523C12F49BAEE7685FE00CB36C72DDDECB157E2F768566D403D4FC0200005FE5A0084E0D0B162C689A979F77BFF8C9404781E3344AA4D6EC32CBAC82828217FAF5EBB7A936DE70C89021031C0E8706D716AE9B669A65425252524A155E4683EBA2726ED7F97EE7994543D1FFCC32488A6B84DD125C0159F5308BCE499C23C535D3A80712131327998B8966794C5B1650223EBE5F28C89B608E04AE77143A9A5022B5A3488A763BC4F19FDADC2F000008BFA78CCFBFFCFCCA7CC97F7F7FE3FD21071A1EF03F1C729842A92581398187635263BE6DB8B7614B1348EFE8DBB7EF9CDA78DF41830685FBFBFB3F5C545474B72B8CE698F77F313F3FFFC9F7DF7F3FAB06DEE20EB3E8FCC3CF94B95D6B819F74055F0DBDDA6C5A07CA5A6696E6667984B582F08BBA377FFEFCBEF98EFC99FBE2F60599FD4230FB855ADC2F1C0E2C88D915F343D49EA838A7C3797B6DED170000347BF6797A663FD791BB785BAB6D61E98DD29D050105144A2D2AF02FF0CF8CCA6C7E30F2E08F0DF634183A7CF8F08FA74E9DBACFD3EFAB035E2527277FD1B973E7774C00D641A9B446B697D3E91CDCA143879FD7AE5DFB53355E5643F4A552DC145A07BBD2E6CFA5FBFA8E35CB41296EF6ACFD7CB5B9F548B37C60968FCCB2CA1588E1C568F67C6AEC17F21C798B7E69FD4B84D92FF8B35FA8F5FD8233B341E669590DB276344C6B789DD92F7C541BFB050000035EF9BCF4D0F4A9FB1BEF0FCE0ECFA630EA9029FFEE99D1993F98F0F9786DBEEFB469D3B6272525DDE470382E322178B5B9A995F9FBE3C4C4C44F870C19D2B18A2FA735C617BA42EC936582ACD6020F94E2699174EAA314291E806BA1EB3E1D346B346B0250F7B282B25EDE17B72F8CFD42DD3A1476A8CDFE98FDBFD4F67E010008BFF059C187827B1C883A70E207168A04A6074AE0BE4071E6B35A78C2AED37669F0EC5317EF3D7DFAF4453366CC38D7BCFF0D525C33DBCFFCBDCA04E0C9559C1FF859B35C2EC573FDBA69FFE070D77DFA779AEBF616AEBFB59FF04C57580E664D00EA56406EC0A595D92F388A1C47F60BB9EC173C212D2EAD435DED1700E054C41424BEFE05E7F9079DA82F57D8D630094F092F39B829F22B92CCB332E560F38314600DCA0DC93DBBAE3F8309C153FBF4E99374DA69A73D5E5454749F39E81A5D505030223131F1D9E0E0E06774FAA413BC44966B71D33EBE3A17B03685BED22CE3CCF227B3682DB34E8FA4A3423FE80ABEFF602DF02E43860C79C0AC034F5770F744B35E4C2C731BFD807D805F9E5F5855F70B7AAAFC60B38392D93A538A1C4514624DED1782737534FD484A02006A07A7724F71C1A9C112F953E45167F51D050E7B5BC8CE100AC8072D5CB830DF84E0074DE86D67824F92B8E607CEC9C9593574E8D07E557CB99B5CA156FB00BBE7FBED6096D9AED7D5652EA5EEA53B00A77375551E6FD61746A63D45F70BDA3A480371D8CF6114100080F08BFA293435B4C2FB4276107E7DD9FBEFBFBFC984E0A14545451748F13CBC6DCDDF9F9A00FCF9B061C3BA54F1E56E35CBF566D1F0AC4DABB59F6F8A59DEA0A4BD97F9FEF5C4445A651E6BD68DF4A0A0A09994DA29BE5FE0A4280080F08BFACAEF60C5037EFB1FA255FCA960C68C194B939292CE77F5074E3521A76F6161E1778989896F0E1A3428BE922FA301EA5F52DC245A9BD13EECBA6D3C25ECDDCCF73DBB920F5D588966F1F0F5FD4236FB050000E117F5940E680228ED0F5C5050D05A8E345F1EE5E7E7F7F3D0A1439FD679832BF9328BA4B8DFEF0CD7756DF61C4EE97A75F89D51C987528BCF7E010000C22F00DFF0FEFBEF67E9804626F4B676F70736E1E801735D47861E5085975AEEBAFC9D1C3D4016BC4C6868A89EB0483DC1C3B242424216515A000080F08B7AEB78A37632A2E7A94BE7072ED31FD83D3FF0826AF40786177335653ED1A06433CDE3D2292DF60BEC170000845FD45B79E17915DE57105640019DE2CAF607364B9FC2C2C255DA1FB88AF303C3BBBD7582FB3FA188D82FB05F0000107E51AF65B5CE92FCD0FC636ED7DB32CFCCA4806095E90FAC3585A3CCF58D26043F376AD4A8284AA87E4B4D4D5DA4A33957B499080E0E9E4329B15F280C2C948CB33328200000E117F5931EE0E446E51E73BBDE96D7208F024289F2FA039BE5BE9C9C9C1F870E1D7A2D25547FE9DCCFE63B9D5AC1DD7319E599FD82BD3D3C5F0E373A4C01010008BFA8A72B40BE53020E061C737B406680BD0F28AB9CFEC0F1E6EF59DA1FD82C099450FD64BEC37915DC3583D239B5380A1CE5EE17740A24BF437E14100080F08BFA2738355862FF172B0107CA0FBF7A5FE88E50A6BD40F989A89CFEC066B1F3039BA5052554BFECDAB54B07BDDA5E2610A7070707CFA7744EA1FDC26EB35F5852FE7EC1EFB09F345EDC58C253C2D92F000008BFA81FF400267A75B4345CD3F0B8B5BB7A5F83B50D247A653467FB51A1F2FA039BE5C7214386FC8DFEC0F587367D361747055D87C3319F519E4F918301B3BDD77D42C3EF1B1E7F7B5F2812B131426296C6D893A40000107EE1B5C2B68549EC37B112B427A8D2CF09DC17686B02C2B6865180285779FD81CDE5D89C9C9C8D2604275242F5C65B65C2EF348AC4F785EC0EB1FB056D0D5459FE59FED268592389D81C412D300080F00BEF14B93ED2F6E7AA2A7D4EE44F9114208EAB9CFEC03126404D4F4C4CFC9F09C13DF431D4067BAFE0E0E0A5A5AF070505CDA5547C5FC44F11E2CCADFAE18086DEF02DE1E2CCE15002A82AF68500E117B520373AF7A416A032CAE90FDCCBFCBD64E8D0A15FE6E4E4EC3797FD2825EFE31AD579BDFBFAE1C387FB502ABE4F47F63F99FD42915F11850854C1E8D1A37FC3BE10A81BFE14C1A965EF797B2904D41AED0F3C68D0A0D97E7E7EF799AB0F1615155D72DA69A715ECDEBD7BE6B061C37ABDFBEEBBAB2925EF121414F47C7E7EFE6BAD5BB74EFBF1C71FB5D6FEF2A4A4A4E5948CEFDADF693F8500D492BBEEBAABE7A143876675EFDE7DDBD2A54BD9C602B58C9A5F001EA5FD819D4EA706E0C39D3A752AFCE31FFFE8376EDC381D29E77F4C8DE45D6EBCF1C6ABCCC52BB7DE7AAB73E2C4898D478C18F193C3E1983368D0A056940E009CFC36F6E0C1830BCD65E0D8B1639BB18D0508BF007CCCD0A143DB9A9DFBC251A346F93DF4D043CEF8F87839EFBCF3026FB9E516A7BFBFFF275E322D528C59EE2875BD8B59F460A445054B5BB31CAFB9DA9F5C8F53F5A25FD74D37DDD4BBA8A8E83F7A62A277EFDEF6B601030674EBD7AFDF4EF33DCD370767F11EFE085ADEE1C7B95F47633ADEC9927EAED750B46A02C036B666B7B17DCD12CF3616F51D2B2F008FD1601B1414F4C575D75D17D6B76FDFA3B637975E7A69A85E4E993265B1795CCFA4A4A4140F7D0C0D9F3AE2748EEB7A9A2BBC5E6896BF977ADC7AD7CE3FC7157EF5726905AFA9F79F6796B9650E0C74BAA08E660972BDA70E91DE548A47515EE8ADDFD36DB7DD76456161E147B7DF7E7B60E7CE9D8FBA6FE4C8915DD2D3D3D72C5EBCF85373707691D6E47BE863E84197BEF9BC0AEED7832E3D622CDD3C7080EBC445B0EBFE04D7F7A8DFEDB4328F058053791BDBCB2C6D6A601BBB896D2C08BF1ED46AE9F0A6457EF9D78648F0150552704E415161E342290C7138E4B0439CBB0BA560455191E31B47A15FD2A61ED3B6F39502DE137C838383BFF9CD6F7ED3F8B7BFFD6DB9DB1A0DC03939398EE9D3A72F328FEFE5A100ACF3D4FEABCC6DC3CDF2E40976DCA9AE305BFAB3B7708559DDD61C2CF3F8F9A55EFB4157E8BEC52C37B90E1CDCCFF32A37DC70C395870F1FFEF8EEBBEF0E484828FFA4FF9831633A656464FCB876EDDAE97DFAF4F99D6B4EE09A96EA2AA785E59CBCE8EB3A11D1B6CC7D735C976F9A659CEBEFA75D7FEBC90BADE5C8E2D708806DACB5816D2C08BF5EEAAC6543AF8D0E8878D8298ED63D1B7428BCA261B78667873493F8C0680975064B76614ED0FEBCCC663F1CDCEC98B36F71ABFF1DF8616CAB6F13378A38DED8D46DFA54BE5AA0EEE8140E0E8763C1E5975FDE78D0A041C7DDCE98701C92959515F6D1471F2D3101F8020FD600BB69D3AF6BA5F8ACF589C4B8C2B35B8A6B6951EA360D6C7DE448CDF257525CFBAB61F70BD77D7A4071BA591E73056AAFE01A78E5233D28EBDAB5EB711FFBE0830FB69B306142585151D12BE6E0EC4E0F1E9CF529E7B6B432FBABB265BE428A6B24F4BBFDC02C3D5C7F7730CB046F2A7300A70EB6B1A84BC3870F6F5A5858D8CFAC5357FAF9F97531974DCCF550A7D3996D8ED1F699BFBF370F9B9F9F9F3FE7FDF7DFDF44F8AD236D9724B6880A6E30C304DC0E7F3A6364D8C50D3A8B9FC3EF98C769000E0D0A96D383629BF68FEEA10799F2DF7D4B331FDDFAFAA3AD9725DE5EE85F70D3E6F34E9D2F12F0A6E06B36B2CB1212124E1F3C7870A5B631E67151070F1E3CF0C5175F2C3161F95CB3114EF5E0479C689629527CB65A9B81E999EB8AE6B3D5A0ABCDBEDC35B6BAF39F59EA80405C7FCF75056AFF528FCD7705E06BA4B8F637DD9BBE27AD8DD083B29B6FBE39F0440765CA7CA7F2C4134F9C317EFCF8DF989DA696E1231EFA680B75357295BDFB64C5C2320757EE321FE03A119125476AD6F35D65AE4DDA5FE71709806D6CC93EC99F6DACEF1B32644847B30E3D6DC26E9F76EDDAA5F6EEDD3BA655AB5651868486864A4E4E4E68666666E8B66DDB223FFFFCF3F66BD6AC7962D8B061DF9830FCF0A930F2B8570D78D579E5A81B420343D7DD1C7F55C2679D5E08BB24AA6BB9C1B722BF89EED176F9B9AFB7BEB5C96F839C05FE8B5A7D3B74043F01A0F698E01A6E36B88BCF3DF7DC16B7DE7A6B80EECC2BEBA69B6E6A70C10517840506067E3E74E8D0180F7D441D88EA55296EFAA51649F119EE57E4D881A9DCCDB92E731D18E872966BE75F5E388F721D1C9415E36DC1F7C61B6FBCCC7C4F5A1B11D8AB57AF4A3F4F779A4F3FFD7493B0B0B0DF272626DEE1C18F78951CA965EF20159FA88D71DDE77EACBBF95DDB52077600C036B6B876976DAC0FEBD3A78FBF596F9E0B0E0EFEDA1C479D3F65CA94F0471E79A4D5C5175F1CD5A44913BB7E2973BFC4C6C64AD7AE5D23EFBFFFFE33DF7AEBADB01B6EB8A1878ED1327CF8F07FEAB11CE1B7165CB7F6A15161CE90D7DF38FB81905BE37FEBAC4AE82D6B42D361E7BFDFFEF143FE4EBF675A2D1B3A9A9F03E079A3468D0A6ED4A8D182CE9D3BB7BEE38E3B02AB127CDD7EFFFBDF4774EBD6ED34A7D3B9C0031BDF075C3BEB4565C2E86CB37C63968FCBD9E9976DCAB54B8EDFBC6B75A9A09C24C535CC5ED502C57C37979A8B4FEFB9E79E4AD5461C93F0A3A2B476A2A1BFBFFF5FCDCEF55A0F7DCCAC52075B07E4E89AF6B2524B3DB6EC011A00B08D2D96C336D67769136763C985175E38F0E5975F6E78F5D557C705040454EAB97ABCD6AF5FBFC87FFDEB5F91975E7AE9B58181814BBC64260EDF0DBFFD92C7DFB52B2FFDB5F7DA3E16D825BC758DBC66E7B0B35ACCEBF0BC9FBF9FDF246A8001CF07DF90909005679C7146D7DB6FBFDDBF3AC1D76DCC98318D3A75EAD4343838788EBE6E0D7C3C3D6B3D568A9B7055341E80DEBEBC82E7EA08977D5C4B7329AE29AE28B0B5753DEE71291E4044FF5EE12DDFD3E8D1A37F73E8D0A1B9B7DD765B8503AF54864E57650ECE42CCC1D9DB43860C19E0818F5AB6CC2BA22731B4C65D77D2BA9DEFE17A0E5D5E00B08DADB96DAC368D1ECF36D67B83AFB95872EDB5D79E71F7DD779FE9AEE1AD2AAD11BEF9E69B9B0C1B362CCEAC7B0B7D3500D779F8EDB9FCB6B3F6E666BCF88FB3C6069C1E145BA3AF7D46705C7C52DB49790E91E7CF5E3EB42D3F0FC033C2C2C2E69D7EFAE9DDEEBBEF3EA76E3C4F96799DA873CE39A7635E5EDE7F6B20006B0DAEF64B5A7D82C78D2BE736AD7DD651A117BA9627A5FCE6617A5B8EEB2022C52C33E44873E939AE305CA7DB20AD8D30E5397BCC9831013D7BF63CE9D76BDEBCB97E4FA101010133CCC1598F1AFEB87F2F53E669153C2ED555E67A80A635FADDA5B8B6FD59296EE2DE945F2700B6B127BD8D4D73EDD7CE2BB58D7D4E8ECCAD8E3AA24D9D1D0EC7ACDFFDEE778103070E6C5C13AFF99BDFFC26D604E0483F3FBF39BED804BACE07BC0A0F8CF87C506C9F809AAAF12D4B6B8047C45DF1C5D4D47993CDD58BF89900356BECD8B1FF0D0909E9356EDC38A736B1494F4F973BEFBCF398C7FDDFFFFD9FED63E2969D9D2DB7DC72CB318FFBE73FFF29D1D1D1625EAFD1134F3CD171E3C68DEF9A8DFBE09318F932B5826D5F65B67FC16CBB950000200049444154EE50E5A607005AA3AB813CABD46BE9D40F3AB2F3615708D600FC82149F31EFE3FA7BBA59FAD7C577A4FDCF0E1D3AF4A9D6466833BC8ABEA3BFFDED6FB6C6E1A802A8E0B1FA3D9D73CE397EE3C78F0F7AFEF9E7E70E1D3AB4C7F4E9D3D7D7D0479E5BA6CC5BB94E449476B714F7BF3EEC7ACC6A3932D8580FD7090F2DF34BF89502601B5B23DBD84DA5B6B12FB08DAD7B4D9A3479B6478F1E3135157CDDFAF7EFDF30353535D71C7B3DAFE7767CA9CCEAB4E677C8BAC7EEF473385ADCD0F84A8FBECFA3678CBA2CC82F3086E6CF40CDBAEBAEBB6699C07BC5830F3EE87437B3D1FE4A575F7DF5518FD39DFD7BEFBD77D46DB366CD3AEA20C0E170E8C6D6065FA54DA7EFBFFFFE58B361BFD82C6FE8D9CD1AFCE8E12708BFF952FE20557A5BB259EE9523F31F2A9DDE48E7F94D72ED2426B90E1CC6BA0E1EF47983EAE23BD211478B8A8AFEAB536DB86B23F43B1A3B76AC4444441CF5D8975F7EF998E74F9E3CD97E376E0D1A3490912347967C4F5DBA74F1BBE5965B82CD7AF0F94936918A3F4E99EB7D7F2B73C096E3FA0EF4B6DB5D653EC275D9C275D26310BF52006C636B6C1B7B07DB58EFA1A33A878484DC64B4F0C4EB0F1D3A34CE1C8B0D1F366C5817C26F0D395878E891094D873A829C011E7FAFA7CEBC6DB7A3A8E8F6FAF605990DDD9F74C0831A3EF0074E9A09BC534DE0BDFA91471EF12BBB831F3C78B036852EB99E9A9A2A1B366C9075EBD6D9EBDBB66D93A54B97DADBDDF4F1FABCD2B409F5934F3ED9282E2EAE7F0D07E017A5E2E98D94F6019E5DC17D7AE6FB02B3AC2F1594E7B82ED7BB0E0C4A2FF35D8FABF50142CC0EB1BBBFBFFF47F7DE7B6F60D9FE67DDBB7797C68D1B4BE901317EF9E51759B06041C9F565CB96D9EFCC1CD895DCA607757DFBF63DEAB52EB9E492A06BAEB926E62447EA4E3A4E99EB7775BE599696BAED755799EB6D8F9429F37FB91E93C62F1500DB58B6B1BEC8AC0FCF5F7BEDB58EEAF6F13D113D0633EB5B9059C7FFEE4BE5E657576FFCFC2F49E7FF90BD69DCA3678C72381D9ECFE06D42CE68FECACE0F8B626E6E3F3BED8DE4F4FAF20575ECD8516B94124D3018D3A953A78E6639A47376998D656E659E3F72E4C8497B9AEC610BE1251AEF6C2CEFBCF3CE63B57D02C5AC37D13131319B5252520A6BE235274E9CF8567A7AFA88871E7AC8D9B061C363EE773A9DB6BFD292254B4A76EA7ADBC68D1BED4E5D9B40676464E85C73F6BEA0A020DB04BA65CB96C76EA4FCFCE4A28B2E0AFBFAEBAF9B9B0D7093E4E4E44F7D71DD30DF5391F9BD4FEAD0A1C3D8EAFCD6CBD281570A0A0A3E33E51AA80761E5D1E6799F7FFEB9E4E717B728378FB70762975F7EB9BDFEF4D34F4B56D691CCAE27391E7CF0415B335196F9ACFEBB77EF0E4E4D4DEDDFA54B97B757AF5E9DCF2FDEB3EB8A59469BA58959F69BDFC58ECA3EBFAEF60B2BDE5F21C191C112D220A4528FFF79D9CF92BA2155625B1EE92E51545874542D59698BDF5A2C4DDA3711A75FC5C714FA98809000098F09975FD7FC2A917191F6F67DDBF655FA73F9C27EE114FDDDD4E8BE906D2C6A685B3EC22CEDCDB2AB2ADB711DE4CA6C0B5FF8C31FFE107E32838C9E488B162DFC3EFAE8A3D8B3CF3EFB3DB3EEEEF38572AFB3DAC41DF97BC6F76ED0C57132531A55D5F9116D377D93917CBD66EFFAF64599155CFB0E8E3041628459C9D3CC0F668EB96D86090D0BA74C9992E30D9F31635786A4EF489733CE3DE3A8DB0BF30B253B3DDB1E6C5445416E81F805FA557800D37D68F70AEF773FA6658F9612DF26DE1EE49CDEE9F492839CE866D1A7D2F6F5710DA0717171D9AEF5E64DB3235EF4FEFBEF57AB26D204DF7F9B1DF00D8F3DF698A3741FDEB23A77EE2CCD9A3513739061AFEB0E5E77E8AFBEFAAAA4A5A5C9FEFDFB4B1EABCD9F2FBCF0C20A5F4BCF6A9AF78B32070523860C19B261C68C19FFF0D52FAB267EEBB7DD76DB15870F1FB603AF1C6FAA0DAD61B8EAAAABC4ECD82437B73863E7E5E5C9EBAFBF6EFF3E78F060C963030303B5F6E198FE6AA5DD7EFBEDA1999999EDD6AF5F3FBD4F9F3E834EA29F362A4707F4BA4F17B39E680D4C92D3E97CE3DD77DF5DED8D1FF6BB19DF49F419D1156E7FD7CE5B2B0EE791609BF25D4A49E0B5DBEE5FF6C98F5FFC28374FB9D96EFBD37F4D97A8D38F4CCF1D141A24BFACFA45CEEC7E66C96D651FB363ED0E39EFFAF3ECDF1FDCFF81FC7EF6EFED6BBD73EB3B32E6BF638E7A7FF8E6BED06CC332CCEFE523B35D9D56DD7D21DB58D4A056AEE50EB35E6A7338AD9D9F919A9ABAE878DF6F4141C1802E5DBA1C0C080808F6E487D3607DDE79E71D5EBC78F1B5F5313F7955F8DD99B3AFE7C8F82B6BF53D0744F70C5E9C91DCBB9E7F79FA43D0262FA3CC467C544E4E4E96F9B1CC341BF10F77EEDC39A72E3784DF257D278D5A3492669D9BD9839CB0E8307B20F1EDBBDF4AEB8B5BCB853715879B83FB0EDA30AA72B373EDF56DDF6F93F697B7973D9BF6D883A39CAC1C49DF9E2E978FBFBCDC03180E72AA15AAB45DCC60B3DE0C3607C89966BDF9D8DCF64E5542D55FFFFAD7A7376CD830EAD1471F3D6EF075BBFFFEFBE5DE7BEF2DD9E99B75F4A8A6CEF6BB0C0AD2E98D4EF85AFA7E7FF9CB5FA21E78E081C7CC67CF4F4A4AFA978F7F6505D5F9ADEB88A3E6A0ECE33BEFBC33A032734C0E1C3850BEFDF65BDB1CCF6E60F2F365F5EAD5B686420FD2DCB4FF59D966E9E5B9FBEEBB43264E9CD8CFEC905F369FF1368E6B6A459E6B5DB9BBB0B0F06EB39E6C37EBCC5C3DB837BF9385DEF221776FDA6D4F8456A4C3951DEC763C2D25CDB61409082A6E2E1A1C1E2C05F9051277769CF4BAA557C9E357CC5C21F16DE34BB6E5997B326DCDF2BACF8BBB576C5AB4C9EE872EBBF7327B1236EF709E14E6154ADA9634BBDF896A12557202B561D38604DF538756F7BB4F30EE7305E14A9F60641B0B0F1DA3159A7552CF7C68BFEA3BE2E3E3B70F193264AEB96DC6EEDDBB1796DDE70707070FE8D5AB57546D7CB68B2FBEB8E1AA55ABFA137E4FD2AFB96971ED429BD7EA7B768B68A767C99BFBD077A6CD76C2DD07C7E687923674E850ED5FF8566DD7086B2DADD6FCEA41C6FA05EB2561508238FD9DB69635AC515849F0557A30A20731C97393A5CB355DEC81CDCFDFFE6CC3EF77FBBE93961714377D751FC07090E3918DAC76D21D66D69B612654E5989DFF7FCC6DEF1F2F543DF6D86393D6AD5B77FF830F3EE868D2A449A5DEC7DD77E9D34F3FB5CD9FCD81B96DB2E86E0AEDEFEF6F6B7C2BFB7A7A70F0E4934F464F9830E119B3AEE74F9F3EFD751FFE9A4A376B28AACC6FDDDCD62F3B3BFBC3BBEEBAABC26678151C4C698DBE1C3A74C85E775FBA69CDFBADB7DE2A95695AA57D84CC6B053FF0C003379AE7A44D9E3CF9210E6B3C2EA0CC7E419BC38D3697A35D35C236089BDFCBDCBAFC90EE5640C7F3CBCAE280D0E6D236B625913AFD9CD3ED365EAFB7BEA8F53181D94DEFD7ED7B930EC5DB93B8D671F684AC3D3B60F60999BB32ED3628242AC4DEBEF49DA5F6F3F8051C59AF270F9B2CC35F1E2EA151A1AC55A78668397282F1A0F9BDBC7FBC138C6C63E129661D2CDB5FC36EC775898B8B4B77B5029BE6DEE79BBFCFD326C9B5F1D9F418CD7CBE4EBE52D675167EF7E76704C40644D5EE8AB53F37B2C9374511098989937CE4FB7396FAD114991F428CB948345713B52FE590214336EDD9533BFDBA964E5B2A57FEF14A7B20B1F8CDC5B6F6D73FC85F3E79FC137B70A2073D1A86DD1A9CD6C01E70E863349416E415D820BB237987F80796BF5AD6F7839C43BB0EC9CA952BB58F877BFDD32AD09C528134BFA0A020D5E974E69709AAA9E67B3DEA4486795C5A759B2D97B72F7507616D0E6676EEF3CCF57F970E55AFBCF2CAC4152B563CAAC1B7BC7EB9C7336CD83059B46891EDE3EB5A574BEE0B0909D19132ABF47A5A036C8278833FFDE94F7F3765999E949434D35B7E9083060D8A37072FC1C7D9B9C59BEFB33A4D941C27FAAD9B03221DC4EB6FE3C68D0BD026E755A1CDD3AFBCF24AF9F8E38F6D6DC4513B097F7FD1114CDBB76F5FE9D7D303B949932605DE7FFFFDE3478F1EFDEBEBAFBFFE4F5F3F70D1F9A8CD77115FC9839C4AAF07D558679C6582B0D608DB5A2EF37BD1D7ABB5FDC251DBACDC0239A3EB19929371E273B23BD7EF14FF607FDBDFD76EA02283EDBEA149C7A34F92E9C9CE79CFCD93665D9AD9EBBB36EC92F0E870BB7FD026D2FA5E7DC7150F1C14141624412D83EC3E474F94EA63749FB0F99BCDB6B591D2D7BA72C295B51A7C0FEF3D5C76BF5056BE6B1F50AD565DE5ED3F6AEA39665B9163F643A93EF4330E93232718F7997DE16752EA04A309BC3D0F1E3CF811DBD8FAE544FB650F6C834B3F375CF7D727FB3F94EE0EE5DEE7E7E6E6368A8C8CAC9532D4BEE8F9F9F991BEB24ED459F83D5478D811EA0CAED5F75CFECDB70D9B2CB3C790137DEDC7ED2867041073532B6D6AD3A25F0B8FBEB7F6CBD2E0AA070C9BBED924835E1824F987F3E5EBD7BE96817F1968FB6BCD183743DAF469235D0776B5D7350C6BE0CD48CDB04DDC34946ACDAFD6D29EDDFB6CFBBAA56B7E7DE12067EFF2BDB27DD5F60AD73F0D85DAD4AFBCDBCBD2B3C37A205BC65161DAA5AA2331469AF7D3A90B06B937B06DDBB65D60D6A3D166875FE5E0EBFEAC3A98D58B2FBE78D4FFA2ABECF5D75F6FCF6257950EA665C26FD0134F3CF1868E86AE07F4650E608EB7B3897705FE8AB6894D8FB3238B72ED84AAFB3BF5D86FDDEC085FBAFDF6DB1D553D2873D3EFE2CB2FBF2C3949E1A6FDD04C1957F9F5B496DE7C47818F3DF6D8DF870F1F7EB139E0FBF1380FD73357E1D52C92F0137CDF555D07AAF558F7E06D35BD1E9CE43AE3ACABFD42591BBEDA605BEFE8B65F5BEE44C44694FF0334A1B7E939C7FE04A39A46D9E79595F6739ADD962B6D7DA435C6BA0FD8B2648BECFD65EF518FD5E76B6BA0E5EF2D97F313CFB7DBFF4E571557661C483D20892F254A604860AD96CB9EA57B8EBB5FA8681F5085836F8F3DA782FD50853F11297FCEF59A7E4E4D3D3FBAF40946B30DDC69826FEC4D37DDE4CF36B6CAAAB2BDF5C4F34F769F5B27CF3DC1EBB6D293289E1AE5B92C3D4E33E13788F07B9234F86617E6486D06E06E17F5287869FBCC2213809FAC47DFD1C493F8716C4948486899E6E191E85B9CDFC20E40A20737E70F395FB2D2B2ECD2FF81FE258F19FAD25099F5D02C1B7EB5C9B10E5AA20721DA1C590F402A53F35BDF0F721A253492D81DB1B26AD52AF7A89E716536E8FEE63B8B373B5CFF4A6CF863CAD9919557EB745247B8BA81DDB061432B9D7FB753A7EAB778D11A5E0DF6A5CF78EBF5EA045FB7366DDAF8C5C4C414A6A6A60EF7A29D60792720AA727F9FEA7E36734096D7BB77EF6AAFD47A20AB351065E981597927652A7B92A269D3A6CE8D1B370E16DF579503ED13AD07A5D7B9F26AE1469DC4E7FCD9EC17CE4CABE5194A7E5AF8939C37E83C3BBAF2A237161DB57F284D4F82BA696DB1FBB69FBEFAC96EBB577EB0D2EE47DC344CBB4F94EE5CB753421B84DA00AD7F47C61FA9A8D0FD84BEAFEE0B1206271CB3FD6F10DFA0D6F7092AB6476CD9FDC2313F4D57CD53758FD7AA131C2AFB9CE00AF63B153DB63AFBA3B6DEF0E336DFC169663F5668B6B1D57E0DB6B175A6D2DB5B0F3C5F5BE81D6F633BAA9AEBE366B32E35CFCECEF6AF8D00AC2780CCFBE5FACA0A5167E1B7A17F44DE9EBCF480E641F1B5F7A60D02F6ECB8D091FFF5B8A449F5E50B4A4C4C9C58851FC301B383FCDCD52760AE36D3B9F9E69B8B6AE32067FB9AED36B46A33633D60090A0FB22377EADF7A20B2F1EB8DB67FAF5BC7FE1D256B6F96B4EAD5CA0658AD992D5DF3ABFD80CB9EE5AFEF0739217121D2A16B071D04CA23EB5F054D7B34247F57C9F527BFEC01969E403181F5CDAFBFFEFA61133683ABD2C7A9E400D604DE37DE78E398A65E7AFDBDF7DE936EDDBA552B04CF9F3F7FF5AE5DBB5AE8FA5EA6E6F7B83B9BE335E9D3A6E7E6BEED151EBD0507A79BDF55BA077FEF4595FCAE32CD679DE7FEAD9B1D60AF356BD6CCFCE28B2F8A2EBBECB26A9D9D2D3D1A6999F7B2F755662096B27EF8E187822D5BB6E49ACFF99F32DF51D9F748338FA96E33FE131D5C54691D28E73B4FF59611F54BAD27953E6032FF67966BBFF0B67BBF70CB2DB714D566F8D5EDFBDEAD7B4B5AEEE8767ECFE63D127BD69141F3747C885F7FF8F5A811FC7520441B1ACC6D7A9FBE8E8EE0AF2757DDB30768771A77602E7D5254F721A54F8AEA5812BACCFCE3F17B49947EEDDA10D428C8A3FB056F51956E01A57EA7C1AE0180AAA59CE7BF5989A7E9A04385E5EC0B77666666469A6DAC3FDBD82A7F0F556E7AEFEDDBE0DADE96BBB6E39F98658ABB19BE39BE4FCDC8C888AB8DF06BD67D9DAF3A93F07B925A069F96F963F6D6E8DA0CBF3F1CDCAC5FDC061FFBEDE838F93AEFE98C909090F99E3C30AFF047595824B31F9E2D6D2E6923E75E776E493F5CF5F6E8B765E4EB238F3A9B5FF6B93A6A73DB4BDADAA0EC6E0EBD7FFB7E39B8FFE051A337D7F7831C4FABA0EF55CAF19AA5990D6A81D998FAB97650FEE67ABAB99C5FFA048ADE3774E8D085FFFCE73FBF34212B40A762A88AB973E7DA0D6779F44060D6AC59556EF2B570E1C255FFFEF7BFCF30017A9009D0F3E5D470C87C3FFF35DF4D5239BFF5F9C3860DEB636E9BBF7FFFFE82EBAFBFBE4A7BC31D3B76C8BC79F38E9A6FD2EDC08103B6A95E42428254A5D9BB1E94FDE52F7FC9C9CFCF4F9C3163C61C416DCA718FF65C57FB85D2E63C3647AEF9F33525D7B505CF6B435E93DB66DC56D2FC59A73FD245074C8C8889B02752DD035E697369EDDAD220B741490B1E379DCAAEBC93A27B53F6DA81154F7850B727D3769D71DBBA62EB51E34BA066B8F62529D578EAFA1A0C1A15855FED1BAF676775E038A7F9DD38CBDB179A6D6C17B6B1A84507CC7AF81FA7D3F95E6A6AEAFCB203B0050606AEDDBA756BDCF1A6C6AA29BAFE9ADFC14F84DF93D434B8F1B2C519C9FDFB35EC5E6BEF3967DFE27D45225FF948E07DDF2C9F040707CFA9EB3362DA8CD93D759086D78DFFDB78CC889CA569C8D58395CD8B37DB66A43A32B406E0C3D987ED54185A63AB35C7210D4238C8A9797A563BCF947B902BF06AF0D5BDF1DCE39D40993E7DFA22B3E3EF3675EAD46F4CE00CD5119C2B233D3D5DFEF39FFF8809CD47D69752A33D6B28FEE28B2FEC88D095993AC9FE8EE7CC59F3EEBBEF9E615EA39F09BECB7D3DF09A45CFE27C74A2DFBACEED3A7CF8F02E1F7FFCF1E283070F168D183122ACB213DF6BCD7CE983327D9E7B746EFB210E1DB2F3523EF5D453957ABDD5ABFFBFBDFB00B3AABC1306FEDE9901860E22289648D058B145B1AC2968D4609A292A6349246ABE98982F9BB669BB0846779358369BFD8C4663023E6A04D144578D2524F6D8A2220A36C2824AA8024A9B19A67CEF3BF70C5E2733346760EE9DDFCFE7FF9C7BCF3D7766FCDFCB39E77FDE72A6D75F76D965354ECAB66EC11BFF6DDD143FB7DB3BC37161FDC5AF9FDE1D0E3BEDB0B0FDF0B7870CA682F7E3E33E1E2E3BFAB230FAFBA3C3C19F39B8E94266922E84A68BA2E978928E05E515E54D4571EA59D47CBFDF42693E88668517455B4AADC6B5AB6BC3BAB5F95BCBA49FF5FA8CD7C3F45BA7870F7EE9834DB7D76BDA67C582FBB5E9AFAD6FA5A664ADCB5A78D397A52C8B0D1E0BED63D90A9667E7F737C6FDF8631BDA8FC7F3ABA98F3FFEF851871F7E78878FC57DF4D147D7C5F3B55B15BFEFD23FF5DD7FE24F5EBFFE84FAC6FA509EDB2A33758747DF9AB96BB7FA7073317E50A94B735CDC575656D63CF3E08ACEF2B7A5EE6BF75E766FD358AEF71EF6DE365B79D37D7753AB703AC94845EE69979FB6FE9643CDF7EB5DB9786553AB6D9AA82A6DEF24A7DD956507FB555951B5C91750D281BFAAAA6ABF58703E150BE0EDD2CC951B73F5D557879A9A9AF5CFFBF7EF9FC6A686A79E7A2AC49387FC197B7575B8E28A2B9A6E03B131B1909E79F3CD37F78B07FC23A64E9D3ABB443FA3D5F1DF7BFAB7FEEBCDFDB77EC30D37BC3E76ECD803FEFCE73F3FB87CF9F2F79E77DE797DBA75EBB6B18B0961D1A245EFE88EB7CF3EFB345DA498397366D3C9597A2DB54EDC72CB2D4DF7ACDC90BFFDED6FB5975E7AE9BAF8BE93E249D9DD818E3C2EACCA8E0BBFE96CC78574B1F17F1FFBDFA67D6EDA9FB7948ADCD3AF3C3DCCFBEBBCA6DE3E856A56D784E9B74D0F77FDC75DE1DC5BCE6D5A978E2F1B937E4EDAAFA7D9FF5B4A85749AF4301DAF9A8F1B275E78E2FA0BA0E9FEC18F5DFF5853919DEE2440C9EB96CDE1B059C742FB583AC0FC187F48A74C0B172E9CDED6ED265B2A2F2FBF239E4BFD3CDD2B7A63DFC177230D517BE289271AE277F4778ADF77E98441874FAD7AE182B50FBEF96CCFA307BCBFC37FDF836F4E5F56DD50FDBF2F1F39796E917D46E3E20E726EDC29DFDC59C73CA4715BA3BF3B7AFDAD869EBBF3B9A62ECAA9B04DE37C9B5B6B6BD7D486BE43FA365DF56F2E64D3D8AF3436B8B9FB71EAC29C5A649B8AA2B7AA9B6E7191AEFA3BC9699713E574627CFFBBB9803279F2E4D48DFA905400C79DF48033CE38A3ACAD2BDF73E6CC09B366CD7AC758DF34B6F79C73CE09F3E6CD5B5FFCA6D7E7CF9F1F9E7DF6D9B0A15934AFBDF6DA57EEB9E79E748B9F4F946AE11BFFAD7F3E7E36EFEADF7AFA5C4F3EF9E47F9A3E7DFAD4F1E3C77FE0073FF8419F749B82D6A496F9D42DFD8D37DE1E36107F7FF8FAD7BFDE74303DF7DC73D75FBC58B66C59532BFD873EF4A1365BE95337BC4B2EB924DDB2EB6BF1BBE2A4AC0B1F17D27EFE804F1EB0C16D520FA1D67A0955F6AD0C479C714438FCB4C337EB9EEC479C7EC43BC60CB794BA4C17769B2EECF9D3D6455B1C0BED63E94047C773A98737B5E06D7921E64B5FFAD2E37FFEF39F3FB8298D115BEABEFBEE4B5DAC9F2FA5F3AEF26DF9CB3FF72F67F6BF79E97D47550D3E2694E5CA3AF47755BD3861D1EA86DA4B96FDEAF919C5F4013DFFFCF30FC6981177B25B748FBF2F7CE10B1396ECD4F1F7742CBC6550EA823C648F214D45F10E7BEDD0B44C91C66DB56CA94D134FEDBCFFCEEBB749EF6D7E3C74DFA1FFD0F5B9D9CEFBEDDC5448B725FD9CC34F7FBB4B7DFA7B0A8BF5742B8D14DD7B6DDD89AF862C1812AEBBEEBA0BB6E6EF1C3162441AD73B319E289F1D779637C4EFD38BF1FB54FD2EBE932BF6DA6BAF9B162C585015A3F7FBDFFFFE5C6B33554E9830E11DB77448B765F8CA57BE12D2F894F8FED48D66FD95F0B44C57C08F3FFEF8D05A319D15BEDDE349CB07E2017F56A91E05DFCDBFF542B366CDAA7DF6D9676FD87DF7DDDFF7D8638FED7DC8218774EBDDFB1F5BDF2EBBECB2A693B3E693AFF439A6DB711C70C0014DB392A67B08A68B12CDDDD4D367933EA7638E39A6B593B2DA8B2FBEB836EB867793731AC78576B818B459DB97959715E5E7B92D8E0B5D517B1E0BED6369A77DF9DCA8614BDFFFBEF7BDEFC93973E69CF5918F7CA4A2235A7F53CFBCD4CB203A29FE5B995F2A79DFA6478A0B867DF1BB9565DD574E5C745787FE9EAB16DEB660D9BA37E7EFB27AC164FFD44AE4AA4DF77249D844B158BCE8C61B6FBCBE3D5B88520B707D7DFDBE716738FBEAABAF6E683993F3B469D3DE71A53BDDEA284DE4B1EFBEF9D6955D77DD351C71C411EFB8475D1AF374E79D77FEC3EFBAF2CA2BFF3716BE69ECEBA1E9F7FA4437DDB5D75E7B563CF1BAF4FCF3CF5F9B26AC28F4D7BFFE352C5EBCB8A9ABDDFA93F02143C28927BE3D31513A014BB7D268965AEBD3E794AE04174A276FA935C2F833A02B1D0BED63D996E277E1F9EEDDBBFF362E6B3AE2E7FFFEF7BF6FE8D1A3C72D13274E7CBC94F2B6CD2F931EDFFFD0CFFC7AE11D8DD357BDD2213FFF8535F3EA7FFEFACDDD4359EE9CFB8FBEBFCE3F15681FA9EB576D6DED81F1A0FCF27FFFF77FD7A7712749BACADDF2D646E9607EFAE9EFBC1D6F9AE1B97022AC748531EEC09BBA7E358B85F5FC871F7E78493CE01F154F5A96CAFA167D4EE7C7CFE69BE3C68D5BF7CA2BAFACFF8C528B443A312B94BAE2B5F48D6F7CE31DCFD3095E1ACBDDFC3965DDF056C7CFFB734ECA00FB58FB58B69E9933677EF9B1C71E9B77D75DEDDB90982EC0DC7FFFFD7F5FB468D1974A2D67B9CEF0475CF8EAA46BA62D7FEAEC1BF61A1776EE31B8DD7EEEFC9A25E113B3BEBF6C55DDDA7F9E7DD88DD777C57F147FFCE31F1B671E32D3DEA193D8EFA9FDC271C71D972BA5FFA7934F3EB9CFC08103A7EDBAEBAE877CEF7BDF6B97AE37A9708E05F5C2A79F7EFAC58A8A8ACF74A6897C8AD599679EF9F174DB846F7DEB5BDD3734B67A7334CF381A4FFCC63829735CC071C13ED63E96ADEFF4D34FDFA5B2B2F2B9CF7DEE73034E38E18476297CA74E9DBA64F9F2E58795628FBB4E314066DC7BC69EF3D181237F77FA4B1786F66A017E61CDBC70E2AC1FBEB9AA6EF5255DB5F085AD21EE2057D5D6D68E9A3F7FFE133FFDE94FEB520BEEBB91DEFFE31FFFF88DACF03D41E1DB3EAEBDF6DA3BE389D9A77EFEF39FD7A6EE78EF566A8D4827655A2300EC63D976D2E457F1DC69FFDB6FBF7D4E3C675AB7A5E761E97D37DE7863432C785F2FD5C237E9340327FFF4B3DFDFF4F9EF7F69F0CFE6DF34B22C57963BB0F7EE5B3C09D6A44577D57C7BCEE5AB57D7AFFDC6ECC3A65CDE95FF4114CBC4265D45A94E6C9226DE193162C46F57AD5A75683CE8EF76D4514795A7C93C3657EA3A7DFEF9E72F9F3367CE23DDBA75FB74679DC9B658C593A9BFEDBBEFBEE9F60867F6E9D3A75B1A87BD859F77ED25975CD234F14A3C38FE41661D17705CC03E966DE7B9E79E7B2B7EE7AE880F87DF71C71DFBC673A8F2F7BEF7BDA1B509495B4ABDED1E78E08134B9555D2C7AEF5CB870E13137DD74D3E252CD55A79A35E8C1FFBAFD0F677FF7DC3F3CB272E667AF5F7C6FAF5D7B0C09BB55EEB8C9EFFFCB5BCF852FBF72D99BF72C7BFC859ADCBA8FBF3272F23427394E729CE46CBD02F8E9A79FFE6D3CF01FF8C8238FEC71E4914796A75B3A6CAA34FE3716BE6FC59DEE9DF3E7CF3FF5D65B6FADF58DE99003E4C23DF7DC73CAECD9B3CFACADADAD6C9E846C334EEED2F8B3DA748F4927658E0B382E601F4BE790668E7EFCF1C76FDD638F3D7E1FCFA38E8A05ECE0458B163555BFA9084E9186A6A516DE58E436DD92F2B6DB6E0BD75C734D5DFCBEBEBC7AF5EACF5E71C51517A7D9CC4B394F9D6ECADC07FFFBF6BFBF78C543171FFFED93EAFFB4FCA983AF58706BCF39D57F0F758D0DA1227E68DDCB2A42B75C4558D3501D16D72E0FD357CF0E9397FC29FC70EED5D5772E7BF4A5BFD72E397F87D5F3FFF9A9A3EE58EC9F81931C27395BDF534F3D3575FFFDF73FF0BEFBEEDB73E4C89165ADDDFEA1A5254B968471E3C6AD59B162C53DAFBEFAEA195B72CF3B365D3CB02DDB7DF7DD272D5EBCF80BF100D9FBA0830EDAA4ABC3E9561BF1A46C9DD608C7051C17B08FA5739A3973E6E2279E78E29723468CF84D4D4DCDB2E79F7F7ED0B469D379A9178A00002000494441547ADD72CB2D1553A74E2DBBF3CE3BEB1F7AE8A13571BB39CB962D9B180BE4B3264E9C78E1B3CF3EFB5A57C84FA79F60E14773AF3D78FEBAC5DF78A3F6AD7F7AB576D18E2BEBD7F45AD7505756912BAFEF555EB9B66F79AF97E366772F5AB3E4572F1EE936282D99D8A473E94A139B7CF9CB5FBEB6BCBCFCD458D4764BF7F66DCBCA952BC30F7FF8C3D5CB972FFF5D3C49384BE1BBF58C1D3B7640DFBE7DA7EF169D77DE79A1B2B2B2CD6DE7CC99537FFEF9E757BBD586E3028E0BD8C7527CAAAAAA9E8B8B11315E9E3C79F25E5D350F159DFD0F3C7FD899CFC4C599BEB2505CAEBAEAAA33BFFAD5AF3EF7A31FFDE8A27840EFD15A019C5A7C274C98B02616C03F8985EF4F14BE5B579A4C6CD4A8517BF4EEDDFB81F1E3C71FF9831FFC203760C0807FD82ECD387AE9A597563734349CEBA40CC03E96E23276ECD8CAEAEAEA11D9D33DD3F3AE3AAF4A99AF03D051AEB8E28A4BE3E2EBFFF66FFF5697C696149A376F5E6AF1AD59BB76ED77AEBBEEBA8B14BEDB46CAFB4F7EF293A37AF5EA75CFB871E31A172E5CF88ED75337BCECA4ECA41B6F34733E807D2CC52616BE47143EAFA9A919D55573A1F8053AD495575E79754545C53F5F78E185F5B366CD6A5AF7D24B2FA516DFFAF8F0DB13274EBC5296B6BDF8799C306CD8B09BCE3FFFFCD07CA1229B78A52E75C38B276577CB12807D2C45E9CC8D3C57FC02B497ABAEBAEA8ACACACA332EBBECB27593274F0EFFF99FFF59D3AD5BB773AEB9E69A5FC84EE7F19DEF7CA7EAC0030FFCAF8B2EBAA8F1FAEBAFAFBBF8E28BABD7AD5B3746373C00FB588ADA270A9F3434348C1E356A546BC35FBBC7F8B4E217E05DFAE52F7F39B967CF9E63D2B4FA8D8D8DA7FCEA57BF9A242B9DCFC30F3FFCF30103063C7CE79D7756A46E784ECA00DACFD7BEF6B56FBEFFFDEFFF45B68F3DCF3E968E76EAA9A77E202EB62F5C97CBE5060C193264542B9BF78DF12BC5EFB673D3367E3FD08E7EF18B5FFCBEB2B272602C7CFF47363AADB10B162CF8605CFE54373C80F6F7C8238FBC91968D8D8DEF950D3A406AD1DDB9B9CE8BDFB331AD6D140BE0312DDE33B4AB24A7B3A8CC3EA43505EB3ED5CA76BDB2E59A4DF8999FF2FD87CE25CD7E290B45A15A0A00A0A87C31C6B763BC18E380185F8F716C1BC5EF27B2599F4F8D4F2F8EF1788C618ADF8E978AD9DBB2BFA52646BAEF54BA1276458C1E31E667DBA5F52FC598939D94ED19E3E3319ECF5E6F8CF1CD18DF8BF1508CA5ADBC7F957F1300004089D923C6BFC4787F562BED3674E8D087E3729736B6DF71DEBC79A9A1F02731F68DB124C6E018B314BF1D6B748CD5E1EDC1D53B67CBAFC638ABE079C88AE2DAECF1B9217F65E38B05AFAF2CD8BEA195F7030000949AC363F48C31717D75BBE38E1BAC83BA77EF7E4E5CFC392B7C9BEBA792D6198ADF7475E1A8EC83BA37FB00DA92FAA69F1CE390ECC3BDA7C5EBBFF6BD070000BAA0BFC4F872F3933DF7DC33CDE1D16601DCAF5FBFC3CACACAEE686868E83209EA0C135EA53EE923624C8B717C8C17DAF890527FF5D4D2FB95ECF5B37CBF0100009AC6ECA65A2ACDD8BCEAB4D34EDB2397CBA59AA9B1AD37949797F7DF6EBBED3E121FF6C9561D50EA49EA0C2DBFBBC548B3DEDD90C503213F9E378DD5AD0BF9BEE7A9297E87182F87B7C7F0EEB7093FBBF0FD000000A568768C6FC5F86B8CA75E79E5952377DF7DF7B43EB7A137EDB7DF7E4B1F78E081BFC5870B62CC54FC76BCE1319E88F1688C41213FA1D57DD96B97C5782CC6E290EFF23C2EDBAE6FF601AFDDC8CF2E7CFF71C1845700004069BA2E8B5EC3870F7F3AB4B8BF6F6B860E1DDAB35FBF7EFBBCF5D65BA94EAA55FC76BC54E8A656DD34EB735D8BA48F8FF1EFD9E3B47EEFAC405E1EFE7140766B57355ABE1FA02B48B78EFB46C8CFE0D8727D9A5F21CD8CBF509A00DE95D4C276682BEB538FC3349FCDCB52C4B63066CC980372B9DC5E9BB8F9EE1FFBD8C70E983C79F2FD5D21379DE93EBF6DDDB7B765D1FAC666FE5C452FD0950C8B3137E46F7390C6F014F67849B33A5EA6F00578573E1CF2C3F47E5E702E5D963DFE8F906FD4699026B6952953A6A49EAFEF6818ACAAAA9A10F20D8317C442774257CD4D85AF07404949F73A4F13034E0FF9D6DFE6F9119E8A717D8C1D43FED672B74A15C016199B15BF8F64C5EE91D9FA3466F294186986DD6352912155A0F805A0E3DC12E36731EE8CF17056F026C342BEC537B5087F42F10BB0C52E09F90B8C9F8DF1CB183FCED60FCC960F6545B1E2173A9932290028197DB222F717A1F571686784FCE4172E7C026CB934FFCC41213F696B4B695E855D836ECFA0F805A0438D0DF96ECD6936FC34DEA7B2E0B583B2A277AE34016CB14BC3DB1710E7B4786D8F18D7C4784D9A40F10B40C7BA3C2B7A6F0CF996DF1D0B5E7B31E4BB3AD74913C016FB4E8C79213FDEB7A574E1F1CD90EFFEDC5DAAA0F3D1F5ADC4ADEBBEAEBEC7DA1EE5353D6B24631BEB5EDDFDADD0F6ACE6D05E52B7E62FC63822E45B2176C9D6A72ED197648F6F91A6AEABAE5B5D4D3C2EF4705CE814C785D0181A17CB44514AB7324ADD9ED3AD3A0765EB762E287E3F2D45A0F8652B5BD37BCDECFE2BFAEFB5B8A763EBB63668E9A0D71B1B1B67C8045B4175C1F2D8ECF1EB217F5B8EB46EB614755D6B7BAD9D118F0B231D17B6BD01CB062C88D5EF03325174FAB478BE3AE4C7F8A67DEBCA183D632C9226E87C747B2E71B57D6BCF19B0644063CFD53D25631BEA51DDA37EE0E281831A1A1AC6C9061DECE68293B334D3F3842CD238B4B931BE1CE35C69EABA1A7A369C3360F1807AC7856D2BB5FA0E5A30A8C271A128CD28D8CF3E1F6356C80F2D498F5397E8BD639C2C4DA0F8652B3B6DAFD31E5ED97FE5F777FDDBAE0D43160C693AD8B2754F6E062F1C5CB3FBACDD979785B273468F1EADC58D8ED63CA6F7E1565E5B15E35FC2DBB73FA20B3A69FF9366ACEDB7F6BC5D67EF5AEFB8B08D8ADE45831A86BF307C7979AEFC2CC7859228825B4AF32B4C951EE87C747BEE02C61C3CE6E29BA7DFFCC7DE2B7BFF66E092817B55ACAB28AACBFD4B972E0D4F3CF14418397264183C787051E5BEA1AC61556368FC73435DC3B78F1F7DBC131CB6A6151B786D95F4746D9F3BE47357DDF6E46DF7F779B3CFF503970EDCB7A2B6A297AC6C1DF565F5AB43597830AC0B5F3F76F4B18E0B008A5FDADB49079DF44C5C1C5C8C7F7B555555EA46B4DF6DB7DD367BCA9429EFF369429BD20457699295A51BD8268DF94DADC2AF4B57D776E2C8135F8A8B9132019B65688C9B3661BB2F857C576840F10B9B66ECD8B195D5D5D5FBA5C7B95C6E8FF47CD2A449D53203AD4AF7F54DDD9EE76E609B74FBA3DB43915E0C03D8C616C4F8CA46F6B3FD63BC12F263821BA40C14BFB04962E17B44E1F39A9A9A517171B7CC40AB5277E6E9CDFF7CB293B315E1EDD99F93BDB3133700B64C9AD1F99F62CC09F9199E9B677F4E73E9A4DB1AF688B1BBC21714BFB05972B9DC171B1B1BD73F8F8FCF56FCC246A5A277588CB131F6CAD6A52ED1A91B5EEA12AD2B1EC0BB736FC8DFE7F7C3317A6705F13931CE8CF186F440E764B6673AB5868686135AAC1A75F2C927F79119D868F19B3C16E38B59FC3A2B7A974A0F40BB49B7397A30C64352018A5FD862A79E7AEAE85C2E5738BD731ACBB87D7979F968D901000036876ECF745A0D0D0D1F8DC56FE1AAE62727C6B85986A04DBB64CB013126648F0F0CF9F1C0D3A507A0DD0C8CF1C790BF407F508C5B62FC8FB480E21736D9A851A3D277F39C16ABCBB3E5A7CDFA0C9BB46FBFBF45B1BB426A00DA4DBF6C1F7B905480E217B6D8D0A1438F686C6CFC87B1BD715D6D2E97EB53535393BA3EDF2A53F00FFBF4C293B0B64EC8D2ACD07F952E802D926E15377023FBD910F4B401C52F6C8A58E4FE9FD6D6C7C2B73C7BFD44C52FFC8374C12875BD1BB691EDB657FC026CB11931EA37B24D0F6902C52F6C54EAF21C8BDBD12DC6FB366B2E7E53D7E76F4E9A3449374E789B31BD001D6F8E14407132DB339DCE90214346B598E5B9A5B5F1F5016BD7AEFD806CC13FA894020000C52FC5F0A52C2B3B71239B343509C702F84CD98277F8468C235AAC4B5DA16F8CF133E90178D7C6C418D1CAFA4762DC273DA0F885CDF5858DBCDED4B2D5D8D8786C362B3490D7DA38F81FC7981DE35FA407E05D9B12634D8B75FF15E3F218474B0F287E61939D72CA29C786FCAD03362A757DDE61871D4E9235586F6E8BE7A362BC14635CC84F840540FB4AB33DDF11F23D6C00C52F6CBA58D01EBA99DBEF2D6BD0A61D43BE3502808EDBCF4E9306280EBA8CD2A94C9932E52771F193C27555555513E2627C8C0B264F9E3C41966083BE1CF2F7F11D1063618C0F64CBC296DF3474E045A902D82277C7F87C8C7401FEF16C59A82C3BC79E2155A0F805A0E33C1BE35F63A42104D7C478B3C5EBBD63AC8E3141AA00B6481A729526BEFA61C85F607CB345E1DB2DE85D098A5F003ADC6321DF7B62748CEFC5F86670EF5F80F6947AD7A48B8CA9575A1AEFFBCBD0FA84834027E3AA1440694ADDF23E19F2DDA047480740BB4BC349D285C67D629C2A1DA0F80560DB49AD135F09F9EE79DB4B07408748B794EB1B635FA900C52F005B4F9F56D6A55B1D7D426A00DAC5E056D65D1DF2B7970314BF006C258FB5B1FEE6A0F517A03D3CDEC6FA2BA4063A37135E019496A56DAC5F9505004097A4E517000000C52F000000287E01000040F10B0000008A5F00000050FC02000080E21700000014BF000000287E01000040F10B0000008A5F00000050FC02000080E21700000014BF000000A0F805000000C52F0000008A5F00000050FC02000080E21700000014BF000000A0F805000000C52F000000287E01000040F10B000080E21700000014BF000000A0F805000000C52F000000287E01000040F10B0000008A5F00000050FC020000A0F805000000C52F000000287E01000040F10B0000008A5F00000050FC02000080E21700000014BF000000287E01000040F10B0000008A5F00000050FC02000080E217000000DEA50A2900E89AC68C1973442E977BB48D97C75755558D2F5C3179F2E49CAC0100C54ACB2F40173565CA94C7E2E2C54DD9B6B1B171A18C01008A5F008A522C6AEFDEC44DEF902D0040F10B40512A2F2FBF7653B6CBE57237C81600A0F805A028FDF6B7BF9D1E17AF6F64B3E50B172E7C58B60000C52F0045ABB1B1F1E68DBC7ECBFDF7DF5F27530080E21780A295CBE56EDBE081A2ACEC1659020014BF0014B5AC4BF3ECD65E4BB33C2F58B0609A2C01008A5F008A5AD6A5B9AD599FEFD0E5190050FC02501272B9DC94365EFA93EC00008A5F004AC28D37DE98BA3E2F6DB17A79434383FBFB02008A5F004A4ACB42F7CEA953A7AE92160040F10B4029B9B6F0492E9733CB3300A0F805A0B45456563E56F8BC478F1EF7CB0A00A0F805A0A44C9A34A93A2E5E4C8F73B9DC9CF87C85AC0000A5A2420A00DAD77DF7DDB74B5D5DDDB71BCB1A4FCA35E47629A6BF7DE9D2A5E189279E08871C72C8F0B3CE3AABB198FEF6C6D0B8241772B7D4D7D75F367AF4E8D9BE890080E217A0834C9B36EDD8DAFADA1B960F595EB77CFBE53BD5F4AC29BAFF87DD3EBA5B589AFD574CBA57771F3C60D980CF0C5A38E8B3F17338FBD8638F35533500B09E6ECF00ED24B5F8D6E7EA7FFBEAFB5E1DB070D7854559F816B3DACADAB078A7C53BCCDD7BEE80FAC6FADFDC7DF7DD7BC80A00A0F8056867EBEAD67D6FD990653D56F75DDD5D36B69DB5BDD6765FBAD3D2CAD02DFC54360000C52F40FBEF514F59B1DD8A7E9BB269C59A8AD07D59F750B1CAE8938EF0E6C037FBE61A73C7C80400B0FEFC4B0A00DA47AE213764635D9DCBD7968701CF0F08DD57BCDD385CD7AB2EAC18B122ACEBBF4E12DB49EA025DD6583640260080665A7E01B65671DC980BDB4DDFEE1D856F925A81D3FAB23ABB640000C52F4091AB78ABA2CD6ECE65B565A1C7921E920400A0F80528F2E277CD86479A54AC3512050040F10B50E452B767000014BF000000A0F80528668DB9C60DBF1E1A25090040F10B50DCD6F5DDF0AD8CEAFBD44B120080E217A0B8D5F5A90BAB765FD5EA6B6B87AE0DD583AA25090040F10B50FCD60C5DD3FAFA9DD684C672DD9E010014BF0025A0C7F2D6EFE5DB63450FB34103007420379504D80ACA6ACBC2805903428F25AD17BF7DFED627F458DA23AC18B122D4F5AA93300080F63E1F9302808ED57341CF30F8D1C16D16BECDBABDD92D6CFF97ED43AFD77B6905060068675A7E013A48F9DAF2D07F56FFD063598F4D7E4F2A7AFBBFD03FF4FA7B2FADC00000ED48CB2F4007E9B5A0D76615BE85522B70CF853D251100A09D68F905E820F595F5A176BBDA77F57E000014BF009D5ABA7D510A0000B63DDD9E81CEA27B8CE363FC7B8C1DDAD85F7DBA8DF756C6D87B033FFBC8189FDDC0EB4363F46965FDA53E160080D2A0E517D8565241DA37C6BA181F8FB13AC6A331FE2BC69BAD14C6212B8EEF8EF1B91837C4F85A8CB9310E8FF14C8C17DBF85D036374DBC0DFB224C61D3146C7F860F6772523637C2CDB577E20C6777D6C00008A5F804D950ACCFE311AB2FD509AD2380D8E2DCB0ACEA362AC8AF1E36CFB0F65EFF95D8C7131DE08F9D6E1B4EDE559E1DAD20D593417B169F6A895D9F36FC7382DC6A2EC795DF6B393276354678F3F1FE30FD9EFFEA18F0D0040F10BB0391E8AB173C8B7B8A6A2B76F56D04E8B313C2B4097146C9FD6A716D8E742BE95F73F37E1779465856BB3BE05CF3F5F50F836FB6DC1E39343BE257AA7ECF72683632CF0D10100287E0136472A62F78FF1488C1121DFD29B1C1BE3E1F0766BEEAE21DFF23B332B5A53EBEDB9315E8DD13BC66E59C1FCC9901F2FFC46F6BE2105856BCB96DF1D0BFE8E3D427EBCF045314E08F9AED5CD85F73305DBFD20C605053F1F0000C52FC0463577794EE379BB153C4ECBC231BFAF85B7BB2FA72ECEDF0AF96ECAE9FD6362CC8B5195AD2FB4386CB8E5B7D9EC2C4E0FF996DD6B637C35E4C712DF9B6D73608CF13196FBD8000014BF009BEBA9AC202DECF63C28468F16DB1D9FEDAF8685FCA454A925776207FE5D6932AE6B0A9E9FAAF0050050FC026C8954ECEE13F25D930F0EF92EC9A9E537CDCCFC648B6DFF1CE31B21DF1A9BE2F1901F933B77033FBF70BC6ECB6ECF43DA784F1A277C40568C1F5EB07EA08F0B0040F10BB025FB9E1DB3A236DDEA6878560CA771BD7342BE5BF2BF166C9F5A5E532BF1B090BF9D519A99794A7867B7E696D26CCEF30B9E17767BBEBB95EDD3F8E13493F4BF677F5F5FFB4A0080D2512605C03690C6EC4E0DF9B1B669CCEE922CE665C56D2A7C8FCAB6ED9EC52305FBACF362BC27E45B8093C1ADFC8EF91BF8FD0DADAC4B935E4DCAFEB637B242B93916F9C800008A9BD60C606B1B9415B67505EBFA64056E7337E5D40AFBE1909F802A7555FE75C88FC31D16F2B7463A22C62505EF1FB191DF5916367EB1EFA0186B5AAC4BF712FE661BC53500008A5F8036A556D5FFD984EDA6B678FE68561CA722764A8BD73EB5919F756F56346F4861E17B76B64C2DBEDFF7910100143FDD9E8162D35A97E58D15B6B59BF93BEAA4B96B3BE594538EADAAAAFA37990080D2A1E517802E6FD4A8511543860C195556567662C8DF377AFBECA58B64070014BF001491FADAFAB0FCF5E561FBE1DB87C686C6A675B9B2DC3BB6A95E591D2AFB56BE63DD5FAEFD4BD8EFF8FD42FFA1FD9B9EFFE9E77F0A879D7658E83BB86FD117BC43870E3DA2B1B13175733F36C62EBE2500A0F805A0C895772F0F8F5EF76838F05307865DF6DF254C1C3B311C79E69161E63D33C3B091C342EFED7A87FB7E715F38EFD6F39AB69FFDC8ECB0DD7BB60B739F9C1BDEF781F785C76F783C0C3B6C5858F0C282D0BD57F750B3BA26CCB863461839666451E5E1D4534F1DDDD0D0F0D1F8706C2C7C0734AF8F8F1B73916F0A00287E012872479F77747873C19BA1ACA22CF4DFA97FD8F7B87DC3F37F78BE69995A8107ECB4BE160C7D87F40D7F7FFEEF61D5D25561D1CB8B42CDAA9AA6D6E37E3BF40BF367CC0F77FDF4AE70C2F74E08AB97AD6E2A9C3BABB163C756565757A719C2CF8C716CAC717729A871531378D313852F00287EA1B3185F5555250B745A4F3FFD74D3CD987A0CEAD169FFC6D5CB57879DF7DF79FDF319B7CF082B16AC686ADD1D346CD03BB67D63EE1B4D45726AFDDDE723FB8487AE79282C9EBD38ECF1813DC26E87ECD654280F3F7278A7FD7F5DBA7469183366CCCC58F8EEBB81CD3658F0C67DCE04DF6CA0BDCF67A40014BFE08041517BE69967C22E3BED1276F978E71B3ABA72C9CA30F789B9E181AB1E08675C794618B0F380B06AC9AAA6D6DE6E3DBA35B5E8CEFAE3AC771E20BA5784DA35B5E195075F092F3FF472D398DFBD8FD9BBE93D977FEAF270D2252775EACFE3C9279F4CADB9FBDAE700008A5F8AC52429A0181C7CF0C1E3C3119DF36F4B9353EDFFF1FDC38C3B673415BE499FC17D9AC6F0A6F5A96BF3019F3C20DCF0D51BD6BF67CF0FEF19EEFEE9DD61C7BD760CE515E561E14B0BC3C19F39383C32F191B0F747F66E1A037CDCB78FEBB4135F8D1C3932DC76DB6D2FC6877BBF8B1F73816F36E0FC0614BFB0554C9E3C796E5C4C90093ABBB3CF3E7BFCCC41338BE6EF4D05ED1D3FBAA36902AC07AF7A309CF1CB33D6BF965A8A5F9BFE5A38E6EBC78427273F19F6386A8FA696E0D43A7CE82987366D93667DBEFD82DBC327C67DA2691C7067B3FDF6DBA7FDC73E69CC6F4D4DCDA8C6C6C6D373B9DC0971396833F63FF63D00A0F805A058BDFACCAB61970377097FFBCBDF9A26BB4AB336F7D9BECFFAD7536B6E5AFFC29F5E681A0B9C667E9EF7D779615DCDBAA622384905F1EE47EEDE348B74673669D2A4EAB8B83B452A84D7AE5D9B6E6B74622C844F8FCB9EBE0D00D03594490140D791EEEF9B5A6B97BDBA2CECB4EF4E4DEB96BDB6ACCDEDD34457CFDFF57CD8EDD0DDC2CE07EC1CEAD7D587BADABAA642B8DF8EFD3A7DE1DB5A213C65CA943B627C69E1C285FD524B705ADDD8D8B8CAB703004A9B965F802EA4CFA03EE183E77C30FCF5A6BF86834E3C288CFEEEE8A631C0637E36A6CDF7A45B1CF5E89D9FC17A970376696A114E91A4EED19D75CCEFC6DC7FFFFD75E1ED16E1AFAC59B3E603656565A7C742F8D3B1281EE0DB02008A5F008AD4A7FFFDD34DB730DA6FF47E4DCF9B27BF7AEDD9D7C203573ED0D4BADB6CE63D339B66764EB73A4A637DDF5AF45653CB6FF3ACD0CDF7FFFDE4F84F167D5EB2AED1D3528C1A35EA4B43870EFD442C8247F8C60080E2178022D5F27EBEC97B0E7E4FF8FCD59F7FC7BAFD3E9A2F909B5B79BB8AAC45F8D62C00801261CC2F0000008A5F00000050FC02000080E21700000014BF000000A0F805000000C52F000000287E01000050FC02000080E21700000014BF000000A0F805000000C52F000000287E01000040F10B0000008A5F00000014BF000000A0F805000000C52F000000287E01000040F10B0000008A5F00000050FC02000080E217000000C52F000000287E01000040F10B0000008A5F00000050FC0214A186F286653DD6F690884EA07B75F7505F56BF52260000C52F403BAB2FAFBFA3FF8AFE0D32B1EDF55BD12F349635FE45260000C52F403BEBD9D0F35FB75BB4DDDA9EAB7B4AC636945A7D072D1CB4265793FB9A6C00008A5F807676F4D147BF5E16CA4E79CFECF7AC1DB260485311C6562E7A170D0AEF7DE9BDD515A1E2F3A3478F9E2D2B0040B30A2900683FC71F73FC1FEEBBEFBE3DFB2FEF7FED764BB63BAC7C5D799F62FAFB57AD5A155E7EF9E5B0E79E7B863E7D8AEA4F0F75E5756BEB2BEA9F0E8DE1ECE38E39EE25DF460040F10BD081520B705C7CA418FFF6AAAAAA097131FE99679EB960F2E4C9137C9A0040A9D0ED19000000C52F000000287E01000040F10B0000008A5F00000050FC02000080E21700000014BF0014182305004057532105002563B718BF8FD1903D1F15E3C1186363CC28D8EECA1853A40B0050FC02508CE6C53829C69C18C363AC8AF15C8CDAACF8FD718C33630C932A00A0ABD1ED19A0B4F4CA968517375F8CF1E518E363CC8FF1963401005D8D965F80D2F2468C81319664CFD345CE3D623C1563EF90EF1A3D22C6F352050074255A7E014ACBE8ACB8FD54F67C568CD9312ECA9EA7AED1C74A1300D0D568F905282D0F84FC98DFF9D9F3FBB3E52F0BB6B92646BFA0FB3300A0F805A00855C6B87913B65B1BE328E9020014BF0014A363627C2118CF0B00A0F80528618FC63820C6F4184363CC6D659B1E31BAC7787F8C6A29030014BF00149BE5213FE6F7A090EF023D2EC6E331FE476A0000C52F00A528B5EAFE6BB69F4F512725004057E6564700A56BD7ACE855F802008A5F29002829B7163CBE5F3A0000F2747B06282DDF09F949AFD6C47838C615318EC85EDB37C6ACE056470080E2178022B72EC68C18C3B3E797C6581CA367F6F8CC909F080B0040F10B4051FA63C8DFE2A8217BDEBB8DED2E942A0040F10B40B13A2EC66E31E6857CCBEF7829010050FC0294B2CA6C79748CFF1BF2333EA7D99F9F0EF996E143A5080050FC0250CC0687FCC456699CEFAFB3383EC6BD52030074556E7504505A5297E725D9E30905EBEFCD8AE04A290200BA222DBF00A557FC4E8BF1C31833633CD7E2F5749BA33411D61AA9020014BF0014ABDD0A1E5F1FE3F3520200A0DB334029BB5C0A000014BF00A5EE71290000C8D3ED19A0B4A47BFB5E1063DF182BDBD8E635690200BA1A2DBF00A565765600EF1963C71817B558EE1FA35A9A0080AE46CB2F4069B921DBB7A796DF19D9BA275B2C3F254D0080E2178062755D8C4362D4C5688871501BDBDD2B550080E2178062D57C5BA354F4BE251D00008A5F8052F5871857C41814E38E18EF8971708CE121DF2A9CE67A7823C607A50A0050FC0250AC3E16F2637AD3C45787C65823250000667B062835BBC59815E391906FFD9D18E3FFC4182835004057A6E517A0B4FC264655F678488C2FC6E81EE347314E0FF9C9B0DE0C6D4F860500A0F805A0D3FB48B63C2AC627633C15A336C6FFCB0A60DDA00100C52F002563518CEF173C9F2F250080E217805292BA3A5FD7C66BBF0BF9D9A0A76DE4678CAFAAAA924900280DE3A540F10B508A3E14E37B213FA9E10531A684FC58DFCF66AF4FDBC49FE3400900287E01E8B42E8C31277B9CEEEF7B578C7E311E282880DB3249FA00A06439CE03505252C15B912D2F0FF96ECEBBC6F863C8DFFE080000008ADEC742FE7EBFDD0BD6ED9C2D7F10A3528A0080AEA65C0A004A46EAD2DC27C61B315664456EEF2CBE13E399184FC7382FC6C3D20500287E0128462FC4F8708CB5317E18F2E37E0F8D918BB17B8CA531B68BF16A8CD7A40B00008062B55BB6BC365B0ECF967BC718283D004057A5E517A0B4A4F1BE7D43BEC577518C0342BE2BF490181F8DF1A81401000050EC46C618DC46CC971E0000004ADD7029000000000000000000000000000000000000000000000000000013EF7BBF00000088494441540000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A068FD7FDE8CD9EF8E2563740000000049454E44AE426082, + NULL); +INSERT INTO `act_ge_bytearray` +VALUES ('212511', 3, 'source', NULL, + 0x7B227265736F757263654964223A22323132353130222C2270726F70657274696573223A7B2270726F636573735F6964223A2270726F63657373222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C2270726F636573735F617574686F72223A22222C2270726F636573735F76657273696F6E223A22222C2270726F636573735F6E616D657370616365223A22687474703A2F2F7777772E61637469766974692E6F72672F70726F63657373646566222C22657865637574696F6E6C697374656E657273223A22222C226576656E746C697374656E657273223A22222C227369676E616C646566696E6974696F6E73223A22222C226D657373616765646566696E6974696F6E73223A22227D2C227374656E63696C223A7B226964223A2242504D4E4469616772616D227D2C226368696C64536861706573223A5B7B227265736F757263654964223A227369642D41453336323135452D353838452D343946332D423734332D383330454243423330344130222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22E5BC80E5A78B222C22646F63756D656E746174696F6E223A22222C22657865637574696F6E6C697374656E657273223A22222C22696E69746961746F72223A22222C22666F726D6B6579646566696E6974696F6E223A22222C22666F726D70726F70657274696573223A22227D2C227374656E63696C223A7B226964223A2253746172744E6F6E654576656E74227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D38323934394441432D433932442D344241422D393932342D314632373945353044424338227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A37392E32323232323232323232323232332C2279223A3131367D2C2275707065724C656674223A7B2278223A34392E32323232323232323232323232332C2279223A38367D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D39434334443631332D313435312D343133432D414638352D383046383839314244313934222C2270726F70657274696573223A7B226F766572726964656964223A226D616E616765222C226E616D65223A22E7BB8FE79086E5AEA1E689B9222C22646F63756D656E746174696F6E223A22222C226173796E6368726F6E6F7573646566696E6974696F6E223A2266616C7365222C226578636C7573697665646566696E6974696F6E223A2266616C7365222C22657865637574696F6E6C697374656E657273223A22222C226D756C7469696E7374616E63655F74797065223A224E6F6E65222C226D756C7469696E7374616E63655F63617264696E616C697479223A22222C226D756C7469696E7374616E63655F636F6C6C656374696F6E223A22222C226D756C7469696E7374616E63655F7661726961626C65223A22222C226D756C7469696E7374616E63655F636F6E646974696F6E223A22222C226973666F72636F6D70656E736174696F6E223A2266616C7365222C22757365727461736B61737369676E6D656E74223A22222C22666F726D6B6579646566696E6974696F6E223A22222C2264756564617465646566696E6974696F6E223A22222C227072696F72697479646566696E6974696F6E223A22222C22666F726D70726F70657274696573223A22222C227461736B6C697374656E657273223A7B227461736B4C697374656E657273223A5B7B226576656E74223A22637265617465222C22696D706C656D656E746174696F6E223A22636F6D2E6C656E2E6163746C697374656E65722E4163744E6F64654C697374656E6572222C22636C6173734E616D65223A22636F6D2E6C656E2E6163746C697374656E65722E4163744E6F64654C697374656E6572222C2265787072657373696F6E223A22222C2264656C656761746545787072657373696F6E223A22227D5D7D7D2C227374656E63696C223A7B226964223A22557365725461736B227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D43423837323236392D433930412D343839342D394538382D304538384238364543384446227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3238382E32323232323232323232323232332C2279223A3134307D2C2275707065724C656674223A7B2278223A3138382E32323232323232323232323232332C2279223A36307D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D38323934394441432D433932442D344241422D393932342D314632373945353044424338222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D39434334443631332D313435312D343133432D414638352D383046383839314244313934227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3138372E36303530353132333635343432382C2279223A3130302E39303833313534363834373331327D2C2275707065724C656674223A7B2278223A38302E31373533333037303739303031392C2279223A3130302E32393039303332383135323638387D7D2C22646F636B657273223A5B7B2278223A31352C2279223A31357D2C7B2278223A35302C2279223A34307D5D2C22746172676574223A7B227265736F757263654964223A227369642D39434334443631332D313435312D343133432D414638352D383046383839314244313934227D7D2C7B227265736F757263654964223A227369642D32323745363933372D423435362D343735432D424332332D453842383539374238354131222C2270726F70657274696573223A7B226F766572726964656964223A226872222C226E616D65223A22E4BABAE4BA8BE5AEA1E689B9222C22646F63756D656E746174696F6E223A22222C226173796E6368726F6E6F7573646566696E6974696F6E223A2266616C7365222C226578636C7573697665646566696E6974696F6E223A2266616C7365222C22657865637574696F6E6C697374656E657273223A22222C226D756C7469696E7374616E63655F74797065223A224E6F6E65222C226D756C7469696E7374616E63655F63617264696E616C697479223A22222C226D756C7469696E7374616E63655F636F6C6C656374696F6E223A22222C226D756C7469696E7374616E63655F7661726961626C65223A22222C226D756C7469696E7374616E63655F636F6E646974696F6E223A22222C226973666F72636F6D70656E736174696F6E223A2266616C7365222C22757365727461736B61737369676E6D656E74223A22222C22666F726D6B6579646566696E6974696F6E223A22222C2264756564617465646566696E6974696F6E223A22222C227072696F72697479646566696E6974696F6E223A22222C22666F726D70726F70657274696573223A22222C227461736B6C697374656E657273223A7B227461736B4C697374656E657273223A5B7B226576656E74223A22637265617465222C22696D706C656D656E746174696F6E223A22636F6D2E6C656E2E6163746C697374656E65722E4163744E6F64654C697374656E6572222C22636C6173734E616D65223A22636F6D2E6C656E2E6163746C697374656E65722E4163744E6F64654C697374656E6572222C2265787072657373696F6E223A22222C2264656C656761746545787072657373696F6E223A22227D5D7D7D2C227374656E63696C223A7B226964223A22557365725461736B227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D37363332463035442D343046342D343145362D383039352D323634444444333541324332227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3439372E32323232323232323232323232332C2279223A3134307D2C2275707065724C656674223A7B2278223A3339372E32323232323232323232323232332C2279223A36307D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D43423837323236392D433930412D343839342D394538382D304538384238364543384446222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D32323745363933372D423435362D343735432D424332332D453842383539374238354131227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3339362E34323134343039373232323232332C2279223A3130307D2C2275707065724C656674223A7B2278223A3238392E30323330303334373232323232332C2279223A3130307D7D2C22646F636B657273223A5B7B2278223A35302C2279223A34307D2C7B2278223A35302C2279223A34307D5D2C22746172676574223A7B227265736F757263654964223A227369642D32323745363933372D423435362D343735432D424332332D453842383539374238354131227D7D2C7B227265736F757263654964223A227369642D42383042363037442D363646352D343834422D383041312D373935334238444445363943222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22E7BB93E69D9F222C22646F63756D656E746174696F6E223A22222C22657865637574696F6E6C697374656E657273223A22227D2C227374656E63696C223A7B226964223A22456E644E6F6E654576656E74227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3632382C2279223A3131347D2C2275707065724C656674223A7B2278223A3630302C2279223A38367D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D37363332463035442D343046342D343145362D383039352D323634444444333541324332222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D42383042363037442D363646352D343834422D383041312D373935334238444445363943227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3539392E393730343836313131313131312C2279223A3130307D2C2275707065724C656674223A7B2278223A3439372E37333433373439393939393939342C2279223A3130307D7D2C22646F636B657273223A5B7B2278223A35302C2279223A34307D2C7B2278223A31342C2279223A31347D5D2C22746172676574223A7B227265736F757263654964223A227369642D42383042363037442D363646352D343834422D383041312D373935334238444445363943227D7D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A313230302C2279223A313035307D2C2275707065724C656674223A7B2278223A302C2279223A307D7D2C227374656E63696C736574223A7B2275726C223A227374656E63696C736574732F62706D6E322E302F62706D6E322E302E6A736F6E222C226E616D657370616365223A22687474703A2F2F62336D6E2E6F72672F7374656E63696C7365742F62706D6E322E3023227D2C227373657874656E73696F6E73223A5B5D7D, + NULL); +INSERT INTO `act_ge_bytearray` +VALUES ('212512', 2, 'source-extra', NULL, + 0x89504E470D0A1A0A0000000D49484452000002A6000000BE0806000000E761CD40000000206348524D00007A26000080840000FA00000080E8000075300000EA6000003A98000017709CBA513C0000000467414D410000B18E7CFB5193000000017352474200AECE1CE900000006624B474400FF00FF00FFA0BDA793000000097048597300000EC400000EC401952B0E1B00001B104944415478DAEDDD097C54D5BDC0F1FF9D992C6C090442202C52A4802B8BA855A1202250B18A169B44C402DA67DD5ADBBEF7146D2D7EACFADADA576DA9FAEA82C56042D14FA90BE256A3E02E104411102112246058122021093373DFF9E7CE984B4C3090643299F97D3F9F6366EEDC593CDCFF9CFF3DE7DC33220000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C4178B2A0044366FCEB9FAC081E3675556669E5A51715CE76030914A69EE978B15908E1DB797272595AE32B7EF1B39F2D667A8156208C41040620A34E2D34F677E7FEFDE11F36B6ABA77CFCC7C41BA76FD4852533F118FA786CA69264D4CF6EF3F5ECACA4E96929249C160D0F7597575CA65E3C75FBA86DA2186400C0124A680CBA64D33EFFAE28B0BE60C18906FF5EBF7AFDADE09B49EE2E28B65F3E619871213F7CF3CFBEC594F5223C4108821A03E2F5580786D5077EE1C3FE79453EEB43232969B06D5A6525A596AEA06E9D1E33D6F49C9F7BE3F6BD60FD7CF9FBF781DB5420C811802484C11D70A0B6F1B5D5A3AE6316D5075C8B1BE9A83A9B2FD93F1F2C5DAC952B27EACECDBF96DF1FAAA25B9CB2E2AAF991213CB242DED03EFB66D174EB9FCF259CFE4E6E67E49AD1043208680300F558078535595B948871E1B6A50FDD59DE4B3B77364EFB693C55FD3A176DBC17D3D656BE1F7654FF1A9545E0BE8DCB948060D9ADF2131B1F2116A83180231049098226EAD5A75D7797E7FD7DE3A1FAE21BB3E1F2187AABA34F8D88E0DDF15DB26645A42BF7E4B3C3EDFC1C12FBFFCF277A80D6208C41040628AB864DB093FCBCC5C6A357691C6C1F25E8D3E577B7FB437082DA34F9FE7F5CF0FA8096208C41040628AB8545DDDFD0C5DCEA6D14637E8FB8646999069296969ABBA793C3593A8096208C41040628AB85459D93BBDA1797188BC2E5D3E936030E1446A82180231049098222ED976828785BFA3E4CBA7F6DFC16265106208C41040620A3424A143F9911F4FAAA092006208008929D0FABAF75F2309C9FBBFB6DDB282923EF07DB13C7E2A09208600909802ADAF63D7ED92D66FEDD7B66B43DB7B68011504104300484C81C8F1D7247F6D5B3090585B00104300484C810834A61DA4F8C3EFC99EADC31B7C6CE31B3365DF97C75351003104A095F8A80240E4C0EE7E52BC664AA3BF58A3F4F7BF8B3EB854BAF72F945E43DE106F42351507104300484C8196113894243B379D23BB8B463479E1EFDD5B87CBFED26F49E689AF494AC6A7542288216208400B61281F714D7B78766D39EDA87F8DA6B6E767E5D423FEFC22400C114300484C81266BEEC518017F02950862881802D04218CA475C1B78663E9500104300A2043DA6000000203105000000484C01000040620A000000D4C7C54F0000006D60FAF4E97DFD7EFF54CBB2C69ABBFA9369BA7E5A6753AA4CD961DB76A179EC4DAFD79BBF70E1C26D24A631E68C85975FD6B928382BB95C4E4F2EB7527D07ED044F8D48D06BDB810E96BFBA8BECAC49B13F0874F3DDFDEA4D0BDF27640000404BCBC9C9996AFE5C1FF4FBBF6B12CF86D65C4B366580796C80F93B351008FC213B3BBBC0DC7F342F2F2F97C4B49D3BEF7739BFEF506A5F9FB022D8715F1F91D253450EF6B0A5C69C9304CDE1E0A9B12C5F952474D8257D53B65A7DBB6E084CBDF8869C2F2D4BEE59F297BCFB08210000D05C26B91C60D9F643B66D4FAADD60128DA330CE3C6F9C798D6B4CA23A6BF1E2C59B484CDB9931F3B2CF4BD9224FFB8AEDD46DA345CAF5BCA38159B59A9CD6684931FB0C14291E27925A64F7CC5C21FF3BF59AAC9F275404272ECE5DBC8190020000C7222B2B2BDB63DB0F042DAB5B789BD7B6E5E41D3BE4CC6DDB64D0AE5DD2B5AA4ABA54574B6562A29425274B51D7AEF25EBF7EB22A33530E79BDE1A78DF67ABDAB737272AE8DC5DED3984D4CCFFD5DD62369AB64F6CE5162ED1829477D999726B1A6583D575BFDFBBCE35B3BF5C69CFFA6F71400001C43527AA1C7B2728326170D27A4DFDBB041267EFAA9A457547C6DFF8E3535B52573DF3E397BEBD6DA24F5F9A143E585214324E0F4B276B66DFB09939C269BE4F49158AAAB98BC2A7FCC5FB39FE8F69975D5A68B4D523AAA79FF975F8E10D930CD4EF054D97FB8F867D9B7125E0000E02892D26C93942EB14349A9269BF72C5B26D30B0B1B4C4A1BA23DA9BABF3EAF5F79F957DB4D72FAB0494EAF20318D62E7DE9D3DAFC71A99BEFE872215BD5BE6352BD345D66789CF572173A75D95733561060000BE89CE2935D9E803E1A4744869A9CC7DF5D5C392CBA3A1CFD3E79FB273A73B397DD024A743494CA3D079F7649DDE7D9375EDE62962E97CD196A4AFF7E9259260F9EDFB63E900000000AD96643D129E53AA3DA5BF5CB1A2760E6973E810FF4D6FBEE94E6E7558FF6112D328D469A767E98E51B6A7A57A4AEBD39ED32FCE968E8712ED45841B0000688C2E091514394F6FEB9C524D269B9B94BA93D31BDF7AABF6754346C7CA907ECC24A613EFC899631DB2BBEB9CD0D6A4AF7FA8A31C1F6B733ADA8BECECEC5F69B08F1B378E1F87008821209A63E5FAF00DBDD0E95887EF1BA3AF77E1FAF55FDDB76DFB9A58A8F798F9624A2AB3FF73DB18B182DED67FAFADE3A5D3C0A5C19BCDCD5C4237E2EE34C127191919E5E64BE359CBB216FAFDFE158B172F3E108D1FB6A44464DB3691D34F3F7CBBDF2FB277AF487AFAD1BD9E394996C4C4861FFBDBDF4466CE6CFCF1F03EA3478B9C78A24861A1C8F0E1CEF6CF3F1739EE380EAE788AA15EBD7A556465652DF1783CB9D11C436E0B173AC76F538FD537DF14D9BF5F64F2E4BA6DC1A088C7430CE1A862A5CAB437AF9AF6665E5363457FD12918089CABB76BAFC0DFB8B1553EE06493F02E1D3C38BC94D4689DD39A9F9F5F4462DAC626FC317B846F8374AB5DA73402F61FA76BE27AFAC7C201D05E992F8854F3E70AF3A57185D7EBDD63FE2D9E31DB16252525153CFEF8E355D1F239172C10193850E4B4D3449E7842A47B77A7517CFC7191F1E3457EF21367BFDDBB4556AF766E57563AF757AE14B9E00211FD3E1B30C06960B76E15B9ED3667BFE26273C6DCAFEEBD3A751279FF7D9173CEA9DB567F9F0F3F14B9FC72E7F68D378ABCFAAAD308EBB6E5CB1B6FB011933A9998996E6268BA89A17D2686FE65EE3F196D31E4A631A4B1D05802F8DC73871FC36FBF5D978CAA22F36DBD6C99C8534F39C73D318426D25F619A6262658A3991AB34B1F2A2B9FF687272F2AB8DC54AE867466BB3C561252592A65FECAD40AFD61FB97DBBBC5B77904E33E55E12D3B6FE9FD823D7EF1B2056242726EC1D6CFBD30BDBFF011023D24C9969BE346656555555982F8DC5E60BE15F252525CF151414F8DBEA4369EFA6F698DE7CB3C84B2FE919B439567D4ECF4A8F1E7549A9D284F58413449E7D56E4B2CB44BA741179EB2D2731D52475CC1867BFA54BEB9EF3E49322279D54D710EA459AA9A975FB141438AFABEFAF3DB4E6FB4B0E1D12D9B44964D72E91BE7DEB7A86FAF7A7418D737AB9E80C1343334C0C55E5E4E4FCC3DCFF675BC7507D1B3638230D8DB9F0422791DCBCD9399E93939DED1A4F1A031A63D75D470CA1599D221DCD9F4BB49850A931EDCDF366DB82FAB162B68D0DDF3E430FCA56A4AFEF4A4CC792984681844A19BBFB84C8BE67D90049EBF1919C4F621A7DBD40E124B557AF5E7B4C036B5242F97B5BF4023DF698C86F7EE334A40F3DE4F49A262589DC7AABD3806A43E77345609F3EE6584E70F6D1C64E135B6D20D7AC697C68515F274CA70C68E378EAA9CEFDA1439DDE5AA50DEA8E1D4ECF51B76ECEF6471F753E9BBE67D8451799CAFABBB30FE2B777C8C4CF95E6EF952686B427F525FD7DEE68E8490D4F813912EDF15413273A31A1468C70924CBD7FEEB9C4105A8C7E335F62E2E5928C8C8C4AD3DE2C37F7EFD3583149EBF0F04E03F7EC69D50F31A0ACCC7D77787BAFD498484C13F7591995E97644DFF3600FF39F803DC27C69CF2536A3569AF9C2C8367FB3CD97842E72BCA9B4B434226FAC43889A546AE3F4FAEB220F3EE8346C7FFEB3C8BC794EE376CD35221326E8959BCE7D6D74B53766FB76A7C74793D1708FA9EEA7DC3DA6DA8B73E79D4EC2ABD6AD737A62B571D5214B9D673F678EF358E7CE2283063949AFF600E93EDAA0EA67D3A151A5AFF5EB5F47B6413D70E0801043514D7B52A799389AA63164FEAD3E8B540CD5A7276A3A57BB29D78F7CFCB1D35BAA31A1B417544FF0860D3B7CBFF61E43A5A59D64D5AA55C45014D09E54132793CCCD491A2BC6574949D7AAD63D9FABF7FA3D484CA380B7DAEE78A85384CFDC7588C8B67408F9378464BBF9E218F4DE7BEFD52682ADEDACB39C796CAFBC2232638636204EB9E38EBA7DB4B7E5A69B9CC454870075EE9B0E11EAF0A0366C4DE931D5FDB521543A6D407B89B401D5B96EDAB0BAE930A5EE9F9B2B72E595CE7B4C9DEA3CA6C9B07E9E8E1D23FB6FB2D1B92080186A3F8E8F540CD5A7B1A4C3EE7A02A7C7724646C3FB69423AA281D559B427D4B526794CC4D0EBAF7F4B563B93D389A1286C72C2375A6A89A8C6E8D251EE1020318D021EBF788389917D4F7D3FCBF925873B88BF883AE62F6093986E1E3E7CF8C0487D506D2F34A10C2799DAD8E9C5197A5B1BCF7FFFDB994F1AA643809ABC8E1BE7ECABBD31EE1E539D2757BF61D5463ADC8BBA76ADF35EFADA7A3B33B36E3F6D641F78C079FC8A2BBEDE78EABE914E4AD5E0C183B5612586A22F8602B66162C6573F86468D1A35B02D3EB426A63A4FBB572FE758BEA391A34663262CDC5EEB367DBE269E7979725862DD9E6368ECD82DB279F30C62A8EDDB1BBDBCCE532F568226846AB7ED4F4A6AD5E4B4F2F09E8BAAF65EE931919806BDE2F7D4882F92C9A9793FB1C5AE5E94BF682EB11B39D9D9D94D4E4CCD974299F972784597944A4A4A5AA6F3E366CF9E1D91391F3A34FF8B5F38BD2F59597573D694368ADA38BA1BD0FACFD57972FA5C6D58B5E1D4BF7A45BE26A9EE2B84758E6AF875DCBD3D9AC4BA7B7BF4E2292D37DC70E4CFAD89F1D12E61D51C9DCD87CDCFCF2786A220864CBCE8851B41132FFA4DEA357FDB3486DCF4244DA7B78487DC350EB4B3DD9CD77C452F2A0C9F0C86E9CA164AB7E963FA3ABAD493FB386FCF31949E5E2123478E949B6FBE99188A7C7BE34E463DF563A5AAAACA9CDAC8207DB0CC9CE9B466625A967C5827E92E12D368484C93A522A14252AB239898FAAA6A4F897613BA6D2BD4AB63B936E9FA72CB4C59D4A14387574C435AD6169F4B87E6C34BC76862F9DA6B5FBFE8C22D3C6CFFC61BCE73B4674893D38A0AE74A64EDA5D1C6B2FEDC355D4BB1A1DE1E6DC48736E18773B507D6DDF8BEFBEEE1178320E6699F62C0940EAEDED1A88821B75B6E11B9D77599A90EBD4F9922F2FCF37543FABA8494165D01A3674F2716C2173FE914009D2FAA71161E7A2786700CED8DDF15279E23C58A496A0BC389E9E6B4B4165F5CDFADA86B57F7DD4212D3281048904F3A96CA77AA2378D146A71DB2CDB2DBFF01D0DE859252FD7278CA94E79393939F8B863518B537E7AEBB447AF71639FBECC67B47754D44ED4DD5354A35019D3FBF6EC999F05A8ADAF0694F8D5E70A1FBBBE9C51B61EEDE9E867A9C0E985A3A7830743217747A90162F767A80F4FD9536E4DACB14EE9942CC4B7425A3511543613A64AF8BDE0F1A54B74D93D1BBEF1619354A64EE5C6754227CDC6B0C8417D1D72453AF98D784557B4DC3EB99124338C6F6C6D7D4583149ECEB667F5D5252DEEBD74FC66ED9D26A9FEB3DF7309AC8EB24A6D170B0F8E5D994AD72C6DEC1915BC9B4DB46DB7C4D59AF13AA6D76E6AA67A6051E8F27BC145459347D3E1D62D4A5A2C24BCD2C59E20C196A63A9F34AC33D34DA23AA8DAC967003A9C3943A17353C1CA8438ADA0BA3F4A45BAF306E688171BDA25F1BC5867A79C2AB0368C21C6E74B5072ADCB3A36B3BEA851B7AC5B15E240262A8ADE90999FE7293267D7A52569F2690FA0316EFBCE31CFB6E9A406AC278FBED222FBEE86CD393C46F420CA1A562C5E7F32D0904027FD29B6BCCC1B7A763C75659645F87F1576666EAF49AF0C8E15324A651A0C341EF026B53E0579F8F970E914A4DBB1659DD63E10068877E6DCE428BCC99EA53D1FAEB3461035D9788D41F3E3C126D847FF4A3A37FBFD9B38FFC538AFA19DC9FC33DDCD8588F2E88A1B6A2276B975E7AE47D747A4C435364525244AEBA4A64D6ACA35BF49E18424BC5CAC2850BB7E5E4E41498A47642C0B2E485C183657A61CB0FB22E1B3244FC5E6F38295D110BBF46191389A91E00D366E77C9C5A648F2A8FC0F5A2DD36DA1F5935529E9FBFA888B88D2C1374BFA5161A9698481D8018723BDA5F622286D0C2B1F257536A57A17EC12490DFDDB2A545E79A16A7A6CAB343877ED55B6A92E8FF8B89B88D950328E1A0DCD5FF356BBF045BFFBD06BC6CF93C96E721C216000034242F2F6F89F953A0B7B5D7F4BE73CEA95D3AAA25E81251F79F734E205877F1EF8A9292927C12D3283B00122BECB5BD3F90565DC9B6DF6BF61BDE6AD9152B070000006835B324B484D3F69414F9E3E8D1CD4E4E35293549AEFD454A8A37B4E980C94F7F5C5050E027318D32965FA6F77E47AA3A6FAF5DFEA4C575DE2145196B3C4363E900000000AD43E77CDAB67DA3B9599B336C484F97B9E79D573B0C7F2CF479B74F9810589B91F1D532892627B9362F2F6F7DACD49927D60E00EB90FD93414BACFD89FB5AF6B593CA65C790459260D9F2CB583A00000040EB59B468918EB0FE389C9C6ACFE99CC99365E1F0E1F517C76F94EE973F6C98DC3279B2BBA754570C98637292DC58AA2F5F2C1E00D9D9D9C9272D907B375E2A5D2A32A5D9D3D93B9758EB86FCC34E15BF3D2F6F517E2E610600009A2A3F3FFFF1ACAC2CBDB2FF41CBB2BAEA9CD3E7860EADBD286A5849899C515C2C03F7EC91AE5555B5BF12A5C3F59A8CEAE2F92BFBF695957DFA04ABBD5EED4C0CF794EA7AAA379A9CE7F158AB2B5F2C1F004317590F947C47766D3F53328FB16FD8DFFF6579B9E747F648B1E596FC183C00000040EB0B759CBD6312D387751929DDA609EAAACCCCDAF20DDC59CC0A9D5218ABA3B7BE583F00FABC633D9CB1DA0E6C99248965C74B46539F9FF689FDC680973D291EBFDDC51C00E3F2F219BE070000C72EB4CEE8F9263F9966728B6B4C823AEE2872B115A63CBA63C78EDC58BECEC5172F07C0B79FB1AE09786D39D05B8A779F2C29077ADA9DFC5D24239068F9BC35B2DB77400E74DE21C53DD64975972FAC4112D0B313FBFE583F00000040C4F313FD819EA7A64F9FDE37180C4E3309AAFE08F528537A99A2134F75D85FAFE6D755F9F557269F8A85C5F3E33E316DE80048DD169C9652AC0780A507803F54079D4CD15F402E730E003B6E0E000000D036F40782CC9FFB4205F192987200000000443F0F55000000101159A61CE7BAAF1D84BF6FC2F396C54BCE46620A00001019634CF9DC755FA714760CDD0E2F6FA9734C4F0B25B0E152634A3FD7FDBB4CE9168B15E48BE38363B029E9A6BCE9DA7653E8AC247C05FE99A69C250CFD030080E6196ECAFC50FE3138B42D68CA00532E30E574531E30A5D49495A184B532B45F852BA1D515866E8BD54A8AF5C454CF4CBA9832DE94BDA6AC0E9D89CC0EFDE3EFAFB7FFB07A49E845A1FD0000008E95F6868E3065A13843F7F798B233F49826A54B43C5ED5953FE18BA9D19DA4FCD34253B94D49298B633CB437FBB9B5262CA2BA6740E25AAEE03A04FE880E91BFA87D7B397BCD073BE30657228B17D97D8020000472939945CCE31E56953768B33DF543BC8B45774AA381D694FB89EF3A52B5799E1BA7D4AAC26A5F1909836E50CA626947CEA01A1BF675B60CAEDA1339AA75D6728DAFD7EA9D40DF303000034C53E531E136764767928FF7821B43D9C70A6D77B4ECF500EA2CFE96FCA2C717A59CF8AE58A8AE5C4F444530686CE2AC2FFA889A1B39601A17FEC8B4D992B4ECFE8845022AABDA96F859E5B2DCE1CD49AD0D9CD6E620B00001C835C53FE29CE34411DC1FD2F53DE0E3DA6B989F684DEE1DA5F87F1DF17A767756B281759EA7A0E89693BB32E54944E320E5FD4E41ECA770FE7A78712543D13F95DE8AC242394B04A28B965281F00001C8B4952F7C33E43433947380FD1DCA453BDFDFF6DCAFDA6FCC29479A6BC64CAFF88D3A14662DACE9D24DF7C65BDF6ACEA4F8269D7F9BE50325B2475F3542F21A60000C031E81E4A3035BFD02BEE5F09E515E1CEAFE47AFB6B67D9D5A6DC22CE352E4AAFD6FF9B38530034697D2494DC9298B633BACED7F626ECA7DDE73F15679DB0D389210000D042742AE022533E746DDB164A50556757EEA149ACF6A8DEE3DAB726F477B32953C419C52D89C58A8A87C4F43FC4199AFF267A76A2DDE87A65DC0DE20CE59F2DCE4551F152570000A0757C58EFFE7CD7ED03A6BCE64A6297D7DB7796EBB65EC51FB3F34C6339D9D2330E5D205FE76754B9B66BF2B9B181A4F42CD7D9C9BDE24C4ED649C7E1ABF00712530000A00D04E3E57F349613533DE358DAC076ED09FD73BD6D3A6FE3997ADBEADF9F475C000000B41E0F5580786259FE403098484544C3E97FEDBF831DA02688211043008929E2526262D9E6F2F213A88828505E3EA4C4A439ABA9096208C41040628AB864DBBEE7CBCA4E0952136D6FE7CEB1BA60740135410C811802484C1197AAAB53FF5E5C3CB5D2B6BD5446DBF297944CD60B149FA62A88211043008929E2D2C489130BFDFEE4F7B76EBDA49ADA683B1B365CB73C10482A3AFFFCF3DFA13688211043008929E296DF9F70DD679FCD3C585E7E02170DB4817DFBBEBDA9B878EA89C160F0E7D4063104620870632C067127373777D79557CE5EB973E7D8C9DDBAADE9909CBC8B13B48835A8833FFEE083BF249BAF9E6B274E9CB8821A2186400C0124A6887B0B162CD83C63C6D585DBB74FBCC8B67DC5DDBAADED6E593615D37A0EAC5BF7CBA5EBD7FF748836A813264C788E2A2186400C01F5595401E2D98B2FBE38D4E3F1FCC9EBAD19DEB3E71B9B32320AD2D3D2561FEFF1D4F013B4CD140C2696EFD933ECA39292F37797968E19120CFA8A75E871D2A4491F513BC410882180C41468C44B2FBD34DCB2AC1F989BE34C19654A32B5D26C7E530AC559CEE6692ED22086400C010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022E0FF0121C2023A02FEDB030000000049454E44AE426082, + NULL); +INSERT INTO `act_ge_bytearray` +VALUES ('247534', 1, '请假流程.bpmn20.xml', '247533', + 0x3C3F786D6C2076657273696F6E3D22312E302220656E636F64696E673D225554462D38223F3E0A3C646566696E6974696F6E7320786D6C6E733D22687474703A2F2F7777772E6F6D672E6F72672F737065632F42504D4E2F32303130303532342F4D4F44454C2220786D6C6E733A7873693D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D612D696E7374616E63652220786D6C6E733A7873643D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D612220786D6C6E733A61637469766974693D22687474703A2F2F61637469766974692E6F72672F62706D6E2220786D6C6E733A62706D6E64693D22687474703A2F2F7777772E6F6D672E6F72672F737065632F42504D4E2F32303130303532342F44492220786D6C6E733A6F6D6764633D22687474703A2F2F7777772E6F6D672E6F72672F737065632F44442F32303130303532342F44432220786D6C6E733A6F6D6764693D22687474703A2F2F7777772E6F6D672E6F72672F737065632F44442F32303130303532342F44492220747970654C616E67756167653D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D61222065787072657373696F6E4C616E67756167653D22687474703A2F2F7777772E77332E6F72672F313939392F585061746822207461726765744E616D6573706163653D22687474703A2F2F7777772E61637469766974692E6F72672F70726F63657373646566223E0A20203C70726F636573732069643D2270726F636573735F6C6561766522206E616D653D22E8AFB7E58187E6B581E7A88B2220697345786563757461626C653D2274727565223E0A202020203C73746172744576656E742069643D22737461727422206E616D653D227374617274223E3C2F73746172744576656E743E0A202020203C757365725461736B2069643D22757365723122206E616D653D22E7BB8FE79086E5AEA1E689B9223E0A2020202020203C657874656E73696F6E456C656D656E74733E0A20202020202020203C61637469766974693A7461736B4C697374656E6572206576656E743D226372656174652220636C6173733D22636F6D2E6C656E2E6163746C697374656E65722E4163744E6F64654C697374656E6572223E3C2F61637469766974693A7461736B4C697374656E65723E0A2020202020203C2F657874656E73696F6E456C656D656E74733E0A202020203C2F757365725461736B3E0A202020203C73657175656E6365466C6F772069643D227369642D30443235384332342D314631392D343233332D413937362D4130443843423944414541432220736F757263655265663D22737461727422207461726765745265663D227573657231223E3C2F73657175656E6365466C6F773E0A202020203C757365725461736B2069643D22757365723222206E616D653D22E4BABAE4BA8BE5AEA1E689B9223E0A2020202020203C657874656E73696F6E456C656D656E74733E0A20202020202020203C61637469766974693A7461736B4C697374656E6572206576656E743D226372656174652220636C6173733D22636F6D2E6C656E2E6163746C697374656E65722E4163744E6F64654C697374656E6572223E3C2F61637469766974693A7461736B4C697374656E65723E0A2020202020203C2F657874656E73696F6E456C656D656E74733E0A202020203C2F757365725461736B3E0A202020203C6578636C7573697665476174657761792069643D227369642D35353636443037362D414234432D344134322D393938462D323533373738394638313831223E3C2F6578636C7573697665476174657761793E0A202020203C73657175656E6365466C6F772069643D227369642D33334642463234452D464537302D343730412D394442352D3942313838314531333834372220736F757263655265663D22757365723222207461726765745265663D227369642D35353636443037362D414234432D344134322D393938462D323533373738394638313831223E3C2F73657175656E6365466C6F773E0A202020203C6578636C7573697665476174657761792069643D227369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535223E3C2F6578636C7573697665476174657761793E0A202020203C757365725461736B2069643D227573657222206E616D653D22E8B083E695B4223E0A2020202020203C657874656E73696F6E456C656D656E74733E0A20202020202020203C61637469766974693A7461736B4C697374656E6572206576656E743D226372656174652220636C6173733D22636F6D2E6C656E2E6163746C697374656E65722E4C656176654C697374656E6572496D706C223E3C2F61637469766974693A7461736B4C697374656E65723E0A2020202020203C2F657874656E73696F6E456C656D656E74733E0A202020203C2F757365725461736B3E0A202020203C656E644576656E742069643D22656E6422206E616D653D22656E64223E3C2F656E644576656E743E0A202020203C73657175656E6365466C6F772069643D227369642D34373638373538312D333535422D343335342D383433432D43333034323333323836414622206E616D653D22E5908CE6848F2220736F757263655265663D227369642D35353636443037362D414234432D344134322D393938462D32353337373839463831383122207461726765745265663D22656E64223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D747275657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C73657175656E6365466C6F772069643D227369642D46423539344242452D383030352D344544432D423343382D39373831454432323643393522206E616D653D22E4B88DE5908CE6848F2220736F757263655265663D227369642D35353636443037362D414234432D344134322D393938462D32353337373839463831383122207461726765745265663D2275736572223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D66616C73657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C73657175656E6365466C6F772069643D227369642D39394343413337462D413233352D343835332D383437322D44453233334144324544333222206E616D653D22E9878DE696B0E794B3E8AFB72220736F757263655265663D227573657222207461726765745265663D227573657231223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D747275657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C73657175656E6365466C6F772069643D227369642D35313046453036322D433042432D343643382D394231372D38413338303732413242433622206E616D653D22E4B88DE5908CE6848F2220736F757263655265663D227369642D42453337324431342D463530392D344544422D383745382D37423231303738333541453522207461726765745265663D2275736572223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D66616C73657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C73756250726F636573732069643D226368696C6422206E616D653D2273756250726F63657373223E0A2020202020203C73746172744576656E742069643D22737374617274223E3C2F73746172744576656E743E0A2020202020203C757365725461736B2069643D22616C6C6D616E6167657222206E616D653D22E680BBE7BB8FE79086E5AEA1E689B9223E0A20202020202020203C657874656E73696F6E456C656D656E74733E0A202020202020202020203C61637469766974693A7461736B4C697374656E6572206576656E743D226372656174652220636C6173733D22636F6D2E6C656E2E6163746C697374656E65722E4163744E6F64654C697374656E6572223E3C2F61637469766974693A7461736B4C697374656E65723E0A20202020202020203C2F657874656E73696F6E456C656D656E74733E0A2020202020203C2F757365725461736B3E0A2020202020203C656E644576656E742069643D2273656E6422206E616D653D22656E64223E3C2F656E644576656E743E0A2020202020203C73657175656E6365466C6F772069643D227369642D46333946364639322D463330412D344630452D423946382D45304444454231313530363522206E616D653D22E5AEA1E6A0B82220736F757263655265663D22616C6C6D616E6167657222207461726765745265663D2273656E64223E0A20202020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D747275657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A2020202020203C2F73657175656E6365466C6F773E0A2020202020203C73657175656E6365466C6F772069643D227369642D33453941414432332D343444412D344138352D383242442D4436433833304134433439382220736F757263655265663D2273737461727422207461726765745265663D22616C6C6D616E61676572223E3C2F73657175656E6365466C6F773E0A202020203C2F73756250726F636573733E0A202020203C73657175656E6365466C6F772069643D227369642D41453541454438342D303734362D343738372D393836462D36413739323743333443333422206E616D653D22E5908CE6848F2220736F757263655265663D227369642D42453337324431342D463530392D344544422D383745382D37423231303738333541453522207461726765745265663D227573657232223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D747275657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C6578636C7573697665476174657761792069643D227369642D39353037343945412D344242362D343237362D423637412D444530334533344130353733223E3C2F6578636C7573697665476174657761793E0A202020203C73657175656E6365466C6F772069643D227369642D30344339463239412D304242352D343639312D383034432D37363445344530413237313622206E616D653D22E58F96E6B688E8AFB7E581872220736F757263655265663D227573657222207461726765745265663D22656E64223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D66616C73657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C73657175656E6365466C6F772069643D227369642D37463032463244352D413642412D343233342D413732342D3346383938443233354134422220736F757263655265663D226368696C6422207461726765745265663D227369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535223E3C2F73657175656E6365466C6F773E0A202020203C73657175656E6365466C6F772069643D227369642D38344442433035362D303639312D343733452D383243462D44333235454637333641373222206E616D653D22E4B88DE5908CE6848F2220736F757263655265663D227369642D39353037343945412D344242362D343237362D423637412D44453033453334413035373322207461726765745265663D227369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D747275657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C73657175656E6365466C6F772069643D227369642D30413541464638362D414541342D343231322D423146342D3932373541343430364332442220736F757263655265663D22757365723122207461726765745265663D227369642D39353037343945412D344242362D343237362D423637412D444530334533344130353733223E3C2F73657175656E6365466C6F773E0A202020203C73657175656E6365466C6F772069643D227369642D30443039333043392D394241312D344636382D383545412D33383445313642343039413022206E616D653D22E5908CE6848F2220736F757263655265663D227369642D39353037343945412D344242362D343237362D423637412D44453033453334413035373322207461726765745265663D226368696C64223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D747275657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A20203C2F70726F636573733E0A20203C62706D6E64693A42504D4E4469616772616D2069643D2242504D4E4469616772616D5F70726F636573735F6C65617665223E0A202020203C62706D6E64693A42504D4E506C616E652062706D6E456C656D656E743D2270726F636573735F6C65617665222069643D2242504D4E506C616E655F70726F636573735F6C65617665223E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227374617274222069643D2242504D4E53686170655F7374617274223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2233302E30222077696474683D2233302E302220783D2233302E302220793D223232382E37303337303339393831383338223E3C2F6F6D6764633A426F756E64733E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227573657231222069643D2242504D4E53686170655F7573657231223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2238302E30222077696474683D2239392E39393939393939393939393939342220783D223132302E302220793D223230332E37303337303339393831383338223E3C2F6F6D6764633A426F756E64733E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227573657232222069643D2242504D4E53686170655F7573657232223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2237392E3939393939393939393939393937222077696474683D2239392E39393939393939393939393938392220783D223531302E30393038383236333634343631372220793D223230332E3730333730333130343131343233223E3C2F6F6D6764633A426F756E64733E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227369642D35353636443037362D414234432D344134322D393938462D323533373738394638313831222069643D2242504D4E53686170655F7369642D35353636443037362D414234432D344134322D393938462D323533373738394638313831223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2234302E30222077696474683D2234302E302220783D223731352E353435343431333138323233312220793D223232332E37303337303339393831383338223E3C2F6F6D6764633A426F756E64733E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535222069643D2242504D4E53686170655F7369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2234302E30222077696474683D2234302E302220783D223337302E353435343431333138323233312220793D223232332E37303337303339393831383338223E3C2F6F6D6764633A426F756E64733E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D2275736572222069643D2242504D4E53686170655F75736572223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2238302E30222077696474683D223130302E30303030303030303030303032332220783D223334302E3534353434313331383232332220793D223336382E37303337303636343732373932223E3C2F6F6D6764633A426F756E64733E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D22656E64222069643D2242504D4E53686170655F656E64223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2232382E30222077696474683D2232382E302220783D223838302E353435343431333138323233322220793D223232392E37303337303339393831383338223E3C2F6F6D6764633A426F756E64733E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D226368696C64222069643D2242504D4E53686170655F6368696C64223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D223136312E3130323038303930333236363036222077696474683D223238342E36303837323832303738373235362220783D223234382E32343130373732313432383638362220793D22302E30223E3C2F6F6D6764633A426F756E64733E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D22737374617274222069643D2242504D4E53686170655F737374617274223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2233302E30222077696474683D2232392E39393939393939393939393939372220783D223236362E373539353935363738323937332220793D2237312E3035313034303435313633333033223E3C2F6F6D6764633A426F756E64733E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D22616C6C6D616E61676572222069643D2242504D4E53686170655F616C6C6D616E61676572223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2238302E30222077696474683D2239392E39393939393939393939393939372220783D223333382E32343130373732313432383638362220793D2234362E3035313034303435313633333033223E3C2F6F6D6764633A426F756E64733E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D2273656E64222069643D2242504D4E53686170655F73656E64223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2232382E30222077696474683D2232372E39393939393939393939393939372220783D223436352E302220793D2237322E3035313034303435313633333033223E3C2F6F6D6764633A426F756E64733E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227369642D39353037343945412D344242362D343237362D423637412D444530334533344130353733222069643D2242504D4E53686170655F7369642D39353037343945412D344242362D343237362D423637412D444530334533344130353733223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2234302E30222077696474683D2234302E302220783D223236342E39393939393939393939393939342220793D223232332E37303337303339393831383338223E3C2F6F6D6764633A426F756E64733E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D30344339463239412D304242352D343639312D383034432D373634453445304132373136222069643D2242504D4E456467655F7369642D30344339463239412D304242352D343639312D383034432D373634453445304132373136223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223339302E35343534343133313832323331342220793D223434382E37303337303636343732373932223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223339302E35343534343133313832323331342220793D223439342E37303337303636343732373932223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223839342E353435343431333138323233322220793D223439342E37303337303636343732373932223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223839342E353435343431333138323233322220793D223235372E37303337303339393831383338223E3C2F6F6D6764693A776179706F696E743E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D38344442433035362D303639312D343733452D383243462D443332354546373336413732222069643D2242504D4E456467655F7369642D38344442433035362D303639312D343733452D383243462D443332354546373336413732223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223330342E353930383639353736373134332220793D223234342E3131323833343432313436393437223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223337302E363430313837323338373936332220793D223234332E373938343439393138373537223E3C2F6F6D6764693A776179706F696E743E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D46333946364639322D463330412D344630452D423946382D453044444542313135303635222069643D2242504D4E456467655F7369642D46333946364639322D463330412D344630452D423946382D453044444542313135303635223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223433382E32343130373732313432383638362220793D2238362E3035313034303435313633333033223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223436352E302220793D2238362E3035313034303435313633333033223E3C2F6F6D6764693A776179706F696E743E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D35313046453036322D433042432D343643382D394231372D384133383037324132424336222069643D2242504D4E456467655F7369642D35313046453036322D433042432D343643382D394231372D384133383037324132424336223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223339302E393837353134343839383930352220793D223236332E32363136333038323635313634223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223339302E36363730323138363333373736372220793D223336382E37303337303636343732373932223E3C2F6F6D6764693A776179706F696E743E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D30443235384332342D314631392D343233332D413937362D413044384342394441454143222069643D2242504D4E456467655F7369642D30443235384332342D314631392D343233332D413937362D413044384342394441454143223E0A20202020202020203C6F6D6764693A776179706F696E7420783D2236302E302220793D223234332E37303337303339393831383338223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223132302E302220793D223234332E37303337303339393831383338223E3C2F6F6D6764693A776179706F696E743E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D33334642463234452D464537302D343730412D394442352D394231383831453133383437222069643D2242504D4E456467655F7369642D33334642463234452D464537302D343730412D394442352D394231383831453133383437223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223631302E3039303838323633363434362220793D223234332E3834353738353439363831313337223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223731352E393838343436343031363631392220793D223234342E3134363730393038313632323632223E3C2F6F6D6764693A776179706F696E743E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D34373638373538312D333535422D343335342D383433432D433330343233333238364146222069643D2242504D4E456467655F7369642D34373638373538312D333535422D343335342D383433432D433330343233333238364146223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223735352E313035353637393030353031362220793D223234342E3134333537373431353930353333223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223838302E3534353531303937373036392220793D223234332E3734373836373831363239343733223E3C2F6F6D6764693A776179706F696E743E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D30443039333043392D394241312D344636382D383545412D333834453136423430394130222069643D2242504D4E456467655F7369642D30443039333043392D394241312D344636382D383545412D333834453136423430394130223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223238342E3637393931353936313034392220793D223232342E3032333738383033373133343735223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223235332E33343530333333323234383436352220793D223136312E3130323038303930333236363036223E3C2F6F6D6764693A776179706F696E743E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D37463032463244352D413642412D343233342D413732342D334638393844323335413442222069643D2242504D4E456467655F7369642D37463032463244352D413642412D343233342D413732342D334638393844323335413442223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223339302E35343534343133313832323331342220793D223136312E3130323038303930333236363036223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223339302E353435343431333138323233312220793D223232332E37303337303339393831383338223E3C2F6F6D6764693A776179706F696E743E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D39394343413337462D413233352D343835332D383437322D444532333341443245443332222069643D2242504D4E456467655F7369642D39394343413337462D413233352D343835332D383437322D444532333341443245443332223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223334302E3534353434313331383232332220793D223430382E37303337303636343732373933223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223136392E39393939393939393939393939372220793D223430382E37303337303636343732373933223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223136392E39393939393939393939393939372220793D223238332E37303337303339393831383338223E3C2F6F6D6764693A776179706F696E743E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D46423539344242452D383030352D344544432D423343382D393738314544323236433935222069643D2242504D4E456467655F7369642D46423539344242452D383030352D344544432D423343382D393738314544323236433935223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223733362E303435343431333138323233312220793D223236332E32303337303339393831383338223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223733362E303435343431333138323233312220793D223430382E37303337303636343732373932223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223434302E35343534343133313832323332352220793D223430382E3730333730363634373237393236223E3C2F6F6D6764693A776179706F696E743E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D41453541454438342D303734362D343738372D393836462D364137393237433334433334222069643D2242504D4E456467655F7369642D41453541454438342D303734362D343738372D393836462D364137393237433334433334223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223431302E31303138303630343037373735352220793D223234342E3134373333393237353632393338223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223531302E30393038383236333634343631372220793D223234332E3835313539323539373636343134223E3C2F6F6D6764693A776179706F696E743E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D30413541464638362D414541342D343231322D423146342D393237354134343036433244222069643D2242504D4E456467655F7369642D30413541464638362D414541342D343231322D423146342D393237354134343036433244223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223231392E39393939393939393939393939342220793D223234332E393230313534323134363334223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223236352E343133303433343738323630382220793D223234342E31313637343734373634343437223E3C2F6F6D6764693A776179706F696E743E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D33453941414432332D343444412D344138352D383242442D443643383330413443343938222069643D2242504D4E456467655F7369642D33453941414432332D343444412D344138352D383242442D443643383330413443343938223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223239362E373539353935363738323937332220793D2238362E3035313034303435313633333033223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223333382E32343130373732313432383638362220793D2238362E3035313034303435313633333033223E3C2F6F6D6764693A776179706F696E743E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A202020203C2F62706D6E64693A42504D4E506C616E653E0A20203C2F62706D6E64693A42504D4E4469616772616D3E0A3C2F646566696E6974696F6E733E, + 0); +INSERT INTO `act_ge_bytearray` +VALUES ('247535', 1, '请假流程.process_leave.png', '247533', + 0x89504E470D0A1A0A0000000D4948445200000396000001F80806000000316A727D00004B3D4944415478DAEDDD09985C559D37E0282232A3830B88382AE038E0363A220CA2A3068619409045A8AEBED59DA4D982B208B20884C1B083AC437001648DC8221F46C8B048164242482420888160420264212121040890B0DEEF9C9ABA6DA5D3DDE9AE7477AABADEF779CE53D55DD5DDC9A97BCFF9FFEE3A6000D0AF5D71C5159BEFBFFFFE0F6FBDF5D6AF872F534DD3B49E6A5B6EB9E55B43860C993176ECD82F196D0100FAA961C3866DBADD76DBBDB6C71E7BA4D3A64D4B57AC589102F48437DF7C33FDCB5FFE92EEB7DF7EE917BEF085D7E3462CA32E00403FB4EFBEFB8E8FA112A037C57019C69BA9465D00807E68F3CD377F31EEA904E84D3366CC483FF5A94FAD34EA0200F44F0E7F05FAE4B0D801FF77DE250000FD315802F405C1120040B004102C0100E8FB60592A24D3C6C646553508968225008060597931F9894F7C62B5EF0F1E3CB83578AEBFFEFAE957BFFAD5F4B1C71E537D836009008060D9B56059FEDADB6FBF9D0E1B362C1DE0D05C102C0100E8BFC1F2FAEBAF4FB7D8628B74BDF5D66BDDD3181D74D041C5E73BEFBC73FAFAEBAFAFF25A564C1E76D861E9E73EF7B9E2F34B2EB9A4DD6079CC31C7B4FE5CF9EFB9E28A2B56F99D8B172F8EF7C36BFDDE11471C517C7FE6A5975E4A9B9B9B5B5F1F356A54EB6BF16777DB6DB7D6D7E2D76BFAFFADE93540B00400102CBB5714AE71AFE46F7FFBDBE2D70F3CF0C02A3F17C3E371C71DB7CAEFF8F8C73FDEFAFA17BEF085F4CF7FFE73BB7FF3F9E79F5FED7BF136293118B6FD770D1D3AB4F8F5B3CF3E5B0C956D436EF6F559679DD5E16BDDF9BF038225008060D945F3E7CF6F3D5C35EEB99B3B776EBBC1320B73E5C1B26DE8ECCA61B2D9EB1FFDE84757FBDEBFFDDBBFB57EDDDEEFDC7AEBADDBFD7D5FFFFAD75B4362DBB0D8D9FFAFB3D700C1120040B0AC40477BFBE25EC933CE38A3F8FCC1071F5C6D6F5F3C6CB5BBC172A38D366A77EF61BCE17A3CECB56D40CC0E837DE185178AAF8F1C39B2DD7F676C1D5D2CA8EDFFAFABAF018225008060D989DD77DFBD35987DEC631F4BAFBBEEBAD6D76288CC5E8BE7509687BDF818DF9B7D6FF6ECD9C5EF975F1576F9F2E5ABFCADF8F580367B16B3F328E3E1AFFBECB34FEBF78F3CF2C8E261B1E57B17070E1CB8DADF8B162D5A94EEB2CB2EADAF4D9C38B14BFFBFCE5E03044B0000C11240B0040040B004044B0000044B40B0040040B004102C0100044B00C1120000C112102C0100102C01C1120000C11240B00400102C01044B0000044B40B0040040B004044B0000044B40B034E4020008960082250000822520580200205802822500008225205802002058020896000008968060090080600908960000089680600900806009205802000896008225000082252058020020580282250000822580600900205802089600000896806009008060090896000008960082250080600920580200205802822500008265ED9A3B776E3A65CA9474DCB871E9983163B43E6C63C78E4D274E9C98CE9A35CB82285802002058D66EA89C346952BA78F1E2F4F5D75FD7D6415BB264493A61C28474E6CC991648C1120000C1B2F6C43D9542657584CBB8C718C1120000C1B2E6C43023D855478B87C6225802002058D69C1866843AC152B0142C0100044B7A3D58BEF2E2C274CEB4ABD3C7C69E566CF179FC9E4028580A960000089682E51A03CFF2650BD2E97F3839FDF3EDC7ADD2E2F7E26B42A1602958020020580A969DB6798FDDB65AA8CCDAFCC7460B8582A560090080602958761E7866DCF3D30E83657C4D28142C054B0000044BC1B2D3367DCC291D06CBF89A5028580A960000089682A56029580A9600000896F45EB08C5781ED2858C6D78442C152B0040040B0142C3B6DB326FFACC360195F130A054BC1120000C152B0ECB42D5DF0683AFDEEE1AB1F061BBE175F130A054BC1120000C152B05C637BEAC191AB05CBF83D8150B0142C0100102C05CB35879E952BD359F7FF72F5C360C3F7E26B42A1602958020020580A961DB6E5CB16A433275FD2E13996F1B5F81EC150B0142C0100102C05CBD5F6522E9C353EFDCB5DC33A0C95598BEF89EFB5F752B0142C0100102C05CB2EEDA5B4F752B0142C0100102CE9345876652F65677B2F8544C152B0040040B0ACF3605969A8CC9A9028580A9600000896CEB1D4044BC1120000C112C152B044B0040040B52B580A9608960000089682A526580A960000D449B09C33674E7AF5D557A7A79D765A7AC41147A443860C491B1B1BD3418306A5871D76587AE69967165F7FE69967044BAD6E82E5ECD9B3D38B2EBA283DF4D043D3E6E6E6344992E27A115B535353FAFDEF7F3F3DF7DC738BEF132C0100A8DB6079F3CD37A7279E78627AE49147A6975D76593A75EAD474C18205E98A152B8AAFC7C7C58B17A70F3DF4507AEDB5D7A6471D75543A7CF8F0E2CF09965A7F0D9637DC70437AD04107AD1224D7D40E3CF0C0F4CA2BAF142C0100A89F60F9C4134FA4C71D775C7AECB1C71643E35B6FBDD5E59F7DE49147D261C38615DB8C1933044BADDF04CBB85E1C7CF0C15D0E93EDB5FDF7DF3F7DF4D147054B0000FA77B01C397264B1781E3D7A74B702655B77DD7557F150C05B6EB945B0D46A3E58C643BD0B85C22A21311EEE7AF6D967A7E3C78F4FE7CE9D9BBEFCF2CBC5F7BEFAEAABC53DFB93274F2E1E2A1B0F192FFFB9B8A7B396F65E0A9600008265B7C41018CF179B3973668FFCBEA79F7EBA784E66AD1E1A2B580A96D16F7FFBDBD5CE9FBCEEBAEB8A878177C5B265CB8AEF8F3F571E307FF18B5F08960000F4AF6079CD35D7144365578BE5AE8ABFAF56C3A5602958C63D95E5A1F2E8A38F2EEE9DAC44FCB978887979B8AC853D978225008060D9E573C70E38E0801EDB53D9DE9ECB430E39A4E6CE2D132CEB3B58C6F5A27C2F63BC305576B86BA5E261B2F12ACAE587C53EFCF0C382250000B51F2CE32D436EBBEDB65E2D4EE33997C71F7FBC60A9D54CB02CBF504FDC53B9B6A1B23C5C96EFB98C17F4112C0100A8E960196F9D106F27F2C61B6FF47A811A83E5F5D75F2F586A551F2CE37A517E4E65A587BF7676586CF9DED06A3E2456B00400102CD7E8F0C30F2FDE52A42FC443614F38E104C152EB956019DFD753E27D2AB3D0172FBCD3DBE1B59AF75A0A9600008265A766CF9E5D3CDC6F6D6E2BD25D471D7554AF9DCBD99DD070F7DD770B96FD28583EFBECB3C5DB7BC410D859C0ECCA671FD78BEC823D71AFE2D2A54B7B65398C578B2DBF15493CA753B00400A0E68265BCC7DECF7FFEF33E2D5263E17FE9A597AED342392BE463C818376E9C6059C3C1325E7578C58A15AD5FAF5CB932BDE9A69BD2471E79A4E2CF3EAE17D9FBCE3DF7DC5E5D16FBF26F09960000F44AB08CB701993A756A9F16A9F1B0DB934E3AA92A8265D6E25EDBF6F6620996D51B2CDF7CF3CD4E6F8DF3D4534FA5BFFAD5AF8A17CAE9EE671F6FBB93BD3E61C2845E5D16E35ED6EC6FC52B270B960000D45CB01C326448BA70E1C23E2D526318887B8BAA295896EFC52A0F1982657506CB78D8EBDB6FBFBDC6CFF99D77DE295E8DF88E3BEEE8D667DFDCDCDCFAFD9EBE684F5B0B162C68FD5B854241B00400A0F682652C64CB0F23EC0BF1EFC5C2BD1A8365F95EAC7898A460595DC172F9F2E5E98B2FBED8EDCFFB85175E48AFBAEAAA6220EDCA675FFE754FDD62A423718F6AF9DF132C0100A8B960B9AE0AD93515F7D5D204CBEA69A3468D4A478C1851BCE04D2517C9893F5BC932D0D7EB8360090040CD05CB75B5C7325E69B31AF758C643837FFBDBDFB65E55B4378365BCF268F9EF8F9FE999679ED9EE7BE3219AF1F5B877EBF6DB6F4F070F1E9CDE7AEBADE9EEBBEF9EB6B4B4F4E8BF2BFE9DF3CF3F7F8DEF39F6D8638BCFE38572E2679A7D3FBB2A6B6FECB18C7D76CC31C7A4F7DF7F7F973FEBB8C7F1473FFA51FAFDEF7FBF78D5D5AE7CF6D91561EDB1142C010004CB2E88B73A5817E7581E78E08155152CDB06CABE3AC7327E8E53A64C29EE518BCFE3855C3A7ADF85175E580C215988CBBE7FE28927B67EBD68D1A274A79D762A86CE18F076D86187E2FF2F7E9D85D1912347A61B6EB861EBCFDC7BEFBDABBCBED9669BA5DFFCE6378BCF63BBE5965BD22DB7DC72B57FCF15575CD1FA3CFECEEC790C9ABD7D8E65BCFFE3E9A79FDEE9DECB787E65FCB7C4C3AEE3FBBBF3D93BC752B00400102CBB215EFD72E2C4897D7E55D8B8D7A91A8265DCDB17434747F73DECAD60397DFAF46260DB64934D8AE16D830D36287EFDF9CF7FBE1820DB1E029AFD3BE2E77EFCF1C7B73EDF679F7D56FBDD317CC6D7E29ECDEC7DF1FCC2F818C3630C9C9FFCE427570989E561307E1D435BF6F5FAEBAFDF1A5EE39556E3BF37BEE75BDFFA563150C6E7714F60F6B38F3EFA68F1F1E28B2FEED5ABC2C650396CD8B0F477BFFBDD6A17F2896170FFFDF74F4F38E184F4F9E79FEFF667EFAAB08225008060D90DF11E7AF1B0C7BE14834DFCBBEB52477B28FB2A58DE79E79DC5C0D6F6FB1B6DB451BAD75E7BB57E9D85B4183A0794ED9D8CCFE3EF8881303EBFE79E7B56DBA3180360F63C06D9F878FDF5D7172F60139FCF9B37AFF87ABC204EBC5051B68732BE76C00107149FC7E01AC3687B7B50CBF7586EBAE9A6AD87EBC6BD9B712F685FDDC7326E18F9F18F7F9CCE9933A7B837F7A73FFD69313476B4C1A42B9FBDFB580A960000826537C473D662A1FDD65B6FF559917AF8E18717F770D582751D2CE35EB9182EE3E1B2DB6CB34D3120C6F7C4AFB3F73CF3CC33C5C23FEED97CE9A5975AC3610C7E975C7249F1F9CD37DFDCE11ECB2C1CC6F7B40DA5F1DF19FF5E7BC132EEB17CF0C1075B0FE7CDBE1FFF665FDCC7B25C7CFD820B2E2886B3F8B8A60D065D592FB2B017CF075EBA7469AF2C5FF1F32D3FECB65AD70BC1120040B05CA378FFBE78385E5F8821E9073FF8415A2B7A3358C6CF305E502686BDECFCC6F8BDA38E3A6AB5C366E36B3134C620173FAB6CEF6276186DB6F730DB03197F4FDC839885BD6C2F65DC63195F9F356BD66A41F11BDFF8C66A7B2CE3F9966DF7A0C68BF6C4F75C7EF9E5ED86D2BE38C7B2B380D993EB4516F86218EF0DF150DCEC6FC44377AB95600900205876A9B88D45745FECB58CA1E4CA2BAFACFB60F9F8E38F175B16C64E3DF5D4E2F318F8E6CF9FBF5AE88B6DD2A449C5433DE339946B0A7103CAF63AC6809905C6189076D96597D50E6FED6AB08C17078A7BF306B439D4B63C586687EFB6FD7FF445B0ECADD017F75AF6F4457CE2EF8BBF37FB1BD5BC5E08960000826597C4ABB45E7BEDB5BD5A9CDE71C71DE9D0A1437B74AF522D06CB786E630C7BF1D0D61FFEF087C53D9159108BA12D1E221B837EDB9F8B812D5EF1B5A38BEE94B70F7DE843C5DF1FCF758CBF3F7B7FDC63D9D11ED4F642693C34330BC09D9D6319FF6DD961B1F1023F3168965FBDB6168365B65E64C1EFE8A38FEEB15B8FC48D03F10256E57B2BAB79BD102C010004CB2E890122DEEA208688DEF0F4D34F172FA8F2F0C30FA7B5A4A783653C576F40E9B62231FCC5F3EBCA5F2FBF6D47F9F993F16AB131B095DFC3327E7FDF7DF76D7D1E4364B63771ABADB62A1EFE1A836876FB9101A5732CB3E7F182406BDADBD9B6C5C368B3436DAFB9E69A55F6A8C620191F870F1FBEDA6D506A3558C6F5A2FC9E96F1FFB6B6E13286CA33CE38A3F577C6DF5FEDEB85600900205876D9D5575FDD2BF7B58CF7AD8C7BE06AE910D8DE3E1436BB8D4816CAE2B996F15613034A7BFF3AFA99AEEC058CC1AF3BEFEF4EB08C2DBB426DF9057BCA2F26D45B6D5D04CB6CBD28BFEF65DC7359E961B1F1E7CAF75456FB21B082250080605991CB2EBBACB8172D5E30A6A7F654C6C309CF3AEBACB416F566B0D46A235866EB4579188CE746C6F355E3555DBB7AF5D778CE66F93995B1D5CA7A21580200089615EDA18987E7C5431DD7E6823EA3478F2EEE018D4579AD122C05CB8EF65C660133DE7B72C28409C5BD91D961B2F170D7050B16140F791E316244F1963EE53F17D7AF5A5A2F044B0000C1B2E273CBE2E1ABF1A222F7DD775FB77E369E2F76C4114714AF2C5A6BE7540A96826557D68BB601B33B2DAE53B5B65E0896000082E55AF9F5AF7F5D2CA4E3E1B1F18223F7DC734FF1EAA5AFBDF65AF1F5780E5FBC05C51FFFF8C7F4E28B2F2E16CD3150C6BD31B574F557C152B0AC64BDE86EA0ACD5F542B00400102C7B44BCDAE805175C901E7AE8A1AB9D2716AF261B2F3C130F098C7B74FA13C152B0B45E08960000822582A56089600900806029586A82A5600900806029586A82A5600900806029586A82A56009008060896029582258020020580A9682258225000082A560A909968225000082A560A9099682250000822582A56089600900205822580A9608960000089682A526580A960000089682A526580A9600000896089682258225008060896029582258020020580A969A602958020020580A969A6029580200205822580A9608960000822582A56089600900806029586A82A5600900806029586A82A5600900806029586A82A560090080604925C68D1B27D4099682A5600900205852B9499326A58B172F16ECD6715BB4685131E4235802002058D69CD9B367A713264C489F7BEE39016F1D87CA9933675A20054B000004CBDA0D97E3C78F2F1E8AA9F57D132A054B0000044B40B0040040B004044B0000044B00C1120000C112102C0100102C01C1120000C112102C0100102C01044B0000044B40B0040040B004044B0000044B40B0040040B004102C0100044B00C1120000C112102C0100102C01C1120000C11240B00400102C01044B0000044B40B0040040B004044B0000044B40B0142C0100044B00C1120000C112102C0100102C01C1120000C112102C0100102C01044B0000044B40B0040040B004044B0000044B40B0040040B004102C0100044B00C1120000C112102C01005807C172C58A152A5EA057BDF9E69B822500407FB5E9A69B2E9A366D9AAA17E8553366CC4837D9649365465D00807EE8C31FFEF0B93BEFBCF32BCA5EA037EDB9E79EAF7DF4A31FFD99511700A07F7AFFFAEBAFFFF0F6DB6F3FFF81071E783D1EAE46EF58B972A54EA0EE0E7F9D3163C65B3BEEB8E3820D36D860761C6F0CB90000FD385C8676CABBDEF5AE2706FCDF39505A0FB6F7BFFFFDE90E3BEC10F7D8A4EBADB75EBFF97F353636FA7CB535B677BFFBDD31509E27540200400572B9DCFB9324393B04B015F97CFED5D08EEE4FFFBF52B0040000A0378410B947085E4FC5F0155BF8FAE5534E39E5DD82250000009D2A140AFF1A02D7A42C509605CBD1FDEDFF2A58020000F4A02449360E41EB9278D86BDB50596AA70B960000007414B006E6F3F9651D04CA6C8FE5E182250000001D4A92E4A010B41676142C1B1A1A76162C010000E8542E97FB58085B7776B0C7F28B82250000005D0D5CC3437BAB3C58C6D02958020000B046F1DE9521703DDDD0D0B06F78FC7529582EE9A7015AB0040000E885B015AF0C7B65D9D7FBC5C363054B000000D6A8A1A1E11B216CCD6F6969F960F9F7070E1CF81EC1120000804EEDB6DB6E1B84A03523B47DEAE5FF2C58020000F46CC83A33B49BEBECFF2C58020000F4847C3EFFE510B29E4B926453C1120000806EC9E572EB8580F560682DF5F67F172C0100007A4092243F0E01EB0FF5F87F172C010000D652A150F8E7788FCAD0B6102C010000E8AE772549726F08573FACD70E102C010000D62E547D3FB4FB4F39E594770B96000000744B5353D32742A85A9CCFE73F57E7E15AB0040000A830508D0EED64FD2058020000745B128440F5E7A14387AE2F580A96000000DD0D951B8730B530B46DF58660090000504990FA4D68E7E909C1120000A09210B57B68B372B9DC867A43B0040000E896A6A6A67F08216A6E6803F58660090000504980FA656897E909C1120000A0DB1A1A1ABE1502D4BC5C2EB791DE102C010000BAA5A5A5E57D213CCD0C6D4FBD215802000054129CCE09ED463D2158020000745B3E9FDF2604A745B95C6E13BD215802000074CBC08103DF1382E5C3499234EB0DC1120000A092C0342CB43BF48460090000D06DB95C6EEB10989684C74FE90DC1120000A0BBDE15C2D27DA11DA62B044B0000804A82D261A14D8A01536F0896000000DD120F7D2D1D02BBB5DE102C0100002A094977264972A29E102C0100002A094883E2ED45E26D46F48660090000D02D83060DFA6808488B42FB8ADE102C0100002A094737254972B69E102C0100580B699ABE67CE9C39374F9D3AF5ED71E3C6A563C68CD1FAB08D1D3B369D3871E2F3A1355B1AFB563E9FDF2B84A3BFB6B4B4BC4F6F08969817CC0B00B01662F13069D2A474F1E2C5E9EBAFBFAEAD83B664C992F4DE7BEF7D291413FB5922FB462E97DB2804A379A17D536F08969817CC0B00B096E21669C543551411AF8F1933668625B2CF42D1E5A1FD424F08969817CC0B00D003E2614E26F0EA68A18078D312D9FB1A1A1A760CA1E8993DF7DCF3037A43B0C4BC605E00801E10CFE73079574D01A150EF65B95C6EC310889E2C140ADFD11B8225E605F30200F47101F1CA8B0BD339D3AE4E1F1B7B5AB1C5E7F17B267E05442DC9E7F3E72749729D9E102C312F981700A08F0B88E5CB16A4D3FF7072FAE7DB8F5BA5C5EFC5D74CFE0A881A0995DB8530B43004CB8DF586608979C1BC00007D5C40CC7BECB6D58A87ACCD7F6CB4C95F0151F5860E1DBA7E08968F86D6A837044BCC0BE60500580705C48C7B7EDA6101115F33F92B206A20049D1CDA683D2158625E302F00C03A2A20A68F39A5C30222BE66F2574054B35C2EF7F910821687C77FD41B8225E605F302002820141074CB29A79CF2EE1080A624497288DE102C312F981700601D1610F16A7F1D1510F13593BF02A25AE5F3F92343009A109EBE4B6FAC55881C1D83E41ADA343D655E302F981700504074D8664DFE598705447CCDE4AF80A8D230B445684B72B9DC67F4C65AF7E5B6A1BDD959B00C217E0F3D655E302F981700504074D8962E78349D7EF7F0D50F770ADF8BAF99FC1510551A86EE0E61E7383DD163FD796727C172CAC08103DFA397CC0BE605F302000A884EDB530F8E5CAD8088DF33F12B20AA510894FB87B0F3602E975B4F6FF458B0DCB6A3609924C9DE7AC8BC605E302F00A080E8BCAD5C99CEBAFF97AB1FEE14BE175F33F92B20AA4908931F0B61E7B9102EBFAC377A3C5CB677AEE5347B2BCD0BE605F302000A884E27B5E5CB16A433275FD2E1B934F1B5F81E058002A25A8440F9FF922439434FF44AB05CED5C4BE7569A17CC0BE60500E8B88058B9325D386B7CFA97BB8675583C642DBE27BED7566A05441584CAEF85B03363B7DD76DB406FF45A1F8FB2B7D2BC605E302F00C01A0B88356D8DB6955A01518D0A85C28742D05910DAD7F546AF06CBAF959D5BB9AB1E312F9817CC0B00D06E01D195ADD19D6DA5560C2820D6C2072BFDC11072AE0AA167842EEC7D0D0D0D77C560696FA579C1BC605EA0BAE64280AA2A202A2D1EB2A61850405428EEFD4A4B8FDD0D3A3B87A0F3542E977BBFB5BAF73FA70F7FF8C3C53D96BAC2BC605E302F503D732140D515109A02621DD839B465A15D547AECF20561060D1AF4F721E4CC29140ABB58A3FBEE732A054B17EE312F68E605AA602E045040680A88BF4DA4D9041AB7D22EE9EA849ACFE72F4A92E45A6B73757F4E981734F302C6584001A12920FA6A225DD3F7DB86CA7821996773B9DC87ADCDD5FB39615ED0CC0B1863010584A680E82DBBAE61C2CC5E6FF73C931026DF9B24C963215CE6ACC9D5FB39615ED0CC0B1863A1263435357D221496870F1932E4B6E6E6E6A70B85C26BA54BE1AF0CCFE796EEB9766C7C9FDE52402820AA6E225DD344D9E1D6DA102A4F8DEBB7B5B8BA3F27CC0B9A7901632CD59BA1424EBA39B459A12D2F65A815F182887595A14251B9F7D0A143A71D72C8212F8E1831E285A953A7A60B162C4857AC589146F171F1E2C5E9942953E65D70C1057F09C1737EE89C7BC2CF355B9414100A88756AE76E6E7D5DEDFD6190FB97B03E2F6E6E6EDECC5A5CBD9F13E605CDBC803196EACB50A18D2905C8B48BAD7F66A8F01FDB2284C93F1E79E491AF3CF4D043E95B6FBD9576550899330E3CF0C099E1774CCAE5729FB16829201410EB6C22DDA3829F5B1E27D4B0EEAE17D6E107423BD01A5CBD9F932E342F68E6058CB15457860AEDCE6E84C9F65AFFC9502D2D2D830E38E080D76EBBEDB6B7BB1328DBFACD6F7EF34048DD8BECBD544028206A62225DE5E777DC71C72BC3C036CE1451DD9FD300876C991734F302C658AA423E9F0FA553E392F290D8D4D4949E7DF6D9E9F8F1E3D3B973E7A62FBFFC723127BDFAEAABC5A340274F9E9C5E74D145E9A04183DA86CBE5359FA1860D1BD6F2831FFCE0F5993367A63DE1C9279F7CAAB9B9797EE898831410266F0544AF5BD3C509BAE4EFFEEEEFF60ADEDE7CF3CD0F324D54EFE7D483BF07F382790163AC3196B50B957B8430F86679A0BCEEBAEB8AA70C76C5B265CB8AEF8F3F571E306B36431D73CC3187066F74B503BA6AD1A2450B4BE1B26EF75C2A2014107D3891F6C8A13B215CEE6E42ADFECF6980ADEAE605CDBC803196751D2A1BCB43E5D1471F5DDC3B5989F873C71D775CDB70595B196AE8D0A1FF74F0C107BFD1537B2ADBDB73593A2CF6B30A084D01D1E3DA5E6CE05DA10D293D7647DB9F7311039F13E605F302C658632C1D289D53D97AF8EBF0E1C35B0F77AD543C4CF6CC33CF6C7B586CED64A8638E3966CEE8D1A3D3DE74F5D5578F8D27A32A20340544AF4CA47B944D88578696961EBB3AA176F47326549F13E605F302C658632CED285DF9B5754FE5DA86CAF270D966CF656D64A8534F3DF507C71E7BEC3B6FBCF146DADB060F1E3CA31E0F8955402820FA68221D50DACA9A96B5AE4CA8E51369D60697BDEE3C139F13E605F302C658632CAB86CABDCBCFA9ACF4F0D7CE0E8B2D3FE7B22632D409279CF06CBCA5485FB8EFBEFBEEADC7BD960A0805442FE868826B6F62EC6C426DEFFD57B4F37EE799F89C302F981730C61A63F95BB06CDD5B192FBCD31B6EB8E186DAD96B79E38D376E77F8E187BFB336B715E9AEE6E6E6A7E3F1C80A084D01B1D613E9AEDD9820DB9B50BB3A91B69D501D0AE473C2BC605EC0184BDD6A6A6AFA4476C19EB85771E9D2A5BD929BE2D562DBDC8AA47A33D425975C72E315575C91F6A533CE38239E6B796C7FD95211DABF2B201410BDBD0C5530A1AD6942EDEE445AFEF797D4DBD65A9F13E605F302C65863AC653293CFE70FCFC2DEB9E79EDBABD929DEE7B22C58566F863AF5D453E74E9D3AB54F83E5F8F1E3EF0B9D32BA3F2C7465C73C8F090BD8D714100A88DE5A86DA4CA45D9DC83A9A50DF5DE144DA762B71DD4CA83E27CC0BE6058CB1C658CB64D9EB3767EF99306142AF66A7C993279707CBEACD50471C71C4EB0B172EECD36019FE5E3C14765E7F5AE8CADA9DED6DDD50402820D676191A50F9791DED4DA87F5D8B89746DFF3DFD7A5DF739615E302F608CA5FF2F93E1EB59D96B3D7DD19EB6162C5850FEEFA8DE0C3564C8907756AC58D1A7C1F2B5D75E7B3E74CA8A7EBAD0B56EDD285FF814100A88B55C86D676AB687B13EADA4CA46D27D45DEB7082F139615E302F608C35C6D6E93219EF2D997DAFA76E31D2D9AD47CAFE0D2BAABAD3D685F877FBF34257BE7523EE3E574028202A5D86F6DE7BEFB1A549EFA2B5FC53EF6E67EBEC5F4BDF5F1B17957ED707EB7182C95A2E971BFB918F7CC4E7444DCC0B715928140A5D7EFFADB7DE9A6EB5D556DDFAFDE79F7FFE1ADF73ECB1C7169FDF74D34D69DCC89D7D3F5E5D51B0B4DE980BA9F2B1BCB5F55576CA5AD5765A4B4B4BDAD77B2CC3DF7BB33B1F567F687D5D40DC7DF7DDC5C1326EE1B8FDF6DBE3FD438B85C1EEBBEF9EC6CFBCA70B945A2B206A6DF9F9F6B7BF9DBEF7BDEF4DD7626B68675B69BB73E3E80EB7D2D6DB3ADD59F339695D6DEB3258EEB4D34EEDBE16C7E7EDB7DFBED8B2B963B3CD362BB6F83CB6ABAEBAAAF83BE6CF9F5FFC997BEFBDB7F8FDF2F77FF39BDF6C7DFF2DB7DC926EB9E596ABFD1BE2C503B3E723478E6C7D1EE709F382662ED46AA5D9635972C41147BCD1D7E7582E5AB468613F3EC7326BD3F2F9FC1E03070E7C4F7C5F5F07CB38485E78E185C505310B71D9F74F3CF1C4D6AFC367512C2EE2C41F03DE0E3BEC50FCF797170871B2DF70C30D5B7FA63F1410B5B80C9526AEE5037AE7BC924A26D47A3FC7D2E7444DCD0B6DC7E44D36D9A4C3D7E3DC316BD6AC74975D76592D58DE7CF3CDE9673FFBD9D57E5FF9581EBF3EFDF4D35BBF5E7FFDF55BE79EA79E7AAAF87BE27BBEF5AD6F15E783F8FC89279E68FDD9471F7DB4F878F1C517DB6369BD31C65295CB64787CD239966D9C75D6594BFBFAAAB093274F9ED9DFAE0ADBC90038A0AF0B8851A346B5EE218D03E5F1C71FDFFA7C9F7DF669B78088AFC53D9BD9FBB2ADD1313CC6C0F9C94F7E5201B18E97A1B65B45D76222BD6240FB57C2EBCE845AB75785F539518BF342DB3D927159DA60830D3A7D5F0C901FF8C007560B961B6FBCF16A73C9F2E5CBD371E3C6B56E608CBFFF80030E283E8FEF8D73497BE1B67C83E3A69B6EDA7AB44DDC381937623A14D67A638CA55A974957856D4718D4EFE8EBFB589E77DE7953FBCB7D2CCB3EE4294992ECDDC100D867054416D2E25EC301657B27E3F33BEFBCB31808E3F37BEEB967B5093E1600D9F3E9D3A7171FAFBFFEFAF4D9679F2D3E9F376F9E02621D2E43156C1D5DD3BDB9BA7AE3E8B6B61D5087F7EEF23951ABF342DB3665CA94E272F4A10F7D6895235ADAB6B84131B6B6C1F24B5FFA52BB1B29E3EF8C61B4ED9C12E79E8D36DAA8DDF7C70D8E0F3EF860F179FC7765DFBFE4924B9C6369BD31C652D5CBA4FB58B6E38F7FFC63EE88238E48DF7AEBAD3E0B962D2D2D0B42A76CD14F16BACEB6A8F57901B16CD9B262B88C13F436DB6C530C887142CF26ECD89E79E699E2C019F76CBEF4D24BADE13006BF389967C5C1800EF6582A20D6CD32D4CDADA45DBDE1737727D4EC10A4BDEB7082F1395193F34247E757C60D8CF1796787C366CF63988C2DBB904FFCB9B6A1347EEF1BDFF8C66A1B1C6320DD6BAFBD56D9001ACFB98FEFB9FCF2CBDB9D53EAFD1409EB8D3196EA5F269B9A9A3E11DE53BC6E4C789E2E5DBAB4577253ACED070D1A541E2CAB3B439D7AEAA9AF3DF4D0437D122A1F7EF8E1A5A143EEABB785B32F0B881826E3641E43630C7271F779B67731B678F853B6F730DB031907D1B807319BD4B3BD94718F657C3D9E6BA380A83A1D6DADEDEA44DADD0935FB7B26529F1335362FB43D0C369EEE908DC1E79C73CE2AEF89A730ECB6DB6EC5D6DEC57B4E3EF9E4F4A8A38E6A3DBAA5BBF3423CB77FF6ECD9AB1D29533E2F6447DF641707322F608CA51AC55B8F64812FEE88E90D37DC704379A89C54F59D72F5D5579F7BDC71C7F5C95ECB430E39E4A9F021342B207A776B746C93264D2A1611D956E7CE425CF9041F03665618C495245EBCA1EDE1AD0A88AA11B7D6B63D1467C880EEDF9BABBD09757037B60AE373A20682E580D29128D9D78F3CF2C82A1754CBC2676CE557145FD33996D9112BEDCD29F19CFAC71F7F7C8DA748C4B9203BAA2586DB384F7476A8AE7901632C55102CF7CE425FDC6BD9D317F189BF2FFEDEB27B68D646863AE9A4935E1E3D7A74AF86CADFFFFEF7CFC6BD95DD3CCC4101B116E75B965F4EBEB36019CFB58987CEC6731DE39ECEECFD718F657BEF574054DD845A7E1183F289B13B377CEEE8E7DCF8D9E7443F981706747001B7B80131BE16E6E6550E7FCD0266769BA86C8360DC4BD9DE38DFD1C6CAB62D1E05931D2973CD35D7ACB24134DBA33A7CF8F0D5AE626E5EC0184B350AD9E69E2CF81D7DF4D13D76EB91381EC71D7FE57B2B6B26438D1A35EA3F0E39E4907766CE9CD92BA1F2E9A79F7EABB9B9F9F990B43FAB80E8BD969D3FF9F9CF7FBE18D8CAB738C7EFEFBBEFBEADCF6388CCF626C61B5FC7C35F6310CD6E3F926DD9CE9EC70B022920AA56DB4381DE55DACADADDCBA6B7FDB95D4DA43E276A7B5E88175E8B174C8BE7D577F49EB8B1308EC36DFF4D7143637635EF78718AEE84D88EE685D8B20BCC959F6F5F7E2D80BE6E82A531D618CB5A04CB2D425B9205C058D7AE6DB88CA1F2CC33CF2C0F95CB6B2E4385C2FF8A78219FC58B17F768A88CBFEF80030E585A8F87C0AEAB2DD3E55B9CD7F49E18FCBAF37E0544CD4CA83DB1F5D715EF7C4EF4B37941132C8DB1C6587A563E9F6FCC2EE493EDB9ACF4B0D8F8736DF654A6359BA1468E1C794B0C973DB5E7F2E9A79F4E0F3AE8A01743879FA08030792B206A664275C3679F13E605F302C658632C5D1402604B79B88CE746C6530DE2555DBB7AF5D778A19EF2732A63ABF90CF5AB5FFDEA67210CBE13CFB95C9B0BFADC71C71D2B870C19F262EC680584024201D167D6F6901D87FCF89C302F981730C61A63E9A6B8E732B465E5C13006C5782AC18409138A7B23B3C364E3E1AE0B162C28DEBD61C48811F1768CAB04CA78F86BBFC950975F7EF976279D74D2F371576CBC6A5C77C40BB3849F7B71F0E0C1D3EAF59C4A058402A24A26D4EE6E657571029F13E605F302C658632C158AE75C96DF86A4C236A95F66A80B2FBCF0BF8317E2E1B1F1AA9ED3A64D4B172E5C583C172F8A8FF11CCA183EE3EEDEC30E3B6CC5C1071F3C3D26EC7ABCFAAB0242015145BA7B088F437E7C4E9817CC0B18638DB1F44CC0DCAF1430DFEC4EA0AC8B0C75EDB5D77EE5BCF3CEBBF6E4934F9E3574E8D0E5CDCDCD6F9776EFBE75E081072E0FC1F3A1D0CE8C29DDA2A4805040D4DC84BA6D68CB07B8E1B3CF09F382790163AC31961E13B2D22742C03C2A64A49B437B2AB4156541725E68A3433B56864201A180A805BB9626CA5D3B797D8989D4E78479C1BC8031D6184BEF2B85C9D4D19D28201410B5A8A3ADB50EF9F139615E302F0896C658632C7D249FCF7F2D3B3C364912E7F1A2805040F48B09D544EA73C2BCA00996C658632C7D1B2C47951D0A3B4D8FA0805040D4FA847A9189D4E7847941332F18638DB1F49D1024B76D7B319F10342D7F28201410352B1E76910E7019759F13E605CDBC608C35C6D297C172743B57829DE65C4B14100A885AF6415D501B9F539C7474837941332F608CA5E643E5B61DDD7A244912178D4201A180805E9F882CAFE605CDBC803196DA5FD6EEECE4FE9553F4100A080504287A302F981730C64267CB59877B2B9D6B89024201018A1ECC0BE6058CB1D095E56C7467A1D215625140282040D18379C1BC803116BA65D0A0417F1F96BD57F4040A080504287A302F981730C6424572B9DCFBC3B2B75C4FA080504080A207F3827901632C5464CF3DF7FC4092242FEB0914100A0850F4605E302F608C858A343535FD4358F65ED21328201410A0E8C1BC605EC0180B15C9E5721B8565EF453D81024201018A1ECC0BE6058CB150919696960FE6F3F9657A0205840202143D9817CC0B1863A1228542E14361D97B414FA080504080A207F3827901632C542497CB7D382C7B4BF5040A080504287A302F981730C64245060F1EFC91B0EC3DAF275040282040D18379C1BC8031162A9224C9C661D95BA2275040282040D18379C1BC8031162A92CBE53609CBDE623D81024201018A1ED6DAB871E38CC9D5D1568479E14D4BA43116FA4A92249B86656F919E4001A18000450F6B6DE2C4890B172F5E6C5C5EC76DC18205378679618625D2180B7D2597CB7D2C2C7B0BF5040A080504287A586BE3C78FDF6BC284092F3EF7DC73AF199FD7CD86C638278C1D3BF699D0F6B3441A63A1AF3437376F1696BD67F5040A080504287AE811613CDA63CC9831D3E29114F1307DAD4F5BECF319E60463AC5E601D2C771F0F6D819E4001A18000450F8031162A92CBE5FE312C7BF3F50475ABA1A161670330287A008CB150B9A6A6A64F84656F9E9EA09E07DF49A1BDA32740D103608C858A97BB4F8636574F50AF2BC0C038F8C69624C9BFEB1150F4001863A1FB72B9DCA7C2B2F78C9EA05E07DE7BCA82E5183D028A1E00632C745FA150D83C2C7B4FEB09EA4E0892BB66A1D25E4B50F400186361AD96BB2D427B4A4F508F0BFFA4B6C132B4D17A06143D00C658E89E5C2EB76558F6E6E809EA6DC0DDAF9D50596C8542E15FF510287A008CB1D075A186FE7458F666EB09EA6DC0FD4B47C13249921BF410287A008CB1D075B95CEE3361D99BA527A81B2138EEDD51A8CC5A3E9FFFA29E02450F803116BAA65028FC7358F666EA09EA46088D0FAF29588676B39E02450F803116BA5C636F1596BDBFEA09EA5692241B879560899E00450F8031162A93CBE5B60E75F5137A82BA3568D0A08F8601F8393D018A1E00632C542684CACF86656F869EA06E3537376F16568267F504287A008CB150997C3EFFB9B0EC3DAE27A85BB95CEE1FC34A305F4F80A207C0180B15D7D49F4F92E4313D413D0FBE9F0C6DAE9E00450F8031162A1342E517C2B2375D4F50B70A85C2E66125785A4F80A207C0180B9589B7EB8BF78AD713D4AD5C2EB7655809E6E80950F4001863A1324D4D4DFF12C2E5A37A82BA1556807F0A03F0937A02143D00C658A84C92245F0ACBDE9FF50475AB5028FC73580966EA0950F4001863A132F97CFECB61D97B444F50B7DCCC15143D00C65858EBE5EE2BA1FD494F50B7DC7307143D00C65858EB9A7A9BB0EC3DA427A85B2E8D0C8A1E00632CAC9D42A1F0D5B0EC3DA827A85BAE60058A1E00632CACF572B76D68D3F40475CB89C6A0E80130C6C25AD7D4DB8565EF013D413D0FBE4E3406450F803116D642A150F8B7B0ECFD514F50CF2B81E3C141D103608C85B55BEEB60F6DAA9EA06ED96D0F8A1E00632CAC754DFDB5B0EC4DD113D4FB4A60EB0A287A008CB150A124497608CBDEFD7A827A1E7CBF1EDA643D018A1E00632CA8A9A1224992FC7B580926E90950F4001863A1320D0D0DDF08CBDE7D7A827A5E09BE15C2E5BD7A02143D00C658A878B9FB666813F504F5BC120C0CED1E3D018A1E00632C54C6CE1AEA5E5801760A03F0383D018A1E00632C545C537F3B2C7B13F40475ABA1A161E7B0228CD113A0E80130C642C5CB9DA300A96FF97CFEBFC24AF0073D018A1E00632C54A6A1A161C72449C6EB09EA565801760D03F09D7A02143D00C658A8B8A6767A19F5AD50287C279FCFDFAE2740D103608C858A97BBFF086DAC9EA06E8550B947580946EB0950F4001863A132AE5B82C1B7B171CFD06ED513A0E80130C6426542A8FCCFB0ECDDAD27A8E79560EF7C3E3F4A4F80A207C0180B9571414CAC04F9FCF7C24A708B9E00450F8031162A532814760975F55D7A827A1E7CF70BED663D018A1E00632C54C69D16B01224494358096ED213A0E80130C64265DC6901C1320803F0F57A02143D00C658A878B9DB3DB4FFD513D4AD7C3EDF14B2E5757A02143D00C658A8B8A6760B3FEA7EF01D14DA483D018A1E00632C54264992EF8670799B9EA09E5782216100BE464F80A207C0180B152F77EE0D4F7DCBE7F3FB877079959E00450F8031162AAEA9F70ACBDEEFF504F53CF81E18DA157A02143D00C658A84C92247B8770394A4F50CF83EFC1A15DAE2740D103608C858A97BB7D42FB9D9EA06E254972483E9FBF544F80A207C0180B9509F5F4F7C2B2778B9EA09E57821F8495E0177A02143D00C658A84C9224FB86BAFAFFE909EA79F03D2CB49FE90950F4001863A1E2E56EBFD06ED613D4AD24498EC8E7F323F404287A008CB15099504FE7425DFD5B3D413DAF04478695E07FF404287A008CB150F172970FED463D413DAF043F0AED423D018A1E00632C54269FCF37264972839EA06E8515E098B0229CAF2740D103608C858A6BEA242C7BD7EB09EA560895C785F5E05C3D018A1E00632C54BCDC1542FB8D9EA09E83E509612538474F80A207C0180B15D7D44D49925CA727A8E7C177586867EA0950F4001863A1322154368765EFD77A827A1E7CFF3BB4D3F504287A008CB150F1723728B4917A82BA95CFE77F9224C9A97A02143D00C658A8B8A61E1C6AEA6BF504F53CF89E12DA703D018A1E00632C542684CA2161D9BB464F50CF83EF69A19DAC2740D103608C858A97BB96D0AED613D4AD2449CEC8E7F327E90950F4001863A132A19EDE3FD4D557E909EA79F03D2BAC0427EA0950F4001863A1E2E5EE80D0AED413D4F34A704E68C7EB0950F4001863A13249921C94CFE77FA527A8E795E0DCB0121CA72740D103608C858A97BB8343BB5C4F50B742A83C3F84CB63F404287A008CB150F1723734B4CBF404F5BC125C18DA8FF404287A008CB1509924490EC9E7F397EA09EA7925F89FB0121CA92740D103608C858A97BBEF87F64B3D41DD0AA17244089747E80950F4001863A1E29AFA0761D9FB859EA09E07DF9F8576989E00450F8031162A9324C9A1215CFE5C4F50CF83EF2FE216163D018A1E00632C54BCDC1D1677D8E809EA7925B82C5EC54A4F80A207C0180B95C9E7F3878765EF123D413DAF04BF8A3774D513D06B05CEE858E4ACA14DD353008225B52B5EB3245EBB444F50CF83EF95A11DA027A0D7D6B16D437BB3B3601926A23DF4148060494D2F773F0CED623D413DAF045787D6A227A057D7B33B3B099653060E1CF81EBD04205852BBE2EDFBE26DFCF404752BAC00D7861561B09E805E2D72B6ED28588675706F3D04205852F3CBDD8F42BB504F50CF2BC1AF4361DBAC27A0D7D7B5F6CEB59C666F25806049EDCBE7F347879AFA023D413D0FBEBF09ADA027A0D7D7B5D5CEB5746E25806049FF1042E531615E3F5F4F50CF2BC10D612568D413D0FBC2BA36CADE4A00C1927EB9DC1D1BDA797A827A5E096E0AE1B2414F409F04CBAF959D5BB9AB1E01102CE93773FC71616E3F574F50CF83EFCDA1EDA727A0CFD6B9E2B996F656020896F41F2154FE3884CB9FEA09EA79F0BD25AC04DFD31354BB344DDF3367CE9C9BA74E9DFAF6B871E3D23163C6687DDCC68E1D9B4E9C38F1F9D05CF00B102C61D5E5EEF8D0CED113D4AD78CE97DB1D500B62A89C346952BA78F1E2F4F5D75FD7D6515BB264497AEFBDF7BE1442A6231D00C112FE56539F106AEAB3F504F53CF8DE1ADA9E7A826A17F7540A9555132E5F1F3366CC0C4B252058C2FF09A1F2C4B0EC9DA527A8E7C177B45B1E500BE2E1AF425DF5B4102CDFB454028225B42E77C3423B534F50B742A8BCBD50287C474F50EDE2397E025D55054B851B2058C2DF6AEA93922439434F50CF2BC15D6E7B407F0A96AFBCB8309D33EDEAF4B1B1A7155B7C1EBF270C0A96806009BDB8DC9D1CDA697A827A5E09EE0EC1F23FF504FD21582E5FB6209DFE8793D33FDF7EDC2A2D7E2FBE26100A96806009BD219FCFFF24D4D4A7EA09EA79F01D1BDA7FE809FA43B09CF7D86DAB85CAACCD7F6CB4402858028225F4D672373CB453F404752B4992F10D0D0D3BEA09FA43B09C71CF4F3B0C96F1358150B004044BE8A5E5EE94182EF504F5BC124C08E1F2DB7A82FE102CA78F39A5C360195F1308054B40B084DE100F838D87C3EA09EA79F09D18DA37F50482A5265802822554BCDC9D162FE0A327A8E795E0BE8686866FE809FA43B08C5781ED2858C6D70442C112102CA19796BBD343FB6F3D413DAF04F72749B2839EA03F04CB59937FD661B08CAF098482252058426F88F7B08CF7B2D413D4F3E03B35B4EDF504FD21582E5DF0683AFDEEE1AB1F061BBE175F1308054B40B0845E5AEECE0C6D989EA09E578207F2F9FC767A82FE102C637BEAC191AB05CBF83D6150B004044BE8C5E5EEAC24494ED413D4F34AF060A150F8AA9EA05F04CB952BD359F7FF72F5C360C3F7E26B02A160090896D01B42A83C3B9FCF9FA027A8E7C1F74FA17D454F50EBC172F9B205E9CCC99774788E657C2DBE4728142C01C1127A61B93B27B4E3F504F5BC123C92CFE7BFAC27A8D960B97265BA70D6F8F42F770DEB3054662DBE27BED7DE4BC112102CA1272549726EA8A98FD313D4ADB0023CDAD4D4F42F7A825A0C966BDA4B69EFA560090896D047CBDD79A11DAB27A8E795607A92245FD013D462B0ECCA5ECACEF65E0A8882252058424FC8E7F3E7879AFA183D413D0FBE8F8715E1737A825A0C969586CAAC098882252058424F08A1F28250531FAD27A8E7C1F7AF6125D84A4F508BC152132C01044BAA64B9BB30B41FE909EA79259895CBE53EA327102C35C112102CA132F97CFEA224498ED213D4F3E03BBB50287C5A4F20586A82252058426542A8FC9F102E8FD413D4F3E0FB54685BE809044B4DB004044BA878B9BB38B41FEA09EA7925782697CB7D4A4F20586A822520584265F2F9FC8824498ED013D4F3E03BAFA9A9E9137A02C152132C01C1122A5EEE2E09E1F2703D413DAF040B42FBB89E40B0D4044B40B0848A97BB9F8576989EA09E578285B95CEE637A02C152132C01C1122A93CFE77F9E24C9A17A827A1E7C9F1B3468D047F50482A5265802822554BCDCFD32B4EFEB09EA7925589224C9C67A02C152132C01C1122A93CFE72F0D35F5217A827A1E7C97E672B90FEB09044B4DB004044BA878B9BB2CB4A17A827ADEBAB2ACA5A5E5837A02C152132C01C1122A5EEE2E0FED603D413DAF042F353535FD839E40B0D4044B40B084CAE4F3F95F254972909EA09E07DFE5B95CEEFD7A826A3070E0C0F7089682258060490D2E77578476A09EA09E578257BFFBDDEFFE9D9E605D4B92A4391603A1ED27580A9600822535B6DC5D19DA017A827A5E0956B6B4B4BC4F4FB0AEE472B9CF1C7BECB1F73DF9E4938B9E7FFEF9B1871F7EF88361B9BCA4ED722958D65EB00C9FE3B6F97C7E94A51C102CE9EF9224B92ACC79FBEB09EA79F07D63E8D0A1EBEB09FA5A3CEC75D0A0413FB9E5965B9E7FEBADB756A47FB3ECF6DB6FBFBBB9B9796A0C9D8265ED05CB1828431B1DDA9B0A3C40B0A44E96BBAB436BD113D4F34AF05628DED7D313F4A52449FEFDA73FFDE99C175E78E1F9B4032FBFFCF213279C70C282ECD058C1B2FA8365DB4099354B3C20585207CBDD35A1BE19A227A8E795E09DF0F02E3D415F88B7B639EAA8A3AEFBD39FFED461A06CE3CDBBEFBE7BC1C1071F7CE95D77DD25D05569B0CCE7F35F8B87BCB60D9482252058522F42A8BC36CC8583F504753DF8C67019DADBA5A2F08D78DE65682BE2857D427B25AC282FC7DB92C47B5E86C717427B3EB425A13D17DAA2D09E0D2DEE599A17DADCD09E09EDA9D0E684F66468B342FB6BF83D4F84C7C7C3E363E1F12FE1F73D1A1E1F098F0F87C787428BE7D63D10DA1F439B12DAFDA1DD17DAA4F033F786C709E1717C781C171EC784C7BBC3CFDE151EEF0C8FB787C7FF0D8FB785C75B4B45EEEFC2E3FF0B8F37877653683786767D68BF09EDD7A18D8C83403C74211E171FAFE6152F151D6F701B1E2F0D8FBF088F3F8FE7FB85C711E13DFF131E2F0A8F1784C7F3C3E3B9E1F1A7E1F1ECF09EB3C2E319E1F1F4F0786A783C25BCF693F07872783C293C0E0B8F2784C7E3C3E371E1F1D8F0787478FC51783C323CFE303C1E1E1E0F0B8F3F088FDF8F37D98DF7438A57188B2783C7E3F6E396B03868C50BDD84C7A6F09884C7C6F0D0101E73E171DFF0F8BDF0B87778DC2B3C7E373CEE512814BE131E770B8FBB84C7FF6A6868D839FCCEFF088F3B86C781E1F15BE1F19BE1F11BE1F1EB312884C7EDC3E376A5F3E4B6098F5F098F5F0EBFF34BE1F18BE1F10BE1F173E1F1B3E171ABF0BBFF393CFE5378FC742E97DB323C6E1E1E3FD5D4D4F489F0F88FCDCDCD5B5F76D965E98A152BDE4ABBE9E5975F7EE997BFFC653A77EE5CA1AE8A8265477B28DBB678BE6C5806368C170A1B3468D0DFC72B51EFB9E79E1F88B73A0ACF378A2D6E7408CBCC87C2F30F0F1E3CF82361B9DA383CDF24B6F0331F0D5F6F1A9E7F2C2C479B85DFF9F1B84CC5652BB6F0F527E3B21697B9F07C8BD2F2F7E9D8E232190FA92E2D9F5B85E75B9796D9CFC516BEFE7C6959FE62F85DFF525ABEBF1C5BF8997F2D2DF7DB84E75F2DAD0BDB85E7FF165B691DF95AF8991DE27A13D79FB8373EAE4BA5F5E95BE1EB6F97D6B11DC3F39DE27A575AF7760E5FFF675C1FE37A199EEF5A5A47BF135B78CFEE71DD8DEB7078BE67697DDE3BB6F0F53EA5F57CDFB847BFB4EE3784E7F9D84A6342129E174AE344BC30D6A0D84AE3C79078B8561C53E2D812C7987889FCD84A63CED0F0FC90380EC5F1283C3F34B6D2F87478787E4469CC3A323C3F2A8E63A5B1ECE8F0F531A5F1EDB8F0FCC7A531EF84D8C2D72796C6C23826FE77697CFC4969AC1C1EC7CDD2F8795A692C8D63EA99A5765669AC3DA734EE9E1B9E9F175B693CBE203CBFB03446FF4F787E711CB7638B6378683F2B8DE7BF08ED97718C2F8DF3F186E69797C6FE7845C72B4BF3C1D5A5764D699E1819E78DF0FCBAD21C12E792EBC3D73794E6969BC2F3DFC6F926CE3BA5B9E796D23C14E7A3DF97E6A6DB4AEBCCE8D29C15E7AE3B4AF3589CCFFE506A7797E6B9B1A5392FCE7DF7C479B03417C63971629C1F4BF3E4E4D29C797F69FE9C5A9A4BE39C3AAD34BF3E546A7F2ACDBB8F84F6E7D25CFC97529B5E9AA31F0F6D4669DEFE6B68334B6D56695E9F5D9AE3E35CFF7469DE7FA65403C45A607EA92E88F5C1C2525B54AA1B16976A88584B2C2DD5152F946A8C1763BD51AA3B96C71AA4D4623DF25AA9368935CAEBA57AE5CD527BAB54C7BC638316EBB0A68EE3C4203D41BD7BD729A79CF2EE78CE5B3CDF72B7DD76DB201682591198158059E197157D59B197157A5981575EDC65455D56D065855C56C465C55B56B865455B56AC65855A56A065C55956946505595688654558567C658557567465C5565668B529B00E2C1556C5A22A2BA8B2422A2BA2B2E2292B9CB282292B96B222292B90B2E2282B8AB282282B84B222282B7EB2C2272B78B262A74D919315385961532C6AB262262B64B222262B5EB2C2252B58B262A5AC48C90A94AC30C98A926231921522590192151F658547567094171B5991F1ECF0E1C397CD9B37EF9DEE06CB65CB96A523468C28160BD51A2E972C59120B99F4E69B6F4E5F7DF5D574F3CD374F77DA69A734AC2FC576EBADB7165F6FFB73F17BE79C734E875F5779B0EC6A5B512A0A5F2D1589CBB30D56A542F2C5B20D574BCB365E2D2EB56C23D6C2B20D59F34BCB56F906ADA7CB366ACD2EB56CE3D6CCB20D5C334ACB6EB6A16B7AD9C6AE3F9796F36CA3D79FCA367C4D2BDBF8F5C7D23A926D049B9C6D082BAD4B13B30D62A575ACB851AC1414C6661BC7E2FA986D202BADA3B7671BCA4AEB6E716359697D1E956D342BADE7C50D67A540936D3CBBB134261437A295C6895F970A9E6C63DA35651BD4AECC36AA95C2D5E5651BD77E996D602B85B29F651BDAE298956D6C8BE358692C2B6E742B8D6FC50D6FA531EFEC6C035C692C2C6E842B8D8FA7661BE3E2B8996D902B8DA5C58D72B195C6D8E2C6B9D2B85BDC40175B693C2E6EA82B8DD1C58D7571DC2E8DDDC58D76A5F1BCB8E12E8EF1A5F05CDC80571AFB5B37E2C57921B66C635E69BE286ED02BCD2149B661AF34B71437EE95E69B7DB38D7CA579A8B8A1AF34371537F6C516E7AC6CA35F691E2B6EF88B2DCE6FD906C0D29C57DC0818E7C1D25C58DC18589A1F8B1B04E39C195BB661B0349716370E96E6D76DB28D84A579B7B8A1B034177F31DB60589AA38B1B0D4BF37671C3616CA5F9BC7503629CEBB38D88B1C51A20DB9818EB82581FC40D42B1C57A21D60D716351AC21622D113724C5BA22B65863C48D4CB1DE887547DC00156B90D8623D12374EC5DA24D628E1F97B63BD12EB96D8E2293DB18E19E0082CD6ED1ECBEBE218A12700FA48C889EF993C79F25D2B57AE7CBB2BA1F2FEFBEF5F70E08107BEF2939FFC247DFAE9A7AB3A6C3DF0C003E9669B6D16F7CA1603E2E38F3F5E7CBCE4924B5A4363F6DEEDB6DBAE356C5E75D555E9C61B6F9C3EF8E083C5AF77DF7DF7D6D7E2EFA8F643614B05F0948E82A5A51E80FEAE743443414F00F4B11B6EB861BFD9B367BFD651A07CF6D967579E7EFAE98BE35E8AB825BBD62EDE1343E1C891238B8F03070E4C274D9AB44AB09C356B563A6AD4A8D660B9C30E3BA4A3478F4EAFBBEEBAD69FBFE9A69B6AEAE23D71AF4B698F9D600940BD05CB781459A22700D68178A8530857F7AF58B1E2CD2C50BEF1C61BEFFCFEF7BF9FB7FFFEFB0F89873865EFADE660397FFEFCE21EC60D37DCB01820B36078E9A597B606C7B8D7B23C58C6F79F7CF2C9AD0174BDF5D64B43902E06B6C9932717BF1FC3672DDE6EA4B4077392600940BD88A721C4C3E3F504C03A74DA69A7B5C4301582D4E2CB2FBFBCDDF313AA7D8F6576F8EB2DB7DCD21A2CE31EC9B67B31B3E74F3DF55471EF64FCDE17BFF8C562D08CDF5FBA7469F17B219CD5EC7D2CCB26D9B807738A251C80FEAE749E7B5E4F00AC63E57B276B3158B60D93F1F9F5D75F5F0C8CF1BCCB458B16AD122CB7DF7EFBF4F6DB6F2F7E2FEEF1DC6AABAD8A87C25E73CD35AD17028A2DFE5CAD064B00A8A360192FA4D8A02700AA5CAD04CBE9D3A7A72FBDF452EB61B0D91EC8F8FD2C58CE9B37AF78E5D8183AE3A1A2F171CB2DB74C0F3DF4D0E2F3B8D733BE77DCB87135BDC71200EA45E9EAFC393D012058F648B08C81F2B39FFD6CEBC57AE20578E2633CF475409BDB8DC4C367A74C99527CCCAE021B1FE3F996D9457C044B00A87EA5FBA6EFA7270004CB1E0996F150D6F818F748C6C7679E7926BDFBEEBB573BC7B2FC671E79E49162A08CF7BEAC95ABDE0A9600F037F1DEC2F11EB67A0240B05CEBB67CF9F2F489279E281EF65AFEFDECFE94F1DE95EDDDC73286D1E1C38717EF6579D2492715BF9F05D478BEA5600900D5ADB1B1F196102EBFA7270004CB3EBF8A6C2DFFFB054B00582558FE2EB47DF4048060A909960050917C3E3F2A4992BDF5048060A90996005091C6C6C65B43DB534F0008969A60090015C9E7F3B72549F25D3D0120586A82250054A4B1B1717408977BE80900C152132C01A0D260F9BFA1EDAE2700044B4DB004808AE4F3F9DB0B85C277F4048060A90996005091C6C6C63B42B8DC4D4F0008969A6009009506CB3B9324D9554F0008969A60090015C9E7F377150A855DF4048060A90996005091C6C6C63F8470F95F7A0240B0D4044B00A83458DE9D24C97FEA0900C152132C01A02221548E696868D8594F0008969A60090015696C6C1C17C2E54E7A0240B0D4044B00A8480895E31B1A1A76D4130082A526580240451A1B1BEF096DA09E00102C35C112002A0D96139224F9B69E00102C35C112002A1242E5BD0D0D0DDFD2130082A526580240451A1B1B2786F64D3D0120586A822500541A2C272549F2EF7A0240B0D4044B00A83458DED7D0D0F00D3D0120586A822500541A2C2787F6753D0120586A822500541A2CEF4F9264073D0120586A822500541A2CA7E4F3F9AFE90900C152132C01A0D2603935B4EDF5048060A90996005069B07C209FCF6FA72700AADCB871E304BAEA692B42B07CD3520900ADC1725A68DBEA09802A3771E2C4858B172F16EAAAA02D58B0E0C6102C67582A01A035583E582814BEAA2700AADCF8F1E3F79A3061C28BCF3DF7DC6BC2DDBADB531943E5D8B1639F096D3F4B2500B406CB87F2F9FC367A02A0068430B3C7983163A6C5C330E3397EB5D8468D1A95D6EABFBDD4EF33844A00582D58FE29B4AFE809007ADD73CF3DB7EF881123D230F16CA13700A0FFC8E7F30F170A857FD51300F4AA344DDFF7C20B2F2C0BD2A14387FEAF1E0180FEA3B1B1F191102EBFAC2700E855F3E6CDFB755A72FFFDF72F4892646FBD0200FD2658FE39CCED5FD21300F49A575E79E5CB6FBFFDF63B699933CF3C735E4B4BCB07F50E00D4BE7C3EFF685353D3BFE809007ACDA2458BE6A46DBCF8E28B8BC20474B1DE0180DAD7D8D8F897102EBFA82700E81573E7CE3D39EDC0A851A316B9993200F48B60393D49922FE809007A5CC88E1F5BB972E51B1D05CB77DE79E7F51FFDE8478F0E1C38F03D7A0B006A5708958FE572B9CFEB09007ADCFCF9F3A7A46B3067CE9C7961323A4A6F0140ED6A6C6C9C11E6F3CFEA09007ADCE4C993D7942BD3152B564C089351DAD2D2F23E3D0600B52984CA2772B9DCD67A02801EF7939FFCE4B0CE0E858DB972D8B06137D9630900B5ADB1B1F1AFF97C7E2B3D0140AFB8F1C61BFFDA51AA7CF2C9272F0D13D114E7580240CD07CB998542E19FF50400BD2297CB7D2604C815ED5CB8677A5353D374578505807E112C67C5395F4F00D06BCE3BEFBC4B42907CBB3C585E71C51557E6F3F98BF40E00F48B60F96498D7FF494F00D06BE2A1AE77DD75D7E22C54BEF8E28BD7C72D9B2D2D2D1FD43B00D02F82E5EC42A1F0693D0140AF3AFCF0C3775AB66CD9CAD0D2A143878E4D92646FBD0200FD2658CEC9E5725BEA09007ADD65975D76E7881123D27C3E3F4A6F0040BF0A964F85B6859E00A0D7C5435FE33D2B9DDC0F00FD2E583E5D281436D71300F4D5C493EA0500E877F3FB33B95CEE537A0200C11200A8747E9F1BDA27F5040082250050E9FC3E3F97CBFDA39E0040B004002A9DDF1784F6713D0180600900543ABF3FDBDCDCBC999E0040B004002A9DDF17E672B98FE90900044B00A0D2F97D5192249BEA0900044B00A0D2F9FDB94183067D544F002058020095CEEF8B73B9DC267A0200C11200A8747E5F9224C9C67A0200C11200A8747E7F7EF0E0C11FD1130008960040A5F3FBD25C2EF7613D0180600900543ABFBF5028143EA42700102C01808AE4F3F9652D2D2D1FD4130008960040A5F3FB4B4D4D4DFFA02700102C01808A2449F2F29E7BEEF9013D0180600900543ABF2FCFE572EFD7130008960040A5F3FB2B83060DFA7B3D0180600900543ABFBFFADDEF7EF7EFF4040082250050E9FCFE5A2E97DB504F002058020095CEEF2B5A5A5ADEA72700102C01804AE7F795BBEDB6DB067A0200C11200A8747E7F3D97CBBD574F002058020095CEEF6F0C1D3A747D3D0180600900543ABFBF3970E0C0F7E80900044B00A0D2F9FDED534E39E5DD7A0200C11200A8747E7F273CBC4B4F0020580200E677006A63E2D1344DD334ADFF35550E00000000000000000000000000000000000000000000000000000000000000B04EFD7F52A9DA10FF9FDF790000000049454E44AE426082, + 1); +INSERT INTO `act_ge_bytearray` +VALUES ('247539', 1, 'var-userLeave', NULL, + 0xACED000573720018636F6D2E6C656E2E656E746974792E557365724C65617665000000000000000102000F4C0009626567696E54696D657400104C6A6176612F7574696C2F446174653B4C000863726561746542797400124C6A6176612F6C616E672F537472696E673B4C000A6372656174654461746571007E00014C0004646179737400134C6A6176612F6C616E672F496E74656765723B4C0007656E6454696D6571007E00014C0002696471007E00024C000B6F70696E696F6E4C6973747400104C6A6176612F7574696C2F4C6973743B4C001170726F63657373496E7374616E6365496471007E00024C0006726561736F6E71007E00024C000673746174757371007E00024C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E00014C000675736572496471007E00024C0008757365724E616D6571007E000278707372000E6A6176612E7574696C2E44617465686A81014B5974190300007870770800000163F9E00C007874002061346137343362666665393731316537623437323230316130363863363438327371007E0006770800000163FEF2E18C78737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000037371007E0006770800000163FF066800787400203266643739336364643964333432663862303335333063383566326233303533737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A65787000000000770400000000787400043230313874000CE6B58BE8AF95E8AFB7E581877070707071007E00087400037A786D, + NULL); +INSERT INTO `act_ge_bytearray` +VALUES ('247541', 1, 'hist.var-userLeave', NULL, + 0xACED000573720018636F6D2E6C656E2E656E746974792E557365724C65617665000000000000000102000F4C0009626567696E54696D657400104C6A6176612F7574696C2F446174653B4C000863726561746542797400124C6A6176612F6C616E672F537472696E673B4C000A6372656174654461746571007E00014C0004646179737400134C6A6176612F6C616E672F496E74656765723B4C0007656E6454696D6571007E00014C0002696471007E00024C000B6F70696E696F6E4C6973747400104C6A6176612F7574696C2F4C6973743B4C001170726F63657373496E7374616E6365496471007E00024C0006726561736F6E71007E00024C000673746174757371007E00024C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E00014C000675736572496471007E00024C0008757365724E616D6571007E000278707372000E6A6176612E7574696C2E44617465686A81014B5974190300007870770800000163F9E00C007874002061346137343362666665393731316537623437323230316130363863363438327371007E0006770800000163FEF2E18C78737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000037371007E0006770800000163FF066800787400203266643739336364643964333432663862303335333063383566326233303533737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A65787000000000770400000000787400043230313874000CE6B58BE8AF95E8AFB7E581877070707071007E00087400037A786D, + NULL); +INSERT INTO `act_ge_bytearray` +VALUES ('247542', 1, 'hist.detail.var-userLeave', NULL, + 0xACED000573720018636F6D2E6C656E2E656E746974792E557365724C65617665000000000000000102000F4C0009626567696E54696D657400104C6A6176612F7574696C2F446174653B4C000863726561746542797400124C6A6176612F6C616E672F537472696E673B4C000A6372656174654461746571007E00014C0004646179737400134C6A6176612F6C616E672F496E74656765723B4C0007656E6454696D6571007E00014C0002696471007E00024C000B6F70696E696F6E4C6973747400104C6A6176612F7574696C2F4C6973743B4C001170726F63657373496E7374616E6365496471007E00024C0006726561736F6E71007E00024C000673746174757371007E00024C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E00014C000675736572496471007E00024C0008757365724E616D6571007E000278707372000E6A6176612E7574696C2E44617465686A81014B5974190300007870770800000163F9E00C007874002061346137343362666665393731316537623437323230316130363863363438327371007E0006770800000163FEF2E18C78737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000037371007E0006770800000163FF066800787400203266643739336364643964333432663862303335333063383566326233303533737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A65787000000000770400000000787400043230313874000CE6B58BE8AF95E8AFB7E581877070707071007E00087400037A786D, + NULL); +INSERT INTO `act_ge_bytearray` +VALUES ('247554', 1, 'var-userLeave', NULL, + 0xACED000573720018636F6D2E6C656E2E656E746974792E557365724C65617665000000000000000102000F4C0009626567696E54696D657400104C6A6176612F7574696C2F446174653B4C000863726561746542797400124C6A6176612F6C616E672F537472696E673B4C000A6372656174654461746571007E00014C0004646179737400134C6A6176612F6C616E672F496E74656765723B4C0007656E6454696D6571007E00014C0002696471007E00024C000B6F70696E696F6E4C6973747400104C6A6176612F7574696C2F4C6973743B4C001170726F63657373496E7374616E6365496471007E00024C0006726561736F6E71007E00024C000673746174757371007E00024C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E00014C000675736572496471007E00024C0008757365724E616D6571007E000278707372000E6A6176612E7574696C2E44617465686A81014B5974190300007870770800000163F9E00C007874002061346137343362666665393731316537623437323230316130363863363438327371007E0006770800000163FEF7CF0278737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000037371007E0006770800000164042CC400787400203765393832666139393863303434386538306231353832346333303439633562737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A65787000000000770400000000787400043230313874000CE6B58BE8AF95E8AFB7E581877070707071007E00087400037A786D, + NULL); +INSERT INTO `act_ge_bytearray` +VALUES ('247556', 1, 'hist.var-userLeave', NULL, + 0xACED000573720018636F6D2E6C656E2E656E746974792E557365724C65617665000000000000000102000F4C0009626567696E54696D657400104C6A6176612F7574696C2F446174653B4C000863726561746542797400124C6A6176612F6C616E672F537472696E673B4C000A6372656174654461746571007E00014C0004646179737400134C6A6176612F6C616E672F496E74656765723B4C0007656E6454696D6571007E00014C0002696471007E00024C000B6F70696E696F6E4C6973747400104C6A6176612F7574696C2F4C6973743B4C001170726F63657373496E7374616E6365496471007E00024C0006726561736F6E71007E00024C000673746174757371007E00024C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E00014C000675736572496471007E00024C0008757365724E616D6571007E000278707372000E6A6176612E7574696C2E44617465686A81014B5974190300007870770800000163F9E00C007874002061346137343362666665393731316537623437323230316130363863363438327371007E0006770800000163FEF7CF0278737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000037371007E0006770800000164042CC400787400203765393832666139393863303434386538306231353832346333303439633562737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A65787000000000770400000000787400043230313874000CE6B58BE8AF95E8AFB7E581877070707071007E00087400037A786D, + NULL); +INSERT INTO `act_ge_bytearray` +VALUES ('247557', 1, 'hist.detail.var-userLeave', NULL, + 0xACED000573720018636F6D2E6C656E2E656E746974792E557365724C65617665000000000000000102000F4C0009626567696E54696D657400104C6A6176612F7574696C2F446174653B4C000863726561746542797400124C6A6176612F6C616E672F537472696E673B4C000A6372656174654461746571007E00014C0004646179737400134C6A6176612F6C616E672F496E74656765723B4C0007656E6454696D6571007E00014C0002696471007E00024C000B6F70696E696F6E4C6973747400104C6A6176612F7574696C2F4C6973743B4C001170726F63657373496E7374616E6365496471007E00024C0006726561736F6E71007E00024C000673746174757371007E00024C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E00014C000675736572496471007E00024C0008757365724E616D6571007E000278707372000E6A6176612E7574696C2E44617465686A81014B5974190300007870770800000163F9E00C007874002061346137343362666665393731316537623437323230316130363863363438327371007E0006770800000163FEF7CF0278737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000037371007E0006770800000164042CC400787400203765393832666139393863303434386538306231353832346333303439633562737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A65787000000000770400000000787400043230313874000CE6B58BE8AF95E8AFB7E581877070707071007E00087400037A786D, + NULL); +INSERT INTO `act_ge_bytearray` +VALUES ('302553', 1, '请假流程.bpmn20.xml', '302552', + 0x3C3F786D6C2076657273696F6E3D27312E302720656E636F64696E673D275554462D38273F3E0A3C646566696E6974696F6E7320786D6C6E733D22687474703A2F2F7777772E6F6D672E6F72672F737065632F42504D4E2F32303130303532342F4D4F44454C2220786D6C6E733A7873693D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D612D696E7374616E63652220786D6C6E733A7873643D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D612220786D6C6E733A61637469766974693D22687474703A2F2F61637469766974692E6F72672F62706D6E2220786D6C6E733A62706D6E64693D22687474703A2F2F7777772E6F6D672E6F72672F737065632F42504D4E2F32303130303532342F44492220786D6C6E733A6F6D6764633D22687474703A2F2F7777772E6F6D672E6F72672F737065632F44442F32303130303532342F44432220786D6C6E733A6F6D6764693D22687474703A2F2F7777772E6F6D672E6F72672F737065632F44442F32303130303532342F44492220747970654C616E67756167653D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D61222065787072657373696F6E4C616E67756167653D22687474703A2F2F7777772E77332E6F72672F313939392F585061746822207461726765744E616D6573706163653D22687474703A2F2F7777772E61637469766974692E6F72672F70726F63657373646566223E0A20203C70726F636573732069643D2270726F636573735F6C6561766522206E616D653D22E8AFB7E58187E6B581E7A88B2220697345786563757461626C653D2274727565223E0A202020203C73746172744576656E742069643D22737461727422206E616D653D227374617274222F3E0A202020203C757365725461736B2069643D22757365723122206E616D653D22E7BB8FE79086E5AEA1E689B9222061637469766974693A61737369676E65653D223062373632356665646161303565383566323832343836653163396339316239222061637469766974693A63616E64696461746547726F7570733D226533343665393633363834383463386661376632313763653535306130313836222F3E0A202020203C73657175656E6365466C6F772069643D227369642D30443235384332342D314631392D343233332D413937362D4130443843423944414541432220736F757263655265663D22737461727422207461726765745265663D227573657231222F3E0A202020203C757365725461736B2069643D22757365723222206E616D653D22E4BABAE4BA8BE5AEA1E689B9222061637469766974693A61737369676E65653D223938623035316230333638316465363032383939336135643134616339336362222F3E0A202020203C6578636C7573697665476174657761792069643D227369642D35353636443037362D414234432D344134322D393938462D323533373738394638313831222F3E0A202020203C73657175656E6365466C6F772069643D227369642D33334642463234452D464537302D343730412D394442352D3942313838314531333834372220736F757263655265663D22757365723222207461726765745265663D227369642D35353636443037362D414234432D344134322D393938462D323533373738394638313831222F3E0A202020203C6578636C7573697665476174657761792069643D227369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535222F3E0A202020203C757365725461736B2069643D227573657222206E616D653D22E8B083E695B4222F3E0A202020203C656E644576656E742069643D22656E6422206E616D653D22656E64222F3E0A202020203C73657175656E6365466C6F772069643D227369642D34373638373538312D333535422D343335342D383433432D43333034323333323836414622206E616D653D22E5908CE6848F2220736F757263655265663D227369642D35353636443037362D414234432D344134322D393938462D32353337373839463831383122207461726765745265663D22656E64223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D747275657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C73657175656E6365466C6F772069643D227369642D46423539344242452D383030352D344544432D423343382D39373831454432323643393522206E616D653D22E4B88DE5908CE6848F2220736F757263655265663D227369642D35353636443037362D414234432D344134322D393938462D32353337373839463831383122207461726765745265663D2275736572223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D66616C73657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C73657175656E6365466C6F772069643D227369642D39394343413337462D413233352D343835332D383437322D44453233334144324544333222206E616D653D22E9878DE696B0E794B3E8AFB72220736F757263655265663D227573657222207461726765745265663D227573657231223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D747275657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C6578636C7573697665476174657761792069643D227369642D39353037343945412D344242362D343237362D423637412D444530334533344130353733222F3E0A202020203C73657175656E6365466C6F772069643D227369642D30344339463239412D304242352D343639312D383034432D37363445344530413237313622206E616D653D22E58F96E6B688E8AFB7E581872220736F757263655265663D227573657222207461726765745265663D22656E64223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D66616C73657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C73657175656E6365466C6F772069643D227369642D30413541464638362D414541342D343231322D423146342D3932373541343430364332442220736F757263655265663D22757365723122207461726765745265663D227369642D39353037343945412D344242362D343237362D423637412D444530334533344130353733222F3E0A202020203C73657175656E6365466C6F772069643D227369642D37463032463244352D413642412D343233342D413732342D3346383938443233354134422220736F757263655265663D226368696C6422207461726765745265663D227369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535222F3E0A202020203C73756250726F636573732069643D226368696C6422206E616D653D2273756250726F63657373223E0A2020202020203C73746172744576656E742069643D22737374617274222F3E0A2020202020203C757365725461736B2069643D22616C6C6D616E6167657222206E616D653D22E680BBE7BB8FE79086E5AEA1E689B9222061637469766974693A61737369676E65653D226438313861633661383663663161363464323138346266303639396436376138222F3E0A2020202020203C6578636C7573697665476174657761792069643D227369642D31434331333342322D343442312D343833302D394335392D374433353634433933334641222F3E0A2020202020203C656E644576656E742069643D227369642D46363844434341302D463741342D343444342D394534342D353641363832443837454341222F3E0A2020202020203C656E644576656E742069643D227369642D36393442374132412D393841442D343530442D383146452D313135424335363237354244222F3E0A2020202020203C73657175656E6365466C6F772069643D227369642D33453941414432332D343444412D344138352D383242442D4436433833304134433439382220736F757263655265663D2273737461727422207461726765745265663D22616C6C6D616E61676572222F3E0A2020202020203C73657175656E6365466C6F772069643D227369642D41323335414337362D354242452D344133382D383243342D31304545383141463834363522206E616D653D22E5908CE6848F2220736F757263655265663D227369642D31434331333342322D343442312D343833302D394335392D37443335363443393333464122207461726765745265663D227369642D46363844434341302D463741342D343444342D394534342D353641363832443837454341223E0A20202020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D747275657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A2020202020203C2F73657175656E6365466C6F773E0A2020202020203C73657175656E6365466C6F772069643D227369642D44413934353339452D463639342D343041312D424534412D42434343314439424431314422206E616D653D22E4B88DE5908CE6848F2220736F757263655265663D227369642D31434331333342322D343442312D343833302D394335392D37443335363443393333464122207461726765745265663D227369642D36393442374132412D393841442D343530442D383146452D313135424335363237354244223E0A20202020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D66616C73657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A2020202020203C2F73657175656E6365466C6F773E0A2020202020203C73657175656E6365466C6F772069643D227369642D34454238313431392D314141372D343937452D413545452D4535414546313743354530422220736F757263655265663D22616C6C6D616E6167657222207461726765745265663D227369642D31434331333342322D343442312D343833302D394335392D374433353634433933334641222F3E0A202020203C2F73756250726F636573733E0A202020203C73657175656E6365466C6F772069643D227369642D41453541454438342D303734362D343738372D393836462D36413739323743333443333422206E616D653D22E5908CE6848F2220736F757263655265663D227369642D42453337324431342D463530392D344544422D383745382D37423231303738333541453522207461726765745265663D227573657232223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D747275657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C73657175656E6365466C6F772069643D227369642D35313046453036322D433042432D343643382D394231372D38413338303732413242433622206E616D653D22E4B88DE5908CE6848F2220736F757263655265663D227369642D42453337324431342D463530392D344544422D383745382D37423231303738333541453522207461726765745265663D2275736572223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D66616C73657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C73657175656E6365466C6F772069643D227369642D38344442433035362D303639312D343733452D383243462D44333235454637333641373222206E616D653D22E4B88DE5908CE6848F2220736F757263655265663D227369642D39353037343945412D344242362D343237362D423637412D44453033453334413035373322207461726765745265663D227369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D66616C73657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C73657175656E6365466C6F772069643D227369642D30443039333043392D394241312D344636382D383545412D33383445313642343039413022206E616D653D22E5908CE6848F2220736F757263655265663D227369642D39353037343945412D344242362D343237362D423637412D44453033453334413035373322207461726765745265663D226368696C64223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D747275657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A20203C2F70726F636573733E0A20203C62706D6E64693A42504D4E4469616772616D2069643D2242504D4E4469616772616D5F70726F636573735F6C65617665223E0A202020203C62706D6E64693A42504D4E506C616E652062706D6E456C656D656E743D2270726F636573735F6C65617665222069643D2242504D4E506C616E655F70726F636573735F6C65617665223E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227374617274222069643D2242504D4E53686170655F7374617274223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2233302E30222077696474683D2233302E302220783D2233302E302220793D223232382E37303337303339393831383338222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227573657231222069643D2242504D4E53686170655F7573657231223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2238302E30222077696474683D2239392E39393939393939393939393939342220783D223132302E302220793D223230332E37303337303339393831383338222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227573657232222069643D2242504D4E53686170655F7573657232223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2237392E3939393939393939393939393937222077696474683D2239392E39393939393939393939393938392220783D223531302E30393038383236333634343631372220793D223230332E3730333730333130343131343233222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227369642D35353636443037362D414234432D344134322D393938462D323533373738394638313831222069643D2242504D4E53686170655F7369642D35353636443037362D414234432D344134322D393938462D323533373738394638313831223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2234302E30222077696474683D2234302E302220783D223731352E353435343431333138323233312220793D223232332E37303337303339393831383338222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535222069643D2242504D4E53686170655F7369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2234302E30222077696474683D2234302E302220783D223337302E353435343431333138323233312220793D223232332E37303337303339393831383338222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D2275736572222069643D2242504D4E53686170655F75736572223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2238302E30222077696474683D223130302E30303030303030303030303032332220783D223334302E3534353434313331383232332220793D223336382E37303337303636343732373932222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D22656E64222069643D2242504D4E53686170655F656E64223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2232382E30222077696474683D2232382E302220783D223838302E353435343431333138323233322220793D223232392E37303337303339393831383338222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227369642D39353037343945412D344242362D343237362D423637412D444530334533344130353733222069643D2242504D4E53686170655F7369642D39353037343945412D344242362D343237362D423637412D444530334533344130353733223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2234302E30222077696474683D2234302E302220783D223236342E39393939393939393939393939342220793D223232332E37303337303339393831383338222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D226368696C64222069643D2242504D4E53686170655F6368696C64223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D223137322E3130323038303930333236363038222077696474683D223431312E36303837323832303738373235362220783D223138342E37343130373732313432383638362220793D22312E34323130383534373135323032303034452D3134222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D22737374617274222069643D2242504D4E53686170655F737374617274223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2233302E30222077696474683D2233302E302220783D223230332E32353935393536373832393732352220793D2237312E3035313034303435313633333034222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D22616C6C6D616E61676572222069643D2242504D4E53686170655F616C6C6D616E61676572223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2238302E30222077696474683D2239392E39393939393939393939393939372220783D223237342E37343130373732313432383638362220793D2234362E3035313034303435313633333034222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227369642D31434331333342322D343442312D343833302D394335392D374433353634433933334641222069643D2242504D4E53686170655F7369642D31434331333342322D343442312D343833302D394335392D374433353634433933334641223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2234302E30222077696474683D2234302E302220783D223431392E37343130373732313432383638362220793D2236362E3035313034303435313633333034222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227369642D46363844434341302D463741342D343444342D394534342D353641363832443837454341222069643D2242504D4E53686170655F7369642D46363844434341302D463741342D343444342D394534342D353641363832443837454341223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2232382E30222077696474683D2232382E302220783D223530342E37343130373732313432383638362220793D2237322E3035313034303435313633333036222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227369642D36393442374132412D393841442D343530442D383146452D313135424335363237354244222069643D2242504D4E53686170655F7369642D36393442374132412D393841442D343530442D383146452D313135424335363237354244223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2232382E303030303030303030303030303134222077696474683D2232382E302220783D223432352E37343130373732313432383638362220793D223133352E30222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D30344339463239412D304242352D343639312D383034432D373634453445304132373136222069643D2242504D4E456467655F7369642D30344339463239412D304242352D343639312D383034432D373634453445304132373136223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223339302E35343534343133313832323331342220793D223434382E37303337303636343732373932222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223339302E35343534343133313832323331342220793D223439342E37303337303636343732373932222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223839342E353435343431333138323233322220793D223439342E37303337303636343732373932222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223839342E353435343431333138323233322220793D223235372E37303337303339393831383338222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D38344442433035362D303639312D343733452D383243462D443332354546373336413732222069643D2242504D4E456467655F7369642D38344442433035362D303639312D343733452D383243462D443332354546373336413732223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223330342E353930383639353736373134332220793D223234342E3131323833343432313436393437222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223337302E363430313837323338373936332220793D223234332E373938343439393138373537222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D41323335414337362D354242452D344133382D383243342D313045453831414638343635222069643D2242504D4E456467655F7369642D41323335414337362D354242452D344133382D383243342D313045453831414638343635223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223435392E333632383732303836303831372220793D2238362E3432393234353537393833383138222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223530342E373431333631313932383236322220793D2238362E3134303231303631373337343835222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D35313046453036322D433042432D343643382D394231372D384133383037324132424336222069643D2242504D4E456467655F7369642D35313046453036322D433042432D343643382D394231372D384133383037324132424336223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223339302E393837353134343839383930352220793D223236332E32363136333038323635313634222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223339302E36363730323138363333373736372220793D223336382E37303337303636343732373932222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D30443235384332342D314631392D343233332D413937362D413044384342394441454143222069643D2242504D4E456467655F7369642D30443235384332342D314631392D343233332D413937362D413044384342394441454143223E0A20202020202020203C6F6D6764693A776179706F696E7420783D2236302E302220793D223234332E37303337303339393831383338222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223132302E302220793D223234332E37303337303339393831383338222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D34454238313431392D314141372D343937452D413545452D453541454631374335453042222069643D2242504D4E456467655F7369642D34454238313431392D314141372D343937452D413545452D453541454631374335453042223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223337342E37343130373732313432383638362220793D2238362E3236373439303636383038333235222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223432302E31353431323036393235343737342220793D2238362E3436343038333932393839333932222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D33334642463234452D464537302D343730412D394442352D394231383831453133383437222069643D2242504D4E456467655F7369642D33334642463234452D464537302D343730412D394442352D394231383831453133383437223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223631302E3039303838323633363434362220793D223234332E3834353738353439363831313337222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223731352E393838343436343031363631392220793D223234342E3134363730393038313632323632222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D34373638373538312D333535422D343335342D383433432D433330343233333238364146222069643D2242504D4E456467655F7369642D34373638373538312D333535422D343335342D383433432D433330343233333238364146223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223735352E313035353637393030353031362220793D223234342E3134333537373431353930353333222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223838302E3534353531303937373036392220793D223234332E3734373836373831363239343733222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D44413934353339452D463639342D343041312D424534412D424343433144394244313144222069643D2242504D4E456467655F7369642D44413934353339452D463639342D343041312D424534412D424343433144394244313144223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223434302E303837373235313633333532342220793D223130352E3730343339323530323536373534222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223433392E383533313635313630393039322220793D223133352E3030303434383731313033393938222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D30443039333043392D394241312D344636382D383545412D333834453136423430394130222069643D2242504D4E456467655F7369642D30443039333043392D394241312D344636382D383545412D333834453136423430394130223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223238342E32343236393939353539333433372220793D223232342E34363130303430343232343934222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223139332E34393435373938303736303230372220793D223137322E3130323038303930333236363038222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D37463032463244352D413642412D343233342D413732342D334638393844323335413442222069643D2242504D4E456467655F7369642D37463032463244352D413642412D343233342D413732342D334638393844323335413442223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223339302E35343534343133313832323331342220793D223137322E3130323038303930333236363038222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223339302E353435343431333138323233312220793D223232332E3730333730333939383138333738222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D39394343413337462D413233352D343835332D383437322D444532333341443245443332222069643D2242504D4E456467655F7369642D39394343413337462D413233352D343835332D383437322D444532333341443245443332223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223334302E3534353434313331383232332220793D223430382E37303337303636343732373933222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223136392E39393939393939393939393939372220793D223430382E37303337303636343732373933222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223136392E39393939393939393939393939372220793D223238332E37303337303339393831383338222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D46423539344242452D383030352D344544432D423343382D393738314544323236433935222069643D2242504D4E456467655F7369642D46423539344242452D383030352D344544432D423343382D393738314544323236433935223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223733362E303435343431333138323233312220793D223236332E32303337303339393831383338222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223733362E303435343431333138323233312220793D223430382E37303337303636343732373932222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223434302E35343534343133313832323332352220793D223430382E3730333730363634373237393236222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D41453541454438342D303734362D343738372D393836462D364137393237433334433334222069643D2242504D4E456467655F7369642D41453541454438342D303734362D343738372D393836462D364137393237433334433334223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223431302E31303138303630343037373735352220793D223234342E3134373333393237353632393338222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223531302E30393038383236333634343631372220793D223234332E3835313539323539373636343134222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D30413541464638362D414541342D343231322D423146342D393237354134343036433244222069643D2242504D4E456467655F7369642D30413541464638362D414541342D343231322D423146342D393237354134343036433244223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223231392E39393939393939393939393939342220793D223234332E393230313534323134363334222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223236352E343133303433343738323630382220793D223234342E31313637343734373634343437222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D33453941414432332D343444412D344138352D383242442D443643383330413443343938222069643D2242504D4E456467655F7369642D33453941414432332D343444412D344138352D383242442D443643383330413443343938223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223233332E32353935393536373832393732352220793D2238362E3035313034303435313633333034222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223237342E37343130373732313432383638362220793D2238362E3035313034303435313633333034222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A202020203C2F62706D6E64693A42504D4E506C616E653E0A20203C2F62706D6E64693A42504D4E4469616772616D3E0A3C2F646566696E6974696F6E733E, + 0); +INSERT INTO `act_ge_bytearray` +VALUES ('302554', 1, '请假流程.process_leave.png', '302552', + 0x89504E470D0A1A0A0000000D4948445200000396000001F80806000000316A727D000062194944415478DAECDD097C54D5FDFF7F5CEBBFF5E752BF55DBAAB5D65A977EADD6B57611BFB5162B5AA424933B4920ECC862485804110822A8280209680111152C8A451414902433804650401417108CB2C85264515C5204BDFFF3B9B967B8339949662699C9CCDCD7D3C779CC649604CFDC39E7BCEF39F7DE162D80CC77FCB5D75E3BFBDC73CFFD5ADD3729140A8542698A72D65967FDF7861B6E582CFD0C5D2D0000191E2ACF38E38C8D37DD74D3772B57AE346B6A6A4C00001AEBE0C183E63BEFBC63B66BD7CE3CEDB4D33E215C020090C18E3BEEB87B6EBCF1C6830C81000089D2B66DDB43279D74D2787A5D00003237586E90994A00001265DDBA75E6F1C71FBF9D5E170080CCC5F257004042C9B2D816B5C75D0200804C0D960000241AC112000082250000044B0000D03CC1D21E48983939398CAA0080600900000896F10F26CE38E38C3A8FB76FDF3E103C8F39E618F3B2CB2E33DF7BEF3D465F0040B004000004CBE882A5F3B96FBFFDD6BCF3CE3BCD162CCD050082250000C8DC60F9AF7FFDCB3CFBECB3CDA38E3A2A30D328BA74E962DDBFFEFAEBCD03070E043DA70713BD7AF5322FB8E002EB7E595959D860D9AF5FBFC0FB9CBFE7D1471F0DFA9DBB76ED32FFF18F7F041EEBD3A78FF57AEDF3CF3F37F3F2F202CFCF9D3B37F09CBCF7C61B6F0C3C273F37F4FFD7D07300008225000004CBD806050DCE4ACE9E3DDBFAF98D37DE087A9F84C701030604FD8E9FFCE42781E72FBAE822F3EDB7DF0EFB3777EFDE5DE731B94C8A04C3D07F57B76EDDAC9FB76FDF6E85CAD090AB7F1E3D7A74C4E762F97F0700102C0100205846E9934F3E092C579599BB2D5BB6840D963ACC39836568E80CF7BE480391534F3DB5CE63575E7965E0E770BFF357BFFA55D8DF77CD35D70442626858ACEFFFAFBEE70000044B00000896718834DB27B392F7DC738F757FD5AA557566FB64D96AACC1F2C4134F0C3B7B2817DC9665AFA101512F83DDBB77AFF5FC934F3E19F6DF2925D2C98242FFFFA27D0E0040B004008060598F9B6EBA2910CC4E3FFD7473E6CC9981E72444EAE7E4184A67D8935B79AD7EACBABADA7ADC7956D82FBEF822E86FC9CFA1338BFA384A59FE7AEBADB7061E2F2C2CB496C53A67175BB66C59E7EF899D3B779A7FFDEB5F03CF2D5BB62CAAFFBFFA9E0300102C01002058020040B0040000044B0000C1120000102C0100044B000040B004008060090000C112000082250000205802000896000080600900205802000082250000044B000008960000102C010000C1120040B0040000044B0000C1120000102C0100044B000040B0040080600900000896000082250000205802000896000080600900205802000082250000044B000040B00400102C010000C1120040B0040000044B0000C1120000102C01002058020040B004008060090000089600008225000020580200089600008060090000C112000082250000044B000040B00400102C010000C1120040B0040000044B0000C19260090000C11200008225000020580200089600008060999E0EAAFFE67C38C79C5F35DF5C5CB1D82C2F2FA724B1489D2F5CBAD07C7FC3FB6C8C00C1120000102CD39384CA05CB169853374F35C7EF1D4F69863279EB64F365FFCBE6860D1BD82001822500002058A61F99A92454A646B8ACACAC648304089600008060997E642926C12E358A2C8D0540B004000004CBB42361865047B004089600008060898407CB29DBC79A152B869A2BCB075945EECB630442822540B0040000044B826514A1F24173F5A281E6DB2F0D082AF2983C4728245802044B000040B02458D65BE6BD35A24EA8D465FE5B77130A099600C1120000102C0996F5079EE5958323064B798E5048B00408960000806049B0ACB7AC5C7C47C46029CF110A099600C1120000102C0996044B822540B0040000044B243058960F8A1C2CD5738442822540B0040000044B8265BD65D9B2211183A53C4728245802044B000040B02458D65B6654DF67AE7AB9EE7258794C9E2314122C01822500002058122C1B0E3D2B86D50996F21881906009102C010000C19260D960E099B067BCB9E4D5BBEA044B794C9E2314122C01822500002058122C239629DB1F6CF0184B790DC1906009102C010000C1926059679672CE7BF7986B160E8C182A7591D7C86B99BD245802044B000040B0245846354BC9EC25C11220580200008225EA0D96D1CC52D6377B4948245836C6A64D9BA804102C010000C132DD8365BCA152174222C1325E23478EB406F9720B102C010000C1328D83258560D91CEEBFFF7EF388238E302FBDF452EB76D8B0617C4141B0040000044B82258560195BA8D46152662C8F3CF248C22508960000806049B0A4102C630F950D3D0E102C010000C1926049215806C8CC647DE1513FCF31972058020080B409969B376F3667CE9C698E1E3DDAECD3A78F59505060E6E4E498F9F9F966CF9E3DCDE1C3879B53A74E353FFEF86382258560D944A1B2A1D0C8CC6578D5D5D5E6B871E3ACB6292F2FCF340CC36AAFA4E4E6E69A3D7AF430C78C1963BD0E044B0000089649307FFE7CB3A4A4C4ECDBB7AF3979F26473C58A15E6B66DDBCC9A9A1AEB79B9DDB56B97B97AF56AF389279EB05E77C71D77984F3EF924C19242B06CC4F2D7686722637D7D269B356B96D9A54B9740888CA674EEDCD99C366D1A099260090000C13211366CD86005CA01030658A1F1D0A14351BFF7ADB7DE32EFBCF34E2B64AE5DBB9660492158C6182A639D81747BB85CBF7EBDD9B56BD798026568E9D8B1635AB757044B00009072C172EEDCB9D6523199AD8C2550865AB4689135D84BD7D94B8225C1321D42A5DB97C54E9F3E3D68A9AB5EEE7AEFBDF79A3E9FCFDCB2658BB97FFF7EEBB55F7DF595B5E2A2AAAACA5A2A2B4BF99DEF93DFC3EC25C11200008265138529398652662C9BC2A64D9BCC5EBD7A998F3EFA28C19242B08CA0A113F524FBF7A48BD9B367D70994722CB82CCF8FC6BE7DFBACD7CBFB9CBFE7E1871F2651122C01002058C66BCE9C3956A88C7650162DF97D72120D99592058520896E1C360532D6375CBCCA5B427CE30585C5C6CCD4EC643DE27CBFE9DBF8F994B8225000004CB387CF0C10766F7EEDD9B6CA632DCCC65A74E9DCC356BD6102C2904CB9010A843E5B7DF7E6B9D7C466E6311FABE4C3FE6528EA9742E7F95B352EBE5AEF19265B2A3468D0A5A169B4EED15C1120000A444B01C326488754C6522C9319772EC26C19242B0AC3BB328A1F0BCF3CEB306F2721B6DB88CF4BE4C0E97CE33BFCA4C656343A5335C3A672EE5843E044B8225000004CB283DFFFCF3D660EA9B6FBE49F820A5A8A8286D9698112C0996C90A953A2CD983F8A8C3A53354EAD2AD5BB73ACB6C336959AC5C52C4794C65BCCB5FEB5B16EB3CE6D2ED4B6209960000102CA376D75D775997144906399DFF6DB7DD46B0A4B83658460A7BE142627DE132DAD767DA3197CED94A39F14EA2C3ABDB672D09960000102CA3F2F1C71F5B27EC69CC65456225CB61E518A9E61E9C2E5EBC986049B04CE836142954465A9E1A6D588C3584A6CBB2D886EAB4BABA3A68B672CF9E3D09F977C8D9629D972269EEF68A60090000523E58CA6540927D2990C71E7BCC1C33664CB30E96F4805106B2959595044B826542B6A178C25D43A131D650E9FCFB471E79644ACF5C3654A772ED49FD9A44B721C9FC5B044B000090F6C1B2A4A4C45CB1624552072AB2EC562E3F920A03585DBA76ED5A67A6846049B06CEC3614EF72D448E1F1E0C1837185CA8696E1A64B9D4ABBA19F5BB2644942FF2D55555581BF2567CC265802000082653DE478C71D3B762475A022D7B5CCCBCB4BA901AC73A6440F64099604CBC66E43F184CAFAC2E5B1C71E1B77A86CECBF2715EA54DA0DFD58539FB427D4B66DDB027FCBEBF5122C010000C1B23EEDDBB7376B6A6A923A5091BF27D7884BC501AC73A6846049B06CEC3624A531212E5CB86C4CA88C75596EAAD5A9B334D5254622914B8F38FF1EC1120000102C1B18C8A5FA00B2B90AC132F582653A6C37BAB46DDBD61A94FFEA57BF6AD4774596BF86CE54CACFF278635C7AE9A5D6EF4AA73A4D76D02358122C010020584649CE7CC88CE5E1D2A1430773F6ECD9E6810307121A2C4BDE29317BCFEF1DF8593ED39B87DF1CF6B5BD5EE8653DFFD0AE87CC1E737A98577AAF34BB3DD3CDBCA8D545E655B95735E9BF4BFECEADA36E6DF0357F2EFCB375BFD3139DCC71BBC7051EEF30AD83EB672C9DDB5043678165C632B63A65C69260090000523458CA49299AE3184BB954402A0D609D61404BF48CA57C8EFD7CFDCC31DBC658F78B2B8B23BEAEEDBD6DAD60A9439C7EFC86FE37047E1EFDD168F3BC6BCFB342A704BC9F5FF973F3B27697593FEB30DA7E6A7BF398E38E09BCA7EFCB7D839E3FF1F413CD5F5CF30BEBBE942E4F75314F39FB943AFF1EEF246FE0BEFC4E7D5F82A65B8365B86D88632C6BF52DF599031F596A8E98FE5AC432FFB56AEB755D074D8858A71C6349B0040000291A2C070E1C98F4B3C22E5FBEBCD9CFB2A8078C050505D6C5D043C3402283E5909543ACC076FC8F8EB7C2DBD1DF3BDAFAF9F4F34FB702A4F3B55D67750DCC6CCAE7FE97E2BF04EEFFE6E6DFD4F9DD123EE53999D9D4AFCB7D24D7BA95F02881F3E4334E0E0A89CE30283FB71EDA3AF0F351C71C1508AF23DE1B61FD7BE535E7FEE15C2B50CAFDA16F0E0DBC77F0EB83ADDB760FB4734DB0AC6F1B8A778630D3CE0A2B81F1B197DE89EA753D4A1E0BAAD39D7BBF32074F5E6695821EFD382B2CC1120000A462B02C2B2B33A74E9D9AD481CAA449939AFDBA7091669792112C7BCEED6905B6D0C78F3BE138F3E2D617077ED6214D42A7737652EECBEF904028F70B1716D699519400A8EF4B9095DB82E905E6A80F4759F7477E30D27A7EECCEB1E6ED2FDD1E98A194E7AECEBFDABA2FC155C268B81954E78CE509A79E1058AE2BB39B320BEA8619CB68B6A178660A13751DCB279F7CB2D9AE632981F1AD8DFF3117BCFE719D59CA992FBF673DBF7EF3EEDA99CD092FD6A953FDFFD66D7019D7B12458020080540C96D5D5D5668F1E3DCC43870E256DA0D2B1634773FDFAF5293FA06AEE60294B64255CCA72D9332F39D30A88F21AF959BFE6EE75775B033F99D97C60C703817028C12F6B6C9675BFF38CCE11672C753894D7848652F977CADF0B172C65C672E02B0303CB79F5E3F237DDB214361E0DCD18461B1A630D973AD40E1A34A859FEBF75B03C70E06083AF1B3AEDD5C0CF4BDEDC6C963CF69A552484DEFEE03CD330BC56D893E5F47BF6EC49C8BF77DFBE7DD6F1E73A58A6437B45B0040000CD1A2C459F3E7DCCD5AB57276590F2C61B6F58C1321D243258CA67F8872E7FB0C29E3EBE511EBBAED7757596CDCA73121A25C8C971987A76512FA3D5B3877A06527E8FCC20EAB0A7672965C6529E1FF6F6B03A41F19CABCFA9336329C75B86CEA0CA497BE4354699113694BAE918CB78459AB98C352C46FBFAE60E953A30CEF6AD0FDC1FFCCF6541C7554E7B716DD860596307D1E232BF39C87E4FFBAE7D02816FE6CC9909F9F7CA325CFD37D2A5BD2258020080660F9632882A2C2C4CCAACA51CAB346DDA345707CBBB56DD65151DC66E1A7293755F02DF3D1BEEA913FAA41495175927EE9163281B0A71CE594709983A30CA6CE505D75F5067796BB4C1524E0E2467B36D11B2D4D6192CF5F2DDD0FF0F8265DD99CBD065A95DBA748979796BB870D9AD5BB7A867489B2B58FE7BC90741CFE9E32F438365B8F73B439FCC5A36F5497CE4F7C9EFD57F235DDA2B8225000068F660691DBBA406A32FBCF042420728322094BDFFD11E939689C1528E6D94B0274B5B5BDED6D29A89D4414C429B2C91BDA6C33575DE27814DCEF81AE9A43BCEF2FD93BE6FFD7E39D6517EBF7EBDCC58469A410D174AE5A43C3A00D7778CA5FCDBF4B25839C18F044DE7D96B0996F52F8BD527F47186C4584EC813E97DA97449918682E553E5EB1A0C96FD27F9AD194E6BD6B24BAF40F02B2E2E6EB24B8FC82546060C1810345B992EED15C1120000A444B0946388E44C8C1B366C48C8E0E4A38F3EB26601D6AC59933603AAA60E96F76FBD3F705911097F57E45C11F4BCF3B21DCEE327E56CB112D89CD7B094C72FF9FB2581FB1222F56CE2A9E79E6A2D7F9520AA2F3FD2C23EC652DF9713023534DB195A6419AD5E6A9B3F393F68465582A4DCDE38F8C63A9741215846BF2C5642A1ECE489F51222A1EF6BECF533131D2CFB4D5A12B414564EEA134BB01C5CF6A269E41E3E0672F8F0E18D0E97122A478D1A15F89D72ADDD746AAF08960000202582A5983E7DBAB51C4FAE33D99476EEDC699D0823DD969425F23A9672B21D1DCAE458CBDF77FA7D60F62FD27BA2990594E017CBEB63099652F4196A9D27EC719E4C285125538365B870998865B6A9162C9F5BB631E8B97FBEF076BDC1B272F516EBB223424268F1C425567BE5BC8EA8CC5CC6BB2C56DEE79CA964092CC11200008265234D9E3CD9ECD4A993F9C1071F34C9EFDBB871A3152A478F1E9D7603AA44064B0AC13211E1B2A9436A22826543AF0B0D96CF541C0EA4231F7F2D70FFAEA9AF5AED554E8E1174CCA59CD047CEEA1A0D799D2CD1771E5329251DDB2B8225000048A960A9672EF3F2F2CC7FFFFBDF8D3AA18F0CD8BC5EAF35F84B47044B8265323576F96AAA2D7F0D0D8C53E7BD1DF6B9CFBF3A600E7C64A9351329AF9BF8DCE1E5A79B77EEB71E7B7FD39EA06331777F5E1358F6DB7DD894A070A903A65C7B72C99225D66CA45E262BCB5DB76DDB6656555599A5A5A5D6F27FE7FB64F96BBAB657044B00009072C152C831975DBB76B5CEE2BA6AD5AA98DEBB62C50AEB782F39F1453A1FA344B024583657B88C75C631954ED41329583E5DB92EE2F3727D4B798D94D0F7C9352CAD1D5E0BDE09BC46CAE819CBCD11D3ABACFBABDF7EC75AC6EF0C89B196746FAF08960000202583A53663C60C6BC0267BF6EFBBEF3EF395575E313FF9E413B3A6A6C67AFEEBAFBF3677ECD861CD003CF8E08366FBF6EDAD019AECF54FF7B329122C0996E9B02C365597BF3607DD5EC51A2833A1BD2258020080940E965A7575B53976EC58B367CF9E758E4792E5AE32B3294BCF64A63353102C0996A91E2E9F7CF249EB7583060D2201B9BCBD2258020080B408966E44B02458A6C2B2D848CB5BF5D95F099520580200008225C19242B08C79E692E5AF20580200008225C19242B08C3B5C122A41B0040000044B822585601977B8BCF4D24B099520580200008225C19242B08C8F1C5329DF7D39010D40B0040000044B8225856019974D9B36112C41B0040000044B82258560D938044B102C010000C19260492158122C41B0040000044B8225856049B004C1120000102C41B02458122C0182250000044B102C0996044B80600900000896044B0AC1926009822500002058122C29044B8225089600008060098225C1926009102C01002058826049B0245802044B000040B02458520896044B102C010000C19260492158122C41B0040000044B102C0996044B8060090000C112044B8225C11220580200008225C19242B0245882600900000896044B0AC13211C1B262E52673C4F42ABBBC6695F9AF55078AF3B1BEA53EB3A8D41FF43BE4B1818F2C0DBC2E5CD1EF7D70D6CA7AFF3D2BDEDD6EBD6EE7DEAFF87008960000806089508B2B1613EA089629192C6B0E1C0CFB9C04BCFE939634F83BE4758FBDF44E54AF1B3AEDD5A0C724400E9EBCCC2ACE007AD7D4576BEF97F9AC9F41B0040000044B280B972D34A76E9E4AB06BE6327BD36CB3B2B2920DB281A5B095ABB758816EC99B9BA30A8C6F6DFC8FB9E0F58FEBCC52CE7CF93DEBF9F59B775BB7231F7FADCEFBBFFDF6DBC0EFF9E70B6F5BF73FDCBAD7FA79F11B9B825E03822500002058BADAC6EA8DE6CBFE970997CD1C2A2B2A2BCC0D1B36B8721BECDEBDBB1524EB2B1D3A74300F1C386885BA6897A4EA607920C2CC67A4194B09AD258FBD66153D3B59A45EA3672D6569AE5E8E2B3F1797F9694808960000806089EAEA6AD3E7F3594B3129C92F3253E9D65029962D5BD660B09C3D7B7660E650CF34F69FE437EF7BEAF57A03E36CDFFAC0FDC1FF0C5ED63AEDC5B56183A55E822B817190FD9ED019CF221536CBFEFD268D07C1120000102C01A48AAE5DBB460C95050505E6538BDFB102608D3D6B39755EEDD254098EF2F3FB9BF634182CFFBDE483A0E7F4F197E18EB10C7D7FB8E7E4F84B102C010000C112401ACC5A8E7A648E15E4F67D511308753A580A39DE511E7BE05F6FC4142C9F2A5FD760B0945951E719689D339EF7CE5CC10747B0040000044B00A924DCB19685E3CBCD810F2FA913F89CC152CC78F9DD3A3397A1C1B2DFA42541C1504EEA43B004C11200008225800C9DB5340CAF15DE463D32376CE00B0D96424ED453DF8CE573CB36063DA7CFF41A2958CA1968F549822484164F3C1C70E5ECB09FECFA920F8D60090000089600524D8F1E3D42CE047B206CB0D4A1B03EF51D2319FABAD060F94CC5E140AA2F45A2AF63293EFFEA8039EFD50FADC70898044B000040B0049042E40CB93A583EF7DC731183E023CFBF1555600C37B3A983E1C047965A3391F2BA89CFAD093CB779E7FEC0B25AE7B198BB3FAF09BAB6A5044A799FDC07C1120000102C01A4107DAC65B8D9CA5867229FAE5C17F179E7753143DF27D7B014D317BC13788D94D133965BD7B194FB124EE577481005C1120000102C013413B986EAB871E3CC9E3D7B9A797979A661188119CBDCDC5C6B69EC983163ACD701044B000040B00410306BD62CB34B972E112F3112AE74EEDCD99C366D1A9507822500002058026EB67EFD7AB36BD7AE3105CAD0D2B1634773EDDAB5542608960000806009B8CDF4E9D38396BAEAE5AEF7DE7BAFE9F3F9CC2D5BB698FBF7D71EAFF8D5575F99DBB66D33ABAAAAACA5B2F9F9F941EF93DFC3EC2508960000806009B8C8ECD9B3EB04CA9933679ABB76ED8AEAFDFBF6EDB35E2FEF73FE9E871F7E98CA05C1120000102C0137CC543AC3607171B1353B190F79DF800103827E1F33972058020000822590C1E4984AE7F2D7E1C3870796BBC64B96C98E1A352A6859EC9A356BA86C102C010000C112C844CE33BFCA4C656343A5335C3A672EE5843E00C1120000102C810C239714711E5319EFF2D748E4F7398FB964492C0896000080600964F06CA59C7827D1E195594B102C010000C112C820D5D5D541B3957BF6EC49C8DF91B3C53A2F4522C77402044B000040B00432805C7B5287BD3163C664CCDF02C1120000102C012449CF9E3D03616FC9922509FD5B55555581BFD5BD7B772A1F044B000040B00432415E5E5E20EC35F5497B426DDBB62DF0B7BC5E2F950F8225000020580299C079EDCAA6BAC4482472E911FDB7A400044B000040B0043240B2831EC112044B000040B00498B164C612044B000040B0047018C75882600900000896001A85B3C282600900000896001A85EB5882600900000896001AA5BABA3A10F6727373CD3D7BF624E4EFECDBB7CFCCCFCF0FFCADF5EBD753F9205802000082259029BA74E912087C3367CE4CC8DF98356B56E06F74ECD8914A07C1120000102C814CE20C7D326BD9D427F191DF27BF57FF8D69D3A651E92058020000822590693A77EE1C087EC5C5C54D76E911B9C4C880010382662B0F1C3840858360090000089640A691631E9DD7B41C3E7C78A3C3A584CA51A346057EA7FCFE356BD650D92058020000822590A9A64F9F1E08817AE632DE65B1F23EE74C254B6041B0040000044BC025264F9E1C1406E5D84839A18F9CD5351AF23A3966D3794CA594D1A34753B920580200008225E0D6994B1D30E5DA934B962CB16623F5325959EEBA6DDB36B3AAAACA2C2D2D350B0A0A82DE27CB5F25AC02044B000040B0045C468EB9745E86249E2227EAE1984A102C010000C11270B9193366C41C302550CA2C25677F05C1120000102C01045457579B63C78E357BF6EC59E7F849AFD76B76EFDEDD5A2A2B339D00C1120000102C0100044B000040B00400102C010000C1120000822500006E0A963535358C7800000973F0E0418225000099EC88238E78F7F5D75FFF8A610F002051DE7FFFFDFF1E75D4511FD1EB020090B94A2EBCF0C2F719F6000012E5D24B2F7D57F537F7D2E5020090B98E5765E5CF7EF6B355555555DB65B91200008D25FDC9DAB56B3FF9F5AF7FBD46F533EBECFE0600006478B82CB13B7E9342A1345CE41A90D40385527F39E288233E54B70F102A01000050AFACACACE355C87A4095831E8FE72B757BBB1BFEBFED6009000000008857CB962D8F360CA3AF0A585B2564D9658F7AEA08822500000000A0A150D54E95771C815297675C5407044B0000000088555656D6B92A50CD0F132875E94FB00400000000846518469E1C47594FA8945240B00400000000D417A66409ECC79182A5C7E3B99A600900000000A8574141C1499196C3CA1962099600000000806883D50C550E3882658DCBFEFF099600000000102FFB243E9FCAD257C330CAED60B99260090000000068504949C9912A542D53E576FD980A98EAC79CE9044B00000000408354882C9460A9EE1EE17CBC65CB9647132C0100000000F5722C81FD85DBEB82600900000000310AB70496600900000000885AA425B0044B00000000408358024BB00400000080B8B104966009000000008DC21258822500000000C48D25B0044B00000000881B4B60099600000000D0282C8125580200000040DC58024BB00400000080B8B104966009000000008DC21258822500000000C48D25B0044B00000000881B4B60099600000000D0282C8125580200000040DC58024BB00400000080B8B104966009000000008DC21258822500000000C48D25B0044B000000348112B3E4E899EB673E3BEFB579DF2EAE586C969797539258A4CE172E59B87BB17F711E5B6392B77D96C0122C41BF40BF000040D390C1C382650BCCA99BA79AE3F78EA7344399BC75B2B968C9A2CF2B2A2ADAB145264FE812D8BEA53EB3B0D4B7BC7082EFA948A56F99BF8DF5BA09BE87EAFBDD85E37D57C9EBFA942EFB11C112F40B14FA050040C6933DD20C1E9ABF4CD932E5407979F93AB6C8E408B704D60E960DCE5ECAEB5479DEF99804C8BE65BEA5529C01B46FA97F817DFF4B553E2358827E8142BF0000C848B2E4860E3C358A1A401C648B4CBC484B60AD6039BEE2E2C289FED6A1B39445137CDDE4F9E28915E7C96DD184CA19E17EEFE180EABF43EE178DAB38A7F6F5FE56CED7102C41BF40A15F00006414399E83CE3B6506100CD49320D2596075B02C29997D6C7DEF0F9DB12C9E50715D51A97FB6147B76727F51A96F6F60D96C59E52CEB7E6016D3B7956009FA050AFD0200C095038829DBC79A152B869A2BCB075945EECB6374FC0C20D2497D6781B542DF84CA7C4778F4072F6BADEC1B2E58964CF71F673FBE4D05CAAA70C7651696FA76A8E0393293EA926049BF40BF40BF0000404C038829DB1F34572F1A68BEFDD280A0228FC97374FE0C20D241436781AD1B2C2B0DE773FAF8CB70C75886BE3FCC739FC9F197044BD02F50E8170000AE1D40CC7B6B449DC1832EF3DFBA9BCE9F01445A88B40436EA6059E6EFDC60B02CAD5C6BCD50863993AC0A96930996A05FA0D02F00005C3B80585E3938E200429EA3F3670091EAEA5B021B3958FAD6075D6264A2BF35C1926049BF40BF40BF0000409C0388958BEF88388090E7E8FC1940A4B28696C0460A9685657E8FF3397DA6D748C1B2A8D47FBDBE6EA584501524AB03CFC9D961C72DFB31C112F40B14FA050000030806100C20D250434B60C305CB065F17122C8B26F83BE8E7F4A548F4752CE57ECF49FEE3D5CF6DADC7322460122CE917E817E8170000886D00513E28F200423D47E7CF00225545B304362458F60FF79C04C3A252DF2A6B26D25AD6EA1FAE9F2B9EB4F44C79AC5F99FF7CE7B198B73DFCCAC9CE6B5B4AA094F7C9FD340C91F32548365056B2C5D12FD02FD02F00001840442CCB960D89388090E7E8FC1940A4A26897C03A8365515965C7C8BF6FF6B1F66CA559E77DA5FED972BFB0B4B2B77E8D7526D8D2CAA9D6752CD5CF124EE57748104DC36079B92A07EB0B962ABCB766ABA35FA05FA05F0000308088586654DF67AE7AB9EEB227794C9EA3F36700918AA25D028BA8C3E5C27A82E5F2962D5B1E4D2DD12FD02FD02F00001840D4DFB9AD18566700218FD1F133804845B12C8145D4C1F2F248C1D2308C36D410FD02FD02FD0200800144BD65C29EF1E69257EFAA338090C7E4393A7F0610A924D625B088295C863BD67225B395F40BF40BF40B00000610F5766A53B63FD8E0B134F21A06000C2052054B60131A2CEB1C6BC9B195F40BF40BF40B0000441C40C81EE739EFDD63AE593830E2E04117798DBC96BDD40C209A1B4B609312DCE7325B49BF40BF40BF00004083038886F646B3979A01442A62096CD282E5D58E632B5B5123F40BF40BF40B0000841D4044B337BABEBDD40C06184034C2498D083C2C814D92ECECEC45122C99ADA45FA05FA05F406AF585009052038878070FBA30186000112799FD32EDDB98B00436B99FD30F7FF8436BC692AAA05FA05FA05F40EAF48500907203080A03886670BD2AFB541967DF467D421896C036CFE764074B4EDC43BF40A15F400AF48500C00082C200E27047AA3B50D94BFB69B41D2A4B60D3E37302FD02857E01B4B100184050184024AB236DE8F1202C814D8FCF09F40B14FA05D0C60260004161009128AD1AE830F5F3618F3361096C7A7C4EA05FA0D02F803616480BB9B9B967783C9EDE1D3A7498979797B7C9EBF57E6D9F0AFFBFEAFE16FB9A6BFDE575D4160308061029D79136D45146DC5BCB12D8F4F89C40BF40A15F006D2C523743A9B1D4B3AA6C54E50B3B43D5A8F2B1AB329461186DBA75EBB6B27BF7EE9F959696EE5DB16285B96DDB36B3A6A6C61472BB6BD72E73F9F2E55BC78E1DFB8E0A9E9FA8CAF1ABF7E5B12931806000D1ACAE8F71EF6B9DD7B304363D3E27D02F50E817401B8BD4CB50AA94DB01D28CB264668652FF6367AB30F97A6161E197AB57AF360F1D3A64464B85CC759D3B77DEA07EC72B323065D36200C100A2D93AD2D671BCEF0BE95059029B1E9F135548BF40A15F006D2C522B43A9B230863019AE644E862A2828C8EFD4A9D3D7F3E6CDFB36964019EAA9A79E7A43A5EE9DCC5E3280600091161D69D0FBAFBDF6DA292C814DFDCFA9054BB6E81728F40BA08D454AF0783C39B2D2CB1912737373CD7BEFBDD7F4F97CE6962D5BCCFDFBF75B39E9ABAFBEB2568156555599E3C68D33F3F3F343C3E517699FA1EEBCF3CE82DB6EBBEDC0860D1BCCA6F0E1871F7E9C9797F789AA982E0C20E8BC1940245C43272788CAF7BFFFFDBFDF72CB2DDF9E75D6595DE92652F7736AC2DF03FA05FA05D0C6D2C6A271A1B2B50A83079D8172E6CC99D62183D1D8B76F9FF57A799F3360A66D86EAD7AF5F4FE59B682B205A3B77EEDC61874BD7CE5C3280600091C48EB44996EEA87079131D6AEA7F4E2DD8AB4EBF40A15F006D2C9A3B54E63843657171B1353B190F79DF80010342C3657A65A86EDDBAFDA26BD7AEDF34D54C65B8994B7B59ECF90C20280C209A5CE8C90664F96A8716B12F630D7D1F2731E07302FD02FD026863696311817D4C6560F9EBF0E1C303CB5DE325CB64478D1A15BA2C367D3254BF7EFD3E9A3F7FBE9948D3A74FAF908351194050184024A4236DEDE810A7A962DAB7D176A891DE4787CAE704FA05FA05D0C6D2C6220CFBCCAF8199CAC6864A67B80C99B94C8F0C3562C488DBFAF7EFFFDD37DF7C63265AFBF6EDD7B971492C0308061049EA485BD87B594D4789A6437576A4BAB4773CCF71267C4EA05FA05F006D2C6D2C8243651BE73195F12E7FAD6F59ACF398CBB4C85083060DDA2E97144986575F7D75A91B672D194030804880481D5CB88EB1BE0E35DCEB1F0DF37A8E33E17302FD02FD026863696371385806662BE5C43B89306BD6ACF499B57CFAE9A7AFE8DDBBF7778DB9AC48ACF2F2F236C97A6406101406108DEE485BC5D04186EB50A3ED48433B549602F139817E817E01B4B170ADDCDCDC33F4097B645671CF9E3D09C94D72B6D8904B91A46E862A2B2B7BFAD1471F3593E99E7BEE91632DFB67CA9E0A55FEC000820144A2B7A1383AB4863AD4583B52E7DFFFD46D7B6BF99C40BF40BF00DA58DA58B649CDE3F1F4D6616FCC983109CD4E729D4B47B04CDD0C3562C4882D2B56AC486AB0F4F97CAFAA4A999F091B9D63CD73B9DAC0AE6600C1002251DB5048471A6D4716A9433D32CE8E34742FB16B3A543E27D02FD02F80369636966DD2F1FCB3FA354B962C496876AAAAAA7206CBD4CD507DFAF439B063C78EA4064BF5F76429ECD64CDAE81C6561B8BD1B0C20184034761B6A11FF711DE13AD40F1AD19136F6DF93D1DF753E27D02FD02F80361699BF4DAA9F37EAE79AFAA43DA1B66DDBE6FC77A46E86EAD0A1C377353535490D965F7FFDF56E55293519BAD105F66E38373E06100C201AB90D3576AF68B80EB5311D696887DACA851D0C9F13E817E817401B4B1BEBD26D52AE2DA91F6BAA4B8CD477E911C7BFA126A52BAD39C8DFCDE48DCEB97743A6CF1940308088771B6AD3A64D85DDE98D6BE49F3A32CCDED90FECC71B639CFDBB4E726307A34B565656C529A79CC2E784B4E817645BB83CFBF2A85FDFED996EE6A9E79E1AD3EFBF75D4AD0DBEE6CF857FB6EE777AA293396EF7B8C0E31DA6752058F2BDA12F44AAB7E58192ACECA44BCA565A41418199EC194BF5F70EC6F261654249F600A2D70BBDACC6F2A15D0F993DE6F430AFF45E690D0C2E6A75917955EE554D3E4049B70144BA6D3FD75E7BAD79ECB1C79A8DD81B5ADF5EDA582E1C1D712FADDBBED3F5153E274AB4A53983E579D79E17F639699FCFBEFC6CABE8BEE3C4D34FB48ADC9792FB48AEF53BEED9708FF59EBE2FF7B51E77BEFE17D7FC22F0FA2E4F75314F39FB943AFF06EF246FE07EFBA9ED03F7A59FA05FA0D01752D2A5306369EBD3A7CF37C93EC672E7CE9D3B32F8184B5D567A3C9ED62D5BB63C5A5E97EC60298D64DB7BDB5AC1528738FDF80DFD6F08FC3CFAA3D1D6E0423A7E09783FBFF2E7E665ED2E0B1A2048677FCC71C704DE9309038874DC86EC8EEB8B168939AE249E0ED5EDC758F23921ADFA85D036F9F81F1D1FF179E93B86BD3DCCBCE0FA0BEA04CBCE333A9BA79D775A9DDFE76CCBE5E7D6435B077E3EEA98A3027DCF88F74658BF475E73EE1FCEB5FA03B93FF4CDA181F70E7E7DB075DBEE8176CC58F2BDA18D454A6E93EAF6438EB10C317AF4E83DC93E2B6C5555D5864C3B2B6C3D0D608B640F20BACEEA6AF69EDF3BD041FFA5F82F81FBBFB9F937610710F29CCC6CEAD7E9BDD1121E25709E7CC6C90C209A791B0ADD2BDA888EF4D116E1CF84174B879AB267C22B2AADBCA1B0AC72965526F89E92D2B7CCDF4697A0C74A7DA62AFF71BE5F1E2B2CF52DD7AFD3A5FBD029A62E1D7A0E92F799A5CFAD7DBEBECFE9AABFB62F94D7F5295DF6233EA7C488F479398BFEACD5FD87EAFB5D85E37D5745F979A55DBF103A2329DBD2D1DF3BBADED74980FCDEF1DFAB132C7F70CA0FEAF42563778E356F7FE9F6C00E46F9FD57E75F6DDD97D74A5F122EDC3A77389E70EA0981D536B273527662B214D6D58378FA42DAE5266B9713B14D7256D8301E7DF4D105C9BE8EE5030F3CB02253AE63E9F890971B86D126420398B401840E69326BD8C2313B29F77BCEED690542B95FB8B0B04E072F03007D7FC8CA21D66DC1F40273D487A3ACFB233F18C900A219B7A138F68E36746DAE682F1C1DEAF216297CEDAE92E9FEE3227574AABC1B6587787B439F93FDFB9E77BE463ABEBE65BEA5523A0EFF57E52F2FB9F6CBDAD7F917D89DA8FCFC199F53930F606E8FE675F57D5EC13B1BEAFDBCD2AE5F082DFD7CFDACEDE8FB277D3F68454B68911D8A524283E54F7FFDD3B03B29E5774A180DED53A4EF39EE84E3C2BE5E76380E7C65A0755FFE5DFAF1ACB1591C63E9DE60495F48BBDCE4ED7222B649AE6319C6EBAFBF9ED5A74F1FF3D0A143490B96050505DB54A59C9D210D617D7BD4923E8018B36D8C152EA5833EF39233AD80281DBAEEB0A5DCBDEE6EABE19499CD07763C10088712FCA433D783831611662C194034CF3614E35ED2682FF81C6B87AA9720B549A7EF6951A9FF7AE9988A27545C17558738BEE2E2C289FED6417B58873CB87196AF7AA2F57B26569C27B745132A67D409B6252547EADFD3EEF6095297FBCEBBA46597DAD7FB5B395FC3E7D4440398309F970C408A26F8BAC5F2791596FAEFB0B6977115E744F8BCD2B25F88747CA5EC6094FBF52D87D5F7254C4AD127F291F785865279EC9CABCFA9B3C35102E9C5AD2F0EDA012AC7DCCB6B8C32236C9FE2F643245C1A2CE90B699713D62E27629BCCCDCD3D43BDC63A6F8CBA6FEED9B32721B969DFBE7D667E7EBE3358A676861A3162C4D7AB57AF4E4AA85CB366CD1E5521AFBAED4B96CC01848449E9CC25344A902BAE2C0ECC2E4A91E54F7AF650CF404A232A3388BA53D7B394326329CFCBB1360C20524EA4BDB5D176A4B176A8FAEFA555475A5232FB587BAF68544B69748728EF8B654FAB84561560674BB1F7AAEE2F2AF5EDBD216FD070796DC1F0994B034B726BDFBB95CFA9E906304DF5790596679555CE0AF379A56DBF10BA0C560E77D06DF02D77DF12F41A3984E1C21B2EB44AB893F7B4BAA395795DAFEB02AB5B62ED17E4D8FE92774AEAAC9471F60B7AF58D3E3910FD02E80B699793D12EC74A2E3DA203DFCC993313929D66CD9AE50C95AFA4FC06307DFAF43103060C48CAAC65F7EEDD3F561F421EC132B17BA3A5149517598308BDD7B9BE10E7ECE02560EA8181CC56CAC91B4297B732804819B2E72E74294E8716B15F9B2B5C87DA3E86BDC2A9DDC195FAEF08EC212DAB7C5FDD7FB8DE8E6E4265BEA3D3F3072FC7A9EC1BAE43D44B70D563DB544758E5DC4BDB71D853BE5F5E7AEDE7BDC72EDAAB3ACC917C4E4DFBF936F5E7A5DF5F58EADBE1F8BCD2BA5F70B6DDCEF67CD0F241412754D3E1538AF38CE20D1D63A957AC84EB53E498FABB56DDD5E02112D217E8552D126EA59FA86FA92EFD02E80B6997532058B6D1A14F662D9BFA243EF2FBE4F73AAEA1991E196AC89021FBE7CF9F9FD050F9FCF3CF6F97D9CA189739102C1B71BCA5F374F2F5054B39D64696CECAB18E32D3A95F2F3396E15ECF0022E53A54E7490C9C1D632C177C8EF4BEB4BDF07351596547E9B8A4B3B23B3AEBB804E9F0E4E77E65FEF31BEE102B8DE0905A7BDC48B8634342DF1FFA39DD36E6C5EFBA8F7EEE1D3EA7440E609AECF392E73E93E37C32A55F6811E1046EB203519EFBE59F7E19B4FC55074C7D9928BD43506629C3B5F391765686165905A357CAE44FCE0FDA21AA67546F1C7C639DB398D32F80BE907639D1ED723C54B6F1EBE0575C5CDC64971E914B8CC8C49F73B6326D32D4DCB973FFDCBD7BF7EF366CD8909050B969D3A643797979BB55D23EDF8D5FB2640D20F4F193A79F7FBA15D89C7B9CE5F14BFE7E49E0BE84483D9B2817BE96E5AF1244F5E547F49E6D7D5F4E08C4002265852E053AC2DECB1AEB69D343DFD72A5D3B52E9C86A97BF2E38C1D151050E7897E334ECC7C6C7D42196F93B37D8219656AE759E81D6B9A7F62FDE0107F89C92388069E4E7A5063093D3BD5F9013AFC909D3E4B8FA48AF919D85D20EEB338AEB223B1AF5D9BCDBDCD326A6101BA95F90A24F30E73CDEDE792E80641782257D216D2CED722382E5D9AA7CAA03E0F0E1C31B1D2E25548E1A35CA192ABF48BB0CF5F8E38F3F2A27F2D9B56B5793864AF97D9D3A75DAE3C625B0CDB567DAB9C7B9A1D748F08BE5F50C20D2A6436D8ABDBF6979C63B396B5C51A96F55988E2EE84C6A4565953D42672EC32CE1591F746AF489FED68DE9103B0C7DF2453EA7440E609AF6F3CA8460492158BA3C5CD2C6D22E279CC7E3C9D127F2D13397F12E8B95F785CC549A699BA19E7CF2C939122E9B6AE672D3A64D66972E5D3E53153EC8CD5F3206100C20D2AC434DCB0B3EEB13F5C812D8081D5D9D5374CB0906EAEB100BCBFC9EA03DADF619EA22758872065A7D9220E93C5507581D784ECE6A376ED98FDDFE3925720093A0CF8B7E817E01F4857041BBDC182A001638C3A51C1B2927F491B3BA467BF65739518FF3984A29699FA1A64E9D3A5185C1EFE498CBC69CD067C18205FFEDD0A1C36752D16EFF923180600091448D5DB293914B7E9C9D59B41D6283AF0BE9108B26F83BE8E7F429D4F5F5B7E47ECF49FEE3D5CF6DE5B19F9D7FA597CFA969073089FCBC123190A15FA05F007D21ED726AB5CB8D253397AAEC730643098A729DCB254B9658B3917A99AC2C77DDB66D9B59555565969696CAE5188302A52C7FCD980C3565CA942B860C19B25BA662DF7AEBAD9802E5DAB56B650AF7B3F6EDDBAF74EB31950C201840A448871AEB5ED68C3D39416D47E71B1C658718F6E2C3D2A1C9125B6B0FAAB51CC73F5C3F573C69E9997A59ADF31892DB1E7EE564E735B9A42394F7C97D3EA7261BC024EBF3A25FA05F007D2132B85D6E0A72CCA5F332247196573232433DF4D04377297B6579ECA38F3E6AAE5CB9D2DCB16387595353638548B9956328257CCA746FAF5EBD6ABA76EDFAAE246C379EFD95010403881412EB129E8C5EF213CB1ED4704B6935E77531EBBCAFD43F5BEE179656F6D6AFB1CE60575A39D5BAFE96FA593A55F91DD281F23935CDE79AE4CF8B7E817E01F485C8D076B98903663B3B601E8C2550BA22433DF1C413973EF0C0034F0C1D3A7463B76EDDBEC8CBCBFBD69EDE3DD4B973E72F54F05CADCA2849E97CA51840308048BB0EF57255BE68C1059FF99C40BF40BF00DA58DA5834199595CE5001B3AFCA48CFAAF2B12A358E20B95595F9AAF42743810104038874D0CAEE285BD5F3FCA774A47C4EA05FA05F006D2C6D2C12CF0E9326AB3BC1008201443A8AB4B796253F7C4EA05FA05F2058D2C6D2C622493C1ECFD57A79AC61181CC70B06100C2032A243A523E57302FD028560491B4B1B8BE406CBB98EA5B02BA9113080600091EE1DEA383A523E27D02F50E81768636963913C2A485E1E7A321F1534D9FEC000820144DA926517FA5217E07302FD02FD02FD026D2C909C60393FCC99605772AC25184030804867275105E9F13949A74335D02F50E817401B8BB40F959747BAF48861189C340A0C2018400009EF88D85EE91728F40BA08D45FA6F6B0BEBB97EE5726A080C201840000C7A40BF40BF00DA58A0BEED2CE26C25C75A820104030880410FE817E817401B0B44B39DCDAF2F54728658308060000130E801FD02FD0268638198E4E7E7FF406D7B5F52136000C1000260D003FA05FA05D0C60271C9CACA3A5E6D7B5F50136000C1000260D003FA05FA05D0C60271B9E5965BFE9F6118FBA909308060000130E801FD02FD02686381B8E4E6E69EA0B6BDCFA909308060000130E801FD02FD02686381B86465659DA8B6BDCFA809308060000130E801FD02FD02686381B81414149CE4F178F651136000C1000260D003FA05FA05D0C60271F17ABD27AB6D6F2F350106100C2000063DA05FA05F006D2C1097ACACAC1FAA6D6F0F350106100C2000063DA05FA05F006D2C1097F6EDDB9FA2B6BDDDD404184030800018F4807E817E01B4B1405C0CC3F81FB5ED7D4A4D800104030880410FE817E817401B0BC4252B2BEB476ADBDB454D800104030880410F1A6D71C562DAE4D42835AA5F38C816491B0B248B6118A7A96D6F27350106100C2000063D68B4054B17EC98BA792AED723397C73E7CEC69D52FAC638BA48D0592252B2BEB74B5EDEDA026C000820104C0A0078D56EE2BFFFBCBFE973F537DC3D7B4CFCDB3A3D1EA132ACA37575454B4638BA48D0592252F2FEFC76ADBDB4E4D800104030880410F9A846A8F5A979797AF949514B24C9F92D42275BE8E3E8136965A40336C773F51651B350106100C2000063D00401B0BC4252B2BEBA76ADBFB849A806B6567675F4F030C30E80100DA58207EB9B9B967A86D6F2B35013737BEAFA8F21D350130E80100DA5820EEEDEE4C55B6501370EB17A0A534BE520CC3F803350230E80100DA58207659595967A96D6F333501B736BC7E47B02CA74600063D00401B0BC4CEEBF5FE4C6D7B9BA809B88E0A92AD74A864D61260D00300B4B140A3B6BBB355F9989A801B37FE574283A52AF3A91980410F00D0C602B1C9CACAFAB9DAF63EA226E0B606B75D98506915AFD77B09350430E80100DA58207A6A0C7D8EDAF6AAA909B8ADC17D2752B0340C6316350430E80100DA58207A595959E7AA6D6F233501D750C1B14DA450A98BC7E3F935350530E80100DA58203A5EAFF7976ADBDB404DC03554685CD350B054E5596A0A60D00300B4B140D463ECF3D4B6F7013501D7320CE37FD497E0536A0260D00300B4B1407CB2B2B27EA5C6D5EBA909B8567E7EFEA9AA01FE0F350130E80100DA58203E2A549EAFB6BD75D4045C2B2F2FEFC7EA4BB09D9A0018F400006D2C101F8FC77381DAF6DEA726E05A5959593F555F824FA80980410F00D0C602718FA92F340CE33D6A026E6E7CCF54650B350130E80100DA58203E2A545EA4B6BD77A909B896D7EBFD99FA126CA22600063D00401B0BC4472ED727D78AA726E05A5959593F575F828FA80980410F00D0C602F1C9CDCDFD5F152ED75213702DF505F8856A803FA42600063D00401B0BC4C7308C8BD5B6F7363501D7F27ABDBF545F820DD404C0A00700686381F8783C9EDFA86DEF2D6A02AEC5C55C01063D00401B0B347ABBBB549537A909B816D7DC0118F400006D2CD0E831F56FD5B6B79A9A806B716A6480410F00D0C6028DE3F57A2F53DBDE2A6A02AEC519AC00063D00401B0B347ABBBB5C9595D4045C8B038D01063D00401B0B347A4C7D85DAF6DEA026E0E6C697038D01063D00401B0B3482D7EBBD526D7BAF531370F39780F5E000831E00A08D051AB7DD5DA5CA0A6A02AEC5B43DC0A00700686381468FA9AF56DBDE726A026EFF12B0770560D00300B4B1409C0CC3F89DDAF65EA326E0E6C6F71A55AAA80980410F00D0C6028CA981B81886F107F52578859A0018F400006D2C109FECECECDFAB6DEF556A026EFE12FC4985CBA5D404C0A00700686381B8B7BB3FAAB28C9A809BBF042D55F1531300831E00A08D05E2C3640D5C4F7D01FE4F35C095D404C0A00700686381B8C7D4D7AA6D6F093501D7CACECEBE5E7D11CAA90980410F00D0C602716F77AC0284BB793C9E1BD497E0656A0248EEA0A7A8B4F286C2B2CA595699E07B4A4ADF327F1B5D821E2BF599AAFCC7F93BE4B1C252DF72FDBA7045BF57DD7FA8BE7F4FE178DF55F2BA3EA5CB7EC4A703806009C42E3B3BFB3AC3307CD4045C4B7D015AA906782135012477D05332DD7F5CB8E7EC10F96E43BFC30E96B747F33A559E773E2601B26F996FA994E0F0EA5F60DFFF5295CFF8A400102C81A8C7D41C5E0677F37ABD7FF3783C2F511340F30F7A8A4AFDD74BC02B9E50715D54C1727CC5C58513FDAD4367298B26F8BA59BF6762C579725B34A17246E8FB4B4A4A8E3C1C50FD77587F7F5CC539B5AFF7B772BE060008964083DBDD9F55A9A026E05A2A54B6565F82F9D404D0BC839E9292D9C7DAB38B512D49D5C152DED7D0EB9C3396125A55809D2DC59E9DDC5F54EADB1B58365B56392BB024B7F6BD5BF9C400102C81FA71DE12D0F8E6E4DCA2CA0BD404D0BC831E3D731898692CAB7C5FDD7FB8DEC038A132DF111EFDC1CB5A2BFB860B967A09AE7A6C9B0A9455E18ECB2C2CF5ED50C173249F14008225101D152AFFA2B6BDC5D404DCFC2568E3F178E6521340F30D7A8ACA2A3B4A0094D06707C6FE56F853C1517EEE57E63FBFE16059690487D4DAE32FC31D6319FAFE30CF7D26C75FF24901205802D1E18498E04BE0F1B4555F8239D404D03C831E0984B5CB5F179CE0087CFD03A17382BF95FDD8F898826599BF7383C1B2B472ADF30CB441339E65BEC97C520008964074BC5EEF5FD5B87A1135013737BEED5479969A00923FE891B3AF1695FA5685098CFD9D8F159555F6089DB90CB314767DD0254626FA5B132C01102C81E4E04A0BE04B6018D9EA4BF00C350124F37BE7B54ED2234B60C306BE906029E4443D615E17089685657E8FF3397DA6D748C152CE40AB4F1224215405C9EAC0737276D871CB7ECC270580600944872B2D8001AEA21AE07F5113406A0C7A9CA1B03EF51D2359E77521C1B26882BF837E4E5F8A445FC752EEF79CE43F5EFDDCD67A8C800980600944B3DDDDA4CA8BD4045CCBE3F1E4AA6C39939A00522758F69DE01B1C65B0EC1FEE390986B2C4D69A89B496B5FA87EBE78A272D3D532FAB751E8B79DBC3AF9CECBCB6A5044A799FDCE7130340B0041A1C5373093FB8BEF1CD57E5496A0248A56019DD4C64B8A5B49AF3BA9875DE57EA9F2DF70B4B2B7BEBD75867822DAD9C6A5DC752FD2CE1547E8704513E3100044BA07E8661DCACC2E53C6A026EFE1274500DF0E3D404C0A00700686381B8B73BAE0D0F77F3783C1D55B87C8C9A0018F400006D2C10F798FAEF6ADB7B9E9A809B1BDFCEAA3C4A4D000C7A00803616888F61186D54B89C4B4DC0CD8D6F5755A6501300831E00A08D05E2DEEE6E55E5396A02AE651846778FC7F34F6A0260D00300B4B1407CD478BAADDAF6E6501370F397E036F52578989A0018F400006D2C101FC330FEA1C6D5FFA626E0E6C6B7972A13A90980410F00D0C602716F77ED5479969A806B1986D1C7E3F194521300831E00A08D05E2A3C6D3596A5C3D9B9A809BBF0485EA4B309E9A0018F400006D2C10F776E751E5696A026EFE1214A9F210350130E80100DA58203E1E8F27C7308C59D4045C4B7D01FAA92FC283D404C0A00700686381B8C7D486DAF6FE454DC0B554A81CA0BE0763A80980410F00D0C602716F775E559EA226E0E66039487D09EEA32600063D00401B0BC43DA6CE350C632635013737BE77AA328A9A0018F400006D2C101F152AF3D4B637839A809B1BDFBB5419494D000C7A00803616887BBBCB57E5496A02AEE5F17886198631829A0018F400006D2C10F798BABD1A533F414DC0CD8D6F892AC3A90980410F00D0C602F151A1B283DAF61EA726E0E6C6F76E5586521300831E00A08D05E2DEEE0A54994E4DC0B50CC3B8C7E3F10CA12600063D00401B0BC4478DA73BAA71F563D404DCDCF88E565F82C1D404C0A00700686381B8B7BB4EAA4CA326E0E62FC17DAADC414D000C7A00803616888F61185D3C1ECF546A026EFE128C515F8201D404C0A00700686381B8B7BBAEAA4CA126E05A2A543EA8C2653F6A0260D00300B4B140DCDB5D375526531370F397E021558AA80980410F00D0C602F1310CA3BBC7E3F9273501377F09C6AB2F4121350130E80100DA5820EEEDAE872A8F5013702D152A4B55B8EC434D000C7A00803616887B4C7D9BDAF61EA626E0E6C677A22ABDA80980410F00D0C602F1310CA3A70A9793A809B8B9F17D58F6B0501300831E00A08D05E2DEEE7AC9840D3501377F0926CB59ACA80980410F00D0C602F1F1783CBDD5B657464DC0CD5F82A97241576A0248D80067BE0C721A282BA929002058227DC9394BE4DC25D404DCDCF84E53A513350124EC3B76B92A07EB0B96AA236A4D4D0100C11269BDDDDDAECA046A026EFE124C57A5809A0012FA3D5B584FB05CDEB265CBA3A925002058227DC9E5FBE4327ED4045C4B7D019E505F84F6D40490D041CEE59182A5FA0EB6A18600806089B4DFEE8A5479889A809BBF0433D4C0368F9A0012FE5D0B77ACE54A662B01806089F4E7F1788AD5987A2C35013737BE4FA9E2A52680847FD7EA1C6BC9B1950040B0446650A1B29FEAD71FA426E0E62FC12CF525C8A12680C453DFB5B9CC560200C11219B9DDF557E5016A026EFE123CA3C2653635012425585EED38B6B215350200044B644C1F3F40F5ED63A809B8B9F17D569576D40490B4EF9C75AC25B3950040B044E650A172A00A97F753137073E33B477D09DA521348752566C9D133D7CF7C76DE6BF3BE5D5CB1D82C2F2FA724B948BD2F5CB270F762FF624EF805806009046F7777A8721F3501D79263BEB8DC01D28184CA05CB169853374F35C7EF1D4F69A63279EB6473D192459F575454B0D20100C112383CA61EA4C6D4F752137073E3FB822AB750134875325349A84C8D3265CB9403E5E5E5EBD82A01102C815A2A540E56DBDE686A026E6E7CE773C903A403598649A84B9DA282E541B64A00044B20B0DDDDA9CA286A02AEA542E54B5EAFF76FD404529D1CE347A04BA960C9C00D00C112383CA61E6218C63DD404DCFC2558C4650F9049C172CAF6B166C58AA1E6CAF2415691FBF218619060098060092470BB1BAACADDD404DCFC2558AC82E55FA8096442B09CB2FD4173F5A281E6DB2F0D082AF2983C472024580220580289E0F17886A931F5086A026E6E7C2B54F93335814C0896F3DE1A512754EA32FFADBB0984044B00044B2051DBDD70554AA809B8966118BEECECECEBA8096442B05C5E393862B094E70884044B00044B2041DB5D89844B6A026EFE122C51E1F25A6A0299102C572EBE2362B094E70884044B00044B20116419AC2C87A526E0E6C677992A7FA42640B0A4102C01102C81B8B7BBBBE5043ED404DCFC2578353B3BFBF7D404322258960F8A1C2CD5730442822500822590A0ED6EA42A77511370F397E035C3307E474D201382E5B2654322064B798E4048B00440B0041241AE6129D7B2A426E0E6C677852A575113C8846039A3FA3E73D5CB7597C3CA63F21C819060098060092468BB1BA5CA9DD404DCFC2578C3E3F15C414D201382A51578560CAB132CE531C220C11200C11248E07637DA308CC1D404DCFC2558E5F57A2FA3269009C172C29EF1E69257EFAA132CE531798E4048B00440B004124185CA7B3D1ECF206A026E6E7CDF54E5526A02E91E2CA76C7FB0C1632CE535844282250082259080EDEE3E55EEA026E0E62FC15B1E8FE737D404D23558CA4CE49CF7EE31D72C1C183154EA22AF91D7327B49B00440B0049A92611863D4987A003501D7525F80B5B9B9B9FF4B4D201D836543B394CC5E122C01102C81246D770FA8D29F9A809BBF04EF1A8671113581740C96D1CC52D6377B49402458022058024DC1E3F13CA8C6D4FDA809B8B9F17D5F7D112EA026908EC132DE50A90B019160098060093405152AC7AA31753135013737BE1FA82FC179D404D231585208960040B0448A6C770FA952444DC0CD5F828D595959E752132058520896000896407C3C1ECF38C330FA52137073E35BEDF57ACFA12640B0A4102C01102C81F8A850395E85CB426A026E6E7C3F56E56C6A02044B0AC11200C112887BBB9BA0CAEDD404DCFC25D89C9595751635018225856009806009C4C7E3F1941A86D1879A809B1BDFADB9B9B9675013205852089600089640DCDB5D990A97BDA909B8F94BB04D959F5013205852089600089640DCDBDD44557A511370F39760475656D6E9D4040896148225008225101F8FC733C9308C9ED404DCDCF8FE273F3FFF546A02044B0AC11200C112887BBB7B44951ED404DCFC25F8D4308CFFA12640B0A4102C01102C81F8783C9E7FAA3175776A026E6E7CF7646565FD909A00C19242B00440B004E2DEEE26ABD28D9A809BF7AEEC2B282838899A00C19242B00440B004E2DEEEA6A8D2959A809BBF049FE7E6E69E404D806049215802205802F1F1783C530DC3E8424DC0CD8DEF17595959C7531348052D5BB63C9A6049B004008225D270BB7B5495CED404DCFC25F8EAE69B6FFE3E3581E66618469E0C06546947B024580200C11269B6DD4D53A5133501377F09FE5B5050701C3581E6929595756EFFFEFD5FFDF0C30F77EEDEBDBBA277EFDEABD4765916BA5D122CD32F58AACFF1728FC73397AD1C00C11299CE308CC7549FD7919A809B1BDF6FBA75EB760C3581649365AFF9F9F9C3E6CC99B3FBD0A14335E661FB5E7AE9A5C57979792B2474122CD32F584AA05465BE2A0719E0012058C225DBDD74550AA809B8F94B70480DDE8FA226904C8661FCE1FEFBEFFF68EFDEBDBBCD08F6EFDFBF7ED0A041DBF4D2588265EA07CBD040A90B5B3C0082255CB0DD3DAEC6371DA809B8F94BF09DBA39829A4032C8A56DFAF6ED3BF3CD37DF8C1828431C5CBC78F1B6AE5DBBFE73D1A24504BA140D961E8FE76A59F21A1A280996000896700B152A9F507D617B6A02AE6E7C255CAAF2AD3D28FC468EBB54A5464EECA3CA97EA8BB25F2E4B22D7BC54B77B55D9ADCAA7AAFC47959DAA6C57456696B6AAB24595CDAA7CACCA47AA7CA8CA46553E50BF67BDBA7D5FDDBEA76EDF51BF6FADBA7D4BDDAE51B7AB559163EBDE50E5755596ABF29A2AAFAAF28A7ACF5275BB44DDFAD46DA5BA2D57B78BD57B17A9DB85EAF62575FBA2BA9DA76E5FB007B9CFA9DB7FABDB6755794695A755F9972A4FA932439527A51190A50BB22E5ECEE625A78A960BDCAADB7FAADB87D5ED2439DE4FDD96AAD78C57B7E3D4ED5875FBA0BA1DA36EEF57B7F7AAD78C56B7F7A8DB91EA7684BA2D51CF0D53B743D5ED10757BA7BA1DA46EEF50B703D46D7F755BAC6E8BD46DA1BABD5DDDF656B7BDD4ED6DEAB6875C6457AE872467189383C165DDBEEC0993464B4E74A36E73D5ADA16E73D44DB6BACD52B7FF50B76DD56D1B75FB77757BB3BA6DEDF57AFFA66E6F54B77F55B7376467675FAF7EE79FD5ED75EAB6A5BAFD93BAFDA3BAFDBDBABD468282BABD4ADD5E611F27F75B757BA9BAFD8DFA9D17ABDB5FABDB8BD4ED05EAF67C757B9EFADDBF54B7BF50B7E7646565FD5CDDFE4CDD9E959B9B7B86BAFD695E5EDEAF264F9E6CD6D4D41C3263B47FFFFECF1F79E411F3BEF5F711EA522858469AA10C2D72BCACDA06FE3F3951587E7EFE0FE44CD4B7DC72CBFF934B1DA9FB274A919D0E6A9B3959DDFF61FBF6ED4F51DBD5FFA8FB3F92A2DE73AAFAF93475FF74B51DFD58FDCE9FC83625DB9614F5F399B2ADC936A7EE9F6D6F7FE748916D529654DBDBE779EAFEAFEC6DF60229EAE70BED6DF9D7EA77FDAFBD7DFF468A7ACF25F676FF5B75FF32FBBB7085BA7FA514FB3B72B57ACFEFE47B23DF1F998D97EF92FD7DFA93FAF95AFB3B769DBAFF7FF2BDB3BF7BD7AB9FFF22DF47F95EAAFBADECEFE8DFA4A8D7DC24DF5DF90EABFBB7D8DFE73652D4CFB7DADFF37FC88CBEFDDDCF56F73D52EC36C150F7BD763B2127C6CA9762B71F1D64B996B429D2B6481B23A7C89762B739DDD4FDEED20E497BA4EEF79462B74FBDD5FD3E769B55A8EEF79576CC6ECB8AD5CFFDECF66D80BA3FD06EF30649513F0FB6DB426913EFB2DBC761765B395CDA4DBBFDBCDB6E4BA54D1D6597D1765B7B9FDDEE8E51F71F9062B7C763D5FD87EC367ABCBA3F41DA6D29D286AB32D16ECF1F56E51169E3ED765E2E683EC56EFBE58C8ED3ECFE60BA5D1EB7FB8927A5DF50F767DA7D88F425FF523FCFB2FB9667D4FDD9D2DF48BF63F73D73EC7E48FAA3E7EDBE699EFD9D996FF759D2772DB0FB31E9CF5EB6CB62BB9FABB0FB3CE9FBFCD20FDA7DA1F489CBA47FB4FBC92ABBCF7CCDEE3F57D87DA9F4A92BEDFE75B55DDEB4FBDDB75479DBEE8BDFB1CBBB761FFDBE2AEBEC7EFB035536D865A3DDAF57DB7DBCF4F59BEC7E7FB33D0690B1C027F6B840C6073BECB2D31E37ECB2C7103296D8638F2BF6DA638CCF64BC618F3BBE9031885D643CF2B53D369131CA017BBC72D02E87EC71CC77ECD042338EA9A59DC8A726E076479494941C29C7BCC9F19637DE78E3F76420A807817A00A8077E7AD0A7077B7AA0A70778CEC19D1ED4E9019D1EC8E9419C1EBCE9819B1EB4E9C19A1EA8E9019A1E9CE941991E90E981981E84E9C1971E78E941971E6CE98156C800ABB33DB0B206557A40A507527A10A5074F7AE0A4074C7AB0A407497A80A407477A50A407447A20A407417AF0A3073E7AC0A3073B21831C3DC0D1031B6B50A307337A20A307317AF0A2072E7AC0A2072B8E418A1EA0E881891E945883113D10D103103DF8700C3CF480C339D8D0838CEDC3870FDFB775EBD6EF620D96FBF6ED334B4B4BADC142AA86CBFB36DF270319B3F38CCEE643BB1E327F78D60FCDF3AE3DCFBCD27BA555BA3DD3CD7A3EF47DF2D82D77DF12F1E7140F96D1961A7B50F8953D48FC42EFB0B207929F39765CED71ECBCDA6517BD136B876347D627F6B6E5DCA1B5C9B153ABDA2E7AE7D606C70EAE75F6B6AB7774BDEBD8D9F5B6BD9DEB9D5E6F3A767CAD74ECFC7ADDFE8EE89D60557A4798FD5D5AA67788D9DF316BA7981D142AF4CE31F93EEA1D64F677F425BDA3CCFEEE5A3BCBECEFF35CBDD3CCFE9E5B3BCEEC40A3779E3D6DB709D64E34BB9D98610F78F4CEB4C71D3BD4A6E99D6A76B89AE2D8B9F688DEC16687B2897A479BB4597A679BB463765B66ED74B3DB376BC79BDDE6DDAB77C0D96DA1B513CE6E1F47E89D71D26EEA1D72765B6AED949362B7B1D6CE39BBDDB576D049B1DB636B479DDD465B3BEBA4DDB6DB6E6BA79DDD9E5B3BEEA48DB7C3B3B503CF6EFB033BF1A45F90A277E6D9FD85B543CFEE430CBD63CFEE5BAC9D7B767FF30FBD93CFEE87AC1D7D76DF64EDEC93227D96DEE967F763D68E3F29D2BFE91D80769F67ED04947ED0EE0BAD9D8176FF68ED10943E538ADE3168F7A5D6CE41BB7FFDADDE4968F7BBD68E42BB2FFEB5DE6168F7D1D64E43BBDFB6761C4AB1FBF3C00E44E9EBF54E44293206D03B13655C20E303D9212445C60B326E909D45328690B184EC48927185141963C84E26196FC8B8437640C918448A8C4764E7948C4D648CA2EE1F2BE31519B74891437A641CD382155868DE19CB99D246501340924907D0AFCC7F7EDF327F1B5586F72DF599AABC1BE9F545E32ACE91D7C87B02BF63BA3F70D6D0BE65BEDFDBBF635A437F5B5E5738C1F75043AF2B9CE86F1DEEF19E93FCC75BBFA3AC328B4F32762A271E5D5555B5E8BFFFFDEFB7D184CAD75E7B6D5BE7CE9DBF1C366C9879EFBA7B533A6C0D583AC03CF1F413CD71BBC75901F1AE557759B75963B302A151BFF6ACDF9E15089BB98FE49A3F38E507E6C057065A3F5FD4EAA2C073F23B527D29AC3D005E1E2958B2D5038D57545A7983EA7766596582EF2929761F6A95A0C76AFBC3FFD4E9FB4A7DCBF5EBC215FDDE86FAC8C2F1BEABE4757D4A97FD884F06A865AF66F052134082158EAF38AD4F69C585B74FF05DA63AA3B685657E8F744A45A5BE31CE8068EF710CB05FFFBCEEEC8A26F8BAA9DBAF5579BDA8D47FBDDD013E553CC1F7B7A2872A7F5A52E23F3A9A60D97782AFB8E1D7F9736B3BCE0527149556FC51FDED7FD7FE3B2A0DBBD37EDED181BFCEA71C9B59B366B5ABAEAEFE3A52A0DCBE7DFB7F478E1CB94B6629644F76BA9DBC474261FBA9EDADDB5FFEE9976651795150B01CF6F630B3EBACAE8160F9F32B7F6E767FB6BBD9615A87C0FB3B3DD129AD4EDE23B32EF68C1DC1126862CEBEB24E9F56CF8ED99060797B547DA4EADF9C8F4980EC5BE65B2A2538BCFA17D8F7BF54E5333E25B83C58CA2A32839A0012A86892FF5CD5E12C9212668FEA8B819F2754E6EBB0793868FA8F2E9AE06F253396D6EF52F7E535DD26CFFFBE7ADDB5A1B39875FE76ED6B16E93DBC81805AEAAB72FCDDFEEAB16FEA74E2EA6F174FAC38AFF6FEEC6325BC3A83A50AC79DD5FDBED67D159CF9A463274B9DE6CE9DFB5A4D4DCD411D28BFF9E69BEF9E7FFEF9AD1D3B76EC204B9CF46B533958DEB3E11E6B86F198E38EB102A40E8639A53981E028B396CE6029AF6F7547AB40003DF2A823CDD6435B9BBDE7F7368B2B8BADC7257CA6E3E546EC19CC5708964082FB577B076BF1848AEBA20A96E32B2E96D538A1B394F64E5B53FABCDA9DB89533EAF689B53B7E6B03AAFF0EEBEFDBAB89A46F76BE067023390C4196C75313400249400B3793581B2C2B1BDCB32321D27AED38FF2556075656D9431EB796D2AA9F655633D27B0B4B7D3B0A4B2BDFACF3771D339676D8FCBAC1FF0F7B6F7160296C84A5B288DDDD77DF5D505555656EDCB871D7942953C21E9F90EA33967AF96B97A7BA0482A5CC4886CE62EAFB23DE1B61CD4ECA633FBEF0C756D094C7EFDF7ABFF5D86FDBFE366DAF63E9E864650673395B389088BE75F6B1F60EDAA896A4EA6029EF6BE875CE194B09AD2AC0CE9662F797FB8B4A7D7B03CB66CB2A670596E4D6BE772B9F0EDCC83ECEDD434D0049A03A9B4F55792574C6D2DA5B5A56D9517E76767812E46489A9F5BCA31393A5B4B5B38EB57B6AADD95039BEA4B4B2B73D1B796DE06FD6CE821E52B7E323CE585A4B78FCF3F47B6449ADFD6FEAA16723F512A0704B618BCA7C3DAD9F2756FC8E4F397ECED9C9740C96A16152EE174C2FB002A31C7739FAA3D141C1F2ECCBCF367BCCE9613D26339EA79E7BAAB514367F727EE0444052E47DE91A2C0124B44FB5660E03338D6595EFABFB0FD71B18559FE8088FFEE0FEB8B26FB860A977AAAAC7B6E9BE3374C65376E2AA3E79249F0A5C1E2CE5448AD9D40490A44E5085B3EA903D9B2F068263A97F41E87B824ED0E3E8148515F8A4439DB4F44CDD4986F99B9B5579AB6EE75A67C632E8D8106B4FB0FD6F94632C6B7F56FF76158C9D274B501DF15AD98BCBA79B78E9122C87AC1C623EB0E381C032583D03298FEB6039F28391D6996325745ED6EE32EBF694B34F31FFD4ED4FD67D99F594D7DEFED2ED693D63092031023B636B77C04ADFD8DFEACFEC434AC21D225237581E5E31E43CFE32DC3196E1FAE090E73E939DAF7C327033FBECFC9CD811485AB074063A47C7661DBF58EAFB32F43DB26C47661303338DD62C62ED718D72863CB9ED35B1E294A60E968EC74D99C13CFCEF0D0EBFF66BFEC3A74BB0741E5779DA79A7054ED62327E0915B59FADA22E47223B27CB69FAF9F75ABCF022BB772BCA53E890FC11240701F56BB6A46767A3A025FFF40E8B4CF45202B75620A9665FECE0D06CBD2CAB5CE33D006CD7896F926F3E9C0CDECEBA6B7A326806405CB883396FE91FAA43CCEF7C88900FA8E5BF6E3D08ECF19FCACD7440896F65EDD6FEA5B0A2BB3A5A1C761460E96F2FF50DBA9EA633399B124583A83A52C65955B999194DBBBD7DD6DF67AA1579D632C9DEF19B47C901528E5DA97E972D65B8225D02CFDE897AACF5A152630F60FE9FB7A84CE5C86590ABB3EE81223F679030896407CE4DAC2720D5B6A02485EB0FC7D482765ED319599C94827E1B1CF38D7A1760F6DC585FA843DCE33C8D63363B9BFCE2C63C88CA55C4A24DCC97B74672927EBD167A0959312102C099691CAD89D63CDA16F0EB596BD3A1FD7D7A7946B5786BB8EA584D11B07DF685DCBF2AF03FF6A3DAE03AA1C6F49B004DC4D9FA847769686ED5B4382A5EE57C3BC2E102CE5B25FCEE7F4995E23054B39AF813E49908450D9511C784ECE0E6BEF0406DC2A2727678E0A976DA90920D1A17262C5EF5427F69C55225D6EA4F6E769211DE315FAA43EB581D2FFEBDAE5B1F67258FB3224F67B2BA30EB8D15CC7F2F0BF69BF3E13AC5CCB32CC6BB6F109132CE3398B6C3AFFFB0996408AF4AF8E50D870DF17FE18C93AAF0B0996B273573FA72F45E23C3CC4EE23DBD69EC19D8009D706CBE754B9959A0012ACF69223C1D7B78A74B911BD1CF6B6875F39F9F05959F512D6CA1B0E77A4872FF41C69C6B231C152CF92AABF3D3CB413951306D9C7787EC98C25C1D28D856009A44EB0547DDAE0288365FF70CFD92B73565933918E7E4FF7777A59ADF39014E9A39DD7B6944029EF93FB7C2A70238FC733D7308C36D4049020766755157A8AF2C3B381FE79218F3DA167269D41547ED6CB52EDF7E5D60DA9BE89D176C27AEF6B7D64C94F6199EF96A0F7D94B6F45E178DF55CEEB6A826049B004D03CC132BA99C8704B6935E77531EBBCCFDE81AA2FEB6597CFFA96564EB5AE6369F7CFF23B2488F2A9C08D7272725E50E5166A0248A0862EC60C102C09960000A4338FC733CF308C9BA9090020585208960000C425272767BE0A97ADA9090020585208960000C41B2C5F54E5266A02000896148225000071F1783C2F79BDDEBF51130040B0A4102C0100884B4E4ECE02152E6FA4260080604921580200106FB05C6818462B6A02000896148225000071F1783C8BBC5EEF5FA9090020585208960000C4252727E765152E6FA0260080604921580200106FB05C6C18C65FA8090020585208960000C44585CAF2ECECECEBA9090020585208960000C4252727A75285CBFFA32600806049215802001017152A7DD9D9D9D751130040B0A4102C0100884B4E4E8E5F9596D40400102C29044B0000E20D964B0CC3B8969A0000822585600900405C54A85C9A9D9DFD276A02000896148225000071C9C9C959A6CA1FA9090020585208960000C41B2C5F310CE30FD40400102C29044B0000E20D96AF666767FF9E9A000082258560090040BCC1B24A956BA8090020585208960000C41B2C5F330CE377D40400102C29044B0000E20D96CB3D1ECFD5D40400102C29044B0000E20D962B54B98A9A000082258560090040BCC1F20D8FC77305350100296E71C562025DEA941A152C0FB25502001008962B55B99C9A008014B760E9821D53374F25D4A54079ECC3C79E56C1721D5B2500008160B9CAEBF55E464D00408A2BF795FFFD65FFCB9FA970F935E1AEF9662AFFFFF6EE36468ABB8E03782488A8B5A156A4B5A9ADB5D6A6565A35A6698CF1348D29A610129DECC371B889C9455B28B7D437C5946C62782349E9EE1E8D2410638C8AC4E4FA82B424ECED5A1A20C6A78AD807A56839D0A3553815E15A03EBCCEECEB2777060266CCD6D3E9FE49F9DDDDB79E037243FBEFC67E61AA1B2B2FBD54AA5F2157F2B01A01D2C7F954AA53EA91200B34018661ED8BD7BF72FA2CB30A37BFC66E3181919A9CFD6636FD5FD45A112002E0896BF0EC727540280AE3B7EFCF8974BA5523D6C3C37AB0600F48E542AF59B6C367BB74A00D055F57A7DFE8913274E86EA8383833B5504007A473A9D7E3E0C9777A904005D353636F6837ACBBE7DFB8E653299E5AA02003D132C7F1BF6F6C52A0140D79C3A75EAAEB367CF9EAB77D8B061C3582E975BA03A0030FBA552A903FDFDFD1F570900BA667C7CFC707D9A898989F1B0011555070066BF743AFDBB305CDEA9120074C59123471EABCF60646464DC2F5306809E0896073399CCC75402802B2ECC8ED74D4E4EBE3953B03C77EEDC1BF97CFE405F5FDF5CD50280D92B0C95BF0F82E00E9500E08A3B7AF4E8FEFA651C3E7C782C6C4643AA0500B3573A9D7E31ECE7B7AB040057DCDEBD7B2F972BEB67CE9CF959D88CEAB95C6EBE8A01C0EC1486CA978220F8A84A0070C5AD5FBFFEA14B5D0A1BE5CA75EBD6FDC48C2500CC6EE974FAE5542A759B4A00D015DBB76F7F79A65479E8D0A1EF868D68BF7B2C0160D607CB3F64B3D98FA804005D1104C1AD61803C739107F71CECEFEF3FE8A9B000D013C1F28F51CF570900BA66E3C68DE530489EED0C965BB76EDD964AA536A90E00F444B03C14F6F50FAB04005D135DEABA6BD7AED7E250393131F1A3E87F3673B9DC02D501809E0896AF64B3D95B540280AE5AB56AD5174E9E3C39198EFAE0E0602593C92C571500E89960793808820FA904005DB765CB96674AA5523D954A8DA80600F454B0FC53386E560900BA2EBAF435FA9D956EEE07809E0B967FCE66B337A904006F55E3A9AB0200F45C7F7F3508820FAA040082250090B4BF1F09C78D2A018060090024EDEF478320B8412500102C0180A4FDFD58383EA0120008960040D2FEFE97152B565CAF120008960040D2FEFED72008AE530900044B0020697F1FCF64328B540200C1120048DADF8F0F0C0CBC5F2500102C0180A4FDFDB5200816AA040082250090B4BFBF9EC964DEA7120008960040D2FEFEB7952B575EAB120008960040D2FEFEF72008DEAB120008960040D2FE7E229BCD5EA312000896004022A954EA642E975BA0120008960040D2FEFE8FFEFEFEAB550200C11200482493C9FC73D9B265EF510900044B0020697FFF57100457A9040082250090B4BF9F1A181878B74A002058020049FBFBBF972E5DFA2E950040B0040092F6F7D34110BC532500102C0180A4FDFD4C2E979BAF120008960040D2FE3EB964C99277A8040082250090B4BFBF1104C13C950040B0040092F6F737070707DFAE120008960040D2FEFE9FBEBEBEB92A018060090024EDEF670B85C21C950040B0040092F6F773E1CBDB540200C11200D0DF01981D8DC7300CC3308CDE1BFE95030000000000C07985426DEE50B9B63C1E6B8AD51F36964BD5C9A1F2E80BFFCB36D63C51591C6DA7B9BDC29CCE87B384DBA9E74BB56F47CB8F946BB75FB0EE70ED818B6DF3C1CDB5ABA275D79447834BED3BFE4EF8FA7A389E6C1D7BFDE162F553E1EBCED6FBB1700C3BDB0000005D0B9785399D21AE15C67647A12F0A9AF18843DBDA62E5F3D382E5A2E8F3706C8BC35E1C4A1BCBC3957BD76E7EF6C6E6E7D5C7A606C35A7FF4F9EAD2D357E74B95CFE68BD59F36F7339A696DF3A978BFE1F8F9C58265B8CDCF34026CB13AD80E9B4F54EF89C269FB3BA56ACD99060000E8A256F87ABE15E24EE74BB51D71E0CC6FAADCD20C90D57B9A3390D5CF4D5F3FFCFE7D0F0D57AE5D5DDAB3B050D831AF19EE2A8B5B3396F735835FEDFE0B436D6DEEDAE1CA6DCDE51DF3D616AB5FEA0C966BCAB5AF85CB43ADED2DEA5C7775A972473394EE59D8F879A9FA703B58B6963BFE6C3B9D650000802E07CB30C4A51ACBCD7079AC1DCA36D5EE6E04CBD2E8AAE812D9F3A1B03027BFB976EBD48039FAC530D4ED0FBFF7FD8E99C697E2E5301C7EFA52C751F85E6D7EF4DABE1476864B653B02E3A98EE5B1F63E872BF70E95ABCF761CC33667190000E0FF142CF3C5DA57DBDF29561F9FB25E7174209E358C66365BF7365E1008E359CC6826B211401F1FBD21DA4FBE3CFAF57836B21904E33038F552D87CB9FA601C18A3F5DB97D6761C673C4BB9A65C5D1607DFC6BE8AB5FBA7CF76020000D0856039FD52D8E8F36F3CF9DC35EDE0D7113EA7AF1B5F8E3AB469CFF59DB394F1BD99AD07ECB4673FDB61B335A318DD63D97C5F7D257CFF5CE70385C29079203E9EA9C73B9A892E956DBF2F561FED7870CF531DF7674EE44BD5EF38CB0000005D0E96179BB1EC089D13D1ECE44CEBC7C1320EA2D14C64E7CFDBF75D4E7BCA6B1C2CA319CCF3FBAA3D7D91EF1C8FDF3F323C7A53637FADD0D83EFE69F755C6F76E364367ED5BCE320000C05B1B2C1B612C7A204FF4B4D5F8E9AB975A3F0C9EDF6C2F97475FB8DC8CE5CCC1325A7FCAAF3E393D7DC6B263DD89F3FBAF3E9A2F557F19EEEBC7D1BD9CD1A5B951B86CCE62D6EE74967BDF7F01C2B8EC92D1A67BA30000000049454E44AE426082, + 1); +INSERT INTO `act_ge_bytearray` +VALUES ('302558', 1, 'var-baseTask', NULL, + 0xACED000573720018636F6D2E6C656E2E656E746974792E557365724C65617665B811E59153A6CD0702000C4C0009626567696E54696D657400104C6A6176612F7574696C2F446174653B4C000863726561746542797400124C6A6176612F6C616E672F537472696E673B4C000A6372656174654461746571007E00014C0004646179737400134C6A6176612F6C616E672F496E74656765723B4C0007656E6454696D6571007E00014C0002696471007E00024C000B6F70696E696F6E4C6973747400104C6A6176612F7574696C2F4C6973743B4C001170726F63657373496E7374616E6365496471007E00024C000673746174757371007E00024C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E000178720017636F6D2E6C656E2E656E746974792E426173655461736BA48CBC2F51BC802602000D4C0008637265617465427971007E00024C000A6372656174654461746571007E00014C0002696471007E00024C001170726F63657373496E7374616E6365496471007E00024C0006726561736F6E71007E00024C000673746174757371007E00024C000B7375626D697474696D657371007E00034C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E00014C000775726C7061746871007E00024C000675736572496471007E00024C0008757365724E616D6571007E000278707070707400043230313874000331313170707070707400352F6C656176652F726561644F6E6C794C656176652F343332303730666331663532633063633137376164393031613561616338643174002035393436613938356637333363353766316162373136383966376236616565617400087A68616E6773616E7372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017FDB8E2400787070737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000037371007E000C77080000017FE5DADC00787400203433323037306663316635326330636331373761643930316135616163386431737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A65787000000000770400000000787070707070, + NULL); +INSERT INTO `act_ge_bytearray` +VALUES ('302560', 1, 'hist.var-baseTask', NULL, + 0xACED000573720018636F6D2E6C656E2E656E746974792E557365724C65617665B811E59153A6CD0702000C4C0009626567696E54696D657400104C6A6176612F7574696C2F446174653B4C000863726561746542797400124C6A6176612F6C616E672F537472696E673B4C000A6372656174654461746571007E00014C0004646179737400134C6A6176612F6C616E672F496E74656765723B4C0007656E6454696D6571007E00014C0002696471007E00024C000B6F70696E696F6E4C6973747400104C6A6176612F7574696C2F4C6973743B4C001170726F63657373496E7374616E6365496471007E00024C000673746174757371007E00024C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E000178720017636F6D2E6C656E2E656E746974792E426173655461736BA48CBC2F51BC802602000D4C0008637265617465427971007E00024C000A6372656174654461746571007E00014C0002696471007E00024C001170726F63657373496E7374616E6365496471007E00024C0006726561736F6E71007E00024C000673746174757371007E00024C000B7375626D697474696D657371007E00034C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E00014C000775726C7061746871007E00024C000675736572496471007E00024C0008757365724E616D6571007E000278707070707400043230313874000331313170707070707400352F6C656176652F726561644F6E6C794C656176652F343332303730666331663532633063633137376164393031613561616338643174002035393436613938356637333363353766316162373136383966376236616565617400087A68616E6773616E7372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017FDB8E2400787070737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000037371007E000C77080000017FE5DADC00787400203433323037306663316635326330636331373761643930316135616163386431737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A65787000000000770400000000787070707070, + NULL); +INSERT INTO `act_ge_bytearray` +VALUES ('302561', 1, 'hist.detail.var-baseTask', NULL, + 0xACED000573720018636F6D2E6C656E2E656E746974792E557365724C65617665B811E59153A6CD0702000C4C0009626567696E54696D657400104C6A6176612F7574696C2F446174653B4C000863726561746542797400124C6A6176612F6C616E672F537472696E673B4C000A6372656174654461746571007E00014C0004646179737400134C6A6176612F6C616E672F496E74656765723B4C0007656E6454696D6571007E00014C0002696471007E00024C000B6F70696E696F6E4C6973747400104C6A6176612F7574696C2F4C6973743B4C001170726F63657373496E7374616E6365496471007E00024C000673746174757371007E00024C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E000178720017636F6D2E6C656E2E656E746974792E426173655461736BA48CBC2F51BC802602000D4C0008637265617465427971007E00024C000A6372656174654461746571007E00014C0002696471007E00024C001170726F63657373496E7374616E6365496471007E00024C0006726561736F6E71007E00024C000673746174757371007E00024C000B7375626D697474696D657371007E00034C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E00014C000775726C7061746871007E00024C000675736572496471007E00024C0008757365724E616D6571007E000278707070707400043230313874000331313170707070707400352F6C656176652F726561644F6E6C794C656176652F343332303730666331663532633063633137376164393031613561616338643174002035393436613938356637333363353766316162373136383966376236616565617400087A68616E6773616E7372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017FDB8E2400787070737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000037371007E000C77080000017FE5DADC00787400203433323037306663316635326330636331373761643930316135616163386431737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A65787000000000770400000000787070707070, + NULL); +INSERT INTO `act_ge_bytearray` +VALUES ('302573', 2, 'var-leaveOpinionList', NULL, + 0xACED0005737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A657870000000027704000000027372001B636F6D2E6C656E2E656E746974792E4C656176654F70696E696F6E1956BF801DDE60870200065A0004666C61674C000A63726561746554696D657400104C6A6176612F7574696C2F446174653B4C00046F7049647400124C6A6176612F6C616E672F537472696E673B4C00066F704E616D6571007E00044C00076F70696E696F6E71007E00044C00067461736B496471007E00047870017372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017FDDEED97B787400203062373632356665646161303565383566323832343836653163396339316239707400033131317400063330323536367371007E0002017371007E000677080000017FDDEFA3BB7874002064383138616336613836636631613634643231383462663036393964363761387074000331313174000633303235383478, + NULL); +INSERT INTO `act_ge_bytearray` +VALUES ('302575', 2, 'hist.var-leaveOpinionList', NULL, + 0xACED0005737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A657870000000027704000000027372001B636F6D2E6C656E2E656E746974792E4C656176654F70696E696F6E1956BF801DDE60870200065A0004666C61674C000A63726561746554696D657400104C6A6176612F7574696C2F446174653B4C00046F7049647400124C6A6176612F6C616E672F537472696E673B4C00066F704E616D6571007E00044C00076F70696E696F6E71007E00044C00067461736B496471007E00047870017372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017FDDEED97B787400203062373632356665646161303565383566323832343836653163396339316239707400033131317400063330323536367371007E0002017371007E000677080000017FDDEFA3BB7874002064383138616336613836636631613634643231383462663036393964363761387074000331313174000633303235383478, + NULL); +INSERT INTO `act_ge_bytearray` +VALUES ('302576', 1, 'hist.detail.var-leaveOpinionList', NULL, + 0xACED0005737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A657870000000017704000000017372001B636F6D2E6C656E2E656E746974792E4C656176654F70696E696F6E1956BF801DDE60870200065A0004666C61674C000A63726561746554696D657400104C6A6176612F7574696C2F446174653B4C00046F7049647400124C6A6176612F6C616E672F537472696E673B4C00066F704E616D6571007E00044C00076F70696E696F6E71007E00044C00067461736B496471007E00047870017372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017FDDEED97B7874002030623736323566656461613035653835663238323438366531633963393162397074000331313174000633303235363678, + NULL); +INSERT INTO `act_ge_bytearray` +VALUES ('302588', 1, 'hist.detail.var-leaveOpinionList', NULL, + 0xACED0005737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A657870000000027704000000027372001B636F6D2E6C656E2E656E746974792E4C656176654F70696E696F6E1956BF801DDE60870200065A0004666C61674C000A63726561746554696D657400104C6A6176612F7574696C2F446174653B4C00046F7049647400124C6A6176612F6C616E672F537472696E673B4C00066F704E616D6571007E00044C00076F70696E696F6E71007E00044C00067461736B496471007E00047870017372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017FDDEED97B787400203062373632356665646161303565383566323832343836653163396339316239707400033131317400063330323536367371007E0002017371007E000677080000017FDDEFA3BB7874002064383138616336613836636631613634643231383462663036393964363761387074000331313174000633303235383478, + NULL); +INSERT INTO `act_ge_bytearray` +VALUES ('302598', 2, 'source', NULL, + 0x7B227265736F757263654964223A22333032353937222C2270726F70657274696573223A7B2270726F636573735F6964223A2270726F63657373222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C2270726F636573735F617574686F72223A22222C2270726F636573735F76657273696F6E223A22222C2270726F636573735F6E616D657370616365223A22687474703A2F2F6C656E6F73702E636E222C22657865637574696F6E6C697374656E657273223A22222C226576656E746C697374656E657273223A22222C227369676E616C646566696E6974696F6E73223A22222C226D657373616765646566696E6974696F6E73223A22227D2C227374656E63696C223A7B226964223A2242504D4E4469616772616D227D2C226368696C64536861706573223A5B7B227265736F757263654964223A227369642D33304636324437352D353136352D344532322D383433412D394441393335424135303331222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22657865637574696F6E6C697374656E657273223A22222C22696E69746961746F72223A22222C22666F726D6B6579646566696E6974696F6E223A22222C22666F726D70726F70657274696573223A22227D2C227374656E63696C223A7B226964223A2253746172744E6F6E654576656E74227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D32333931423338312D323736372D344134332D383237442D374333353037394145303745227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3137352E352C2279223A3134317D2C2275707065724C656674223A7B2278223A3134352E352C2279223A3131317D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D39363143373036422D413744312D343941312D394332382D414135433233433430364243222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C226173796E6368726F6E6F7573646566696E6974696F6E223A2266616C7365222C226578636C7573697665646566696E6974696F6E223A2266616C7365222C22657865637574696F6E6C697374656E657273223A22222C226D756C7469696E7374616E63655F74797065223A224E6F6E65222C226D756C7469696E7374616E63655F63617264696E616C697479223A22222C226D756C7469696E7374616E63655F636F6C6C656374696F6E223A22222C226D756C7469696E7374616E63655F7661726961626C65223A22222C226D756C7469696E7374616E63655F636F6E646974696F6E223A22222C226973666F72636F6D70656E736174696F6E223A2266616C7365222C22757365727461736B61737369676E6D656E74223A22222C22666F726D6B6579646566696E6974696F6E223A22222C2264756564617465646566696E6974696F6E223A22222C227072696F72697479646566696E6974696F6E223A22222C22666F726D70726F70657274696573223A22222C227461736B6C697374656E657273223A22227D2C227374656E63696C223A7B226964223A22557365725461736B227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D36463636323645392D383144342D343845392D394345332D433632464434433932454230227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3338352C2279223A3135357D2C2275707065724C656674223A7B2278223A3238352C2279223A37357D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D32333931423338312D323736372D344134332D383237442D374333353037394145303745222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D39363143373036422D413744312D343941312D394332382D414135433233433430364243227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3238342E393233383535393435353934382C2279223A3132352E303334373433383734303737367D2C2275707065724C656674223A7B2278223A3137352E38313234373231373934303531382C2279223A3131382E313536363632333735393232347D7D2C22646F636B657273223A5B7B2278223A31352C2279223A31357D2C7B2278223A35302C2279223A34307D5D2C22746172676574223A7B227265736F757263654964223A227369642D39363143373036422D413744312D343941312D394332382D414135433233433430364243227D7D2C7B227265736F757263654964223A227369642D35383442353134362D373630372D343239362D393143342D383746384646323636333436222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22657865637574696F6E6C697374656E657273223A22227D2C227374656E63696C223A7B226964223A22456E644E6F6E654576656E74227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3539382C2279223A3132397D2C2275707065724C656674223A7B2278223A3537302C2279223A3130317D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D36463636323645392D383144342D343845392D394345332D433632464434433932454230222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D35383442353134362D373630372D343239362D393143342D383746384646323636333436227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3536392E333832383132352C2279223A3131357D2C2275707065724C656674223A7B2278223A3338352E36303534363837352C2279223A3131357D7D2C22646F636B657273223A5B7B2278223A35302C2279223A34307D2C7B2278223A31342C2279223A31347D5D2C22746172676574223A7B227265736F757263654964223A227369642D35383442353134362D373630372D343239362D393143342D383746384646323636333436227D7D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A313230302C2279223A313035307D2C2275707065724C656674223A7B2278223A302C2279223A307D7D2C227374656E63696C736574223A7B2275726C223A227374656E63696C736574732F62706D6E322E302F62706D6E322E302E6A736F6E222C226E616D657370616365223A22687474703A2F2F6C656E6F73702E636E23227D2C227373657874656E73696F6E73223A5B5D7D, + NULL); +INSERT INTO `act_ge_bytearray` +VALUES ('302601', 1, 'var-baseTask', NULL, + 0xACED000573720018636F6D2E6C656E2E656E746974792E557365724C65617665B811E59153A6CD0702000C4C0009626567696E54696D657400104C6A6176612F7574696C2F446174653B4C000863726561746542797400124C6A6176612F6C616E672F537472696E673B4C000A6372656174654461746571007E00014C0004646179737400134C6A6176612F6C616E672F496E74656765723B4C0007656E6454696D6571007E00014C0002696471007E00024C000B6F70696E696F6E4C6973747400104C6A6176612F7574696C2F4C6973743B4C001170726F63657373496E7374616E6365496471007E00024C000673746174757371007E00024C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E000178720017636F6D2E6C656E2E656E746974792E426173655461736BA48CBC2F51BC802602000D4C0008637265617465427971007E00024C000A6372656174654461746571007E00014C0002696471007E00024C001170726F63657373496E7374616E6365496471007E00024C0006726561736F6E71007E00024C000673746174757371007E00024C000B7375626D697474696D657371007E00034C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E00014C000775726C7061746871007E00024C000675736572496471007E00024C0008757365724E616D6571007E000278707070707400043230313874000332323270707070707400352F6C656176652F726561644F6E6C794C656176652F376538303465376562376162386633353461663133316362626336326336383374002035393436613938356637333363353766316162373136383966376236616565617400087A68616E6773616E7372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017FDB8E2400787070737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000057371007E000C77080000017FF0279400787400203765383034653765623761623866333534616631333163626263363263363833737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A65787000000000770400000000787070707070, + NULL); +INSERT INTO `act_ge_bytearray` +VALUES ('302603', 1, 'hist.var-baseTask', NULL, + 0xACED000573720018636F6D2E6C656E2E656E746974792E557365724C65617665B811E59153A6CD0702000C4C0009626567696E54696D657400104C6A6176612F7574696C2F446174653B4C000863726561746542797400124C6A6176612F6C616E672F537472696E673B4C000A6372656174654461746571007E00014C0004646179737400134C6A6176612F6C616E672F496E74656765723B4C0007656E6454696D6571007E00014C0002696471007E00024C000B6F70696E696F6E4C6973747400104C6A6176612F7574696C2F4C6973743B4C001170726F63657373496E7374616E6365496471007E00024C000673746174757371007E00024C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E000178720017636F6D2E6C656E2E656E746974792E426173655461736BA48CBC2F51BC802602000D4C0008637265617465427971007E00024C000A6372656174654461746571007E00014C0002696471007E00024C001170726F63657373496E7374616E6365496471007E00024C0006726561736F6E71007E00024C000673746174757371007E00024C000B7375626D697474696D657371007E00034C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E00014C000775726C7061746871007E00024C000675736572496471007E00024C0008757365724E616D6571007E000278707070707400043230313874000332323270707070707400352F6C656176652F726561644F6E6C794C656176652F376538303465376562376162386633353461663133316362626336326336383374002035393436613938356637333363353766316162373136383966376236616565617400087A68616E6773616E7372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017FDB8E2400787070737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000057371007E000C77080000017FF0279400787400203765383034653765623761623866333534616631333163626263363263363833737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A65787000000000770400000000787070707070, + NULL); +INSERT INTO `act_ge_bytearray` +VALUES ('302604', 1, 'hist.detail.var-baseTask', NULL, + 0xACED000573720018636F6D2E6C656E2E656E746974792E557365724C65617665B811E59153A6CD0702000C4C0009626567696E54696D657400104C6A6176612F7574696C2F446174653B4C000863726561746542797400124C6A6176612F6C616E672F537472696E673B4C000A6372656174654461746571007E00014C0004646179737400134C6A6176612F6C616E672F496E74656765723B4C0007656E6454696D6571007E00014C0002696471007E00024C000B6F70696E696F6E4C6973747400104C6A6176612F7574696C2F4C6973743B4C001170726F63657373496E7374616E6365496471007E00024C000673746174757371007E00024C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E000178720017636F6D2E6C656E2E656E746974792E426173655461736BA48CBC2F51BC802602000D4C0008637265617465427971007E00024C000A6372656174654461746571007E00014C0002696471007E00024C001170726F63657373496E7374616E6365496471007E00024C0006726561736F6E71007E00024C000673746174757371007E00024C000B7375626D697474696D657371007E00034C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E00014C000775726C7061746871007E00024C000675736572496471007E00024C0008757365724E616D6571007E000278707070707400043230313874000332323270707070707400352F6C656176652F726561644F6E6C794C656176652F376538303465376562376162386633353461663133316362626336326336383374002035393436613938356637333363353766316162373136383966376236616565617400087A68616E6773616E7372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017FDB8E2400787070737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000057371007E000C77080000017FF0279400787400203765383034653765623761623866333534616631333163626263363263363833737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A65787000000000770400000000787070707070, + NULL); +INSERT INTO `act_ge_bytearray` +VALUES ('302616', 1, 'var-leaveOpinionList', NULL, + 0xACED0005737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A657870000000017704000000017372001B636F6D2E6C656E2E656E746974792E4C656176654F70696E696F6E1956BF801DDE60870200065A0004666C61674C000A63726561746554696D657400104C6A6176612F7574696C2F446174653B4C00046F7049647400124C6A6176612F6C616E672F537472696E673B4C00066F704E616D6571007E00044C00076F70696E696F6E71007E00044C00067461736B496471007E00047870017372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017FDDFADF437874002030623736323566656461613035653835663238323438366531633963393162397074000333333374000633303236303978, + NULL); +INSERT INTO `act_ge_bytearray` +VALUES ('302618', 1, 'hist.var-leaveOpinionList', NULL, + 0xACED0005737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A657870000000017704000000017372001B636F6D2E6C656E2E656E746974792E4C656176654F70696E696F6E1956BF801DDE60870200065A0004666C61674C000A63726561746554696D657400104C6A6176612F7574696C2F446174653B4C00046F7049647400124C6A6176612F6C616E672F537472696E673B4C00066F704E616D6571007E00044C00076F70696E696F6E71007E00044C00067461736B496471007E00047870017372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017FDDFADF437874002030623736323566656461613035653835663238323438366531633963393162397074000333333374000633303236303978, + NULL); +INSERT INTO `act_ge_bytearray` +VALUES ('302619', 1, 'hist.detail.var-leaveOpinionList', NULL, + 0xACED0005737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A657870000000017704000000017372001B636F6D2E6C656E2E656E746974792E4C656176654F70696E696F6E1956BF801DDE60870200065A0004666C61674C000A63726561746554696D657400104C6A6176612F7574696C2F446174653B4C00046F7049647400124C6A6176612F6C616E672F537472696E673B4C00066F704E616D6571007E00044C00076F70696E696F6E71007E00044C00067461736B496471007E00047870017372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017FDDFADF437874002030623736323566656461613035653835663238323438366531633963393162397074000333333374000633303236303978, + NULL); +INSERT INTO `act_ge_bytearray` +VALUES ('302630', 1, 'source', NULL, + 0x7B227265736F757263654964223A2263616E766173222C227374656E63696C736574223A7B226E616D657370616365223A22687474703A2F2F6C656E6F73702E636E23227D2C226964223A2263616E766173227D, + NULL); +INSERT INTO `act_ge_bytearray` +VALUES ('302632', 1, 'source', NULL, + 0x7B227265736F757263654964223A2263616E766173222C227374656E63696C736574223A7B226E616D657370616365223A22687474703A2F2F6C656E6F73702E636E23227D2C226964223A2263616E766173227D, + NULL); +INSERT INTO `act_ge_bytearray` +VALUES ('302633', 1, 'source-extra', NULL, + 0x89504E470D0A1A0A0000000D4948445200000288000000CD08060000003B43814C000000206348524D00007A26000080840000FA00000080E8000075300000EA6000003A98000017709CBA513C0000000467414D410000B18E7CFB5193000000017352474200AECE1CE900000006624B474400FF00FF00FFA0BDA793000000097048597300000EC400000EC401952B0E1B000011F04944415478DAEDDD0B7454F59D07F09BC924194208E115E3A22B56A4BADAB55A1F548F055F80407B5C2B25984A715DDB7A56DAD5FA586B7DD5F6D45D75ABDBDD565B151FA841E8FAA8D64715A85B05179422281110C16208C86308904C1E33D97B69E8491110C883103E9F73AE776632B933FE90BFDFFBFFFFEFFF060100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005D44961200FBC203CB1EF87A8F648F9F146C2EE81FAF8B6B8B3A486376637D2637F34AF6E6ECEF8C183162A98A000222D0293C52F1C87D7DAAFA5C92EC970C36166D0CEABAD5294A07C94DE50685C9C2A0EFAABED5F1A678D9D9679FFDACAA00DBCB5602A023453D87C51F15DFBAF2332B83649F6490CE492B4A074AC7D3414D414DB0B9E7E6BCA2B545C3CA2E2C7B72F2E4C9EB55066829A60440478A8695A39EC328A4B0EFA4F253C1BAE275D5B158EC56D500B6175702A02345730E971FB47CD70DD3E67850B8B430C85D9F1B64356505754575C1A6819B82869E0D0AD88636F4DDD0BFEFEABE435502D89E1E44A063CF4AEBE259BB9A731885C33E6FF609F23ECE0BB2D25941900982BCF5795B5FCBD998A3806DA83E519F17EE4A54021010814EAD60794110ABFF64D31485C5E867000888C0016657BD8451EF22000222708089E61CEECDCF001010010010100100101081034EBADBCE17CECEE46614084040040E345B0EDDB2C320988967822D03B628108080081C6852C5A920D537B5C3D76B8B6B15084040040EC886A9F1934D53769D5BC7030888C001275EF3E7BBA824D6243EF1B3BC7579419F397DB6BE070001113800E457E66F0D80D1FD97772637991BF49DDD37E8BEA2BB351101DAF3845D09807DDA08D5C483C28AC2AD3D84BB23BAE55EE1E2C220B13611540FAA0E1A7A342822401BD38308EC53518FE0EE86C396A29EC6BEFFD75701010444A0AB897A04F79A651101DA852166609F5A75CE2A4500E864F420020020200200202002002020020020200200D06AAE6206000E68AFBFFEFA3F2C5DBAF4E2952B579EB67AF5EA1E1B376ECC49A552415E5E5E537E7E7E436161E187E1FEC5850B17DE3575EAD4A50222004017D4D4D4149F356BD68DD3A74FBFE2BEFBEE2B38E18413822143860403060C088A8A8A823010066148CCDAB469536E6565E5C0F0BD030B0A0A2EBBE28A2B962493C96F4C9A34E90D011100A08BD8B061C37161287C69DEBC79C55FF9CA57826BAEB926C8C9C9F9C4FB1289C4D6AD5FBF7EC171C71D175C7AE9A5B11933667C76EAD4A97FB8FCF2CBA7AD5EBDFAD2F0F1E6AE58237310018003C61B6FBC31E68E3BEE989B9B9B5B7CFBEDB707C3870FDF6138DC91ECECECE0ECB3CF0EEEBEFBEEF8E0C183CFEBD1A3C7FCD2D2D201022200C07E1C0E1F79E491F230DCC5C78F1FBF7518796F44BD8A65656589281C868F5FEB8A2151400400BABC6858F999679E796CF8F0E1B1D1A347B7C931CF39E79CD8B871E37AE5E6E6BE3066CC9802011100603F115D90326DDAB497060D1A146FAB70B8CDB061C3BA9D79E6997DF3F2F2FE5D400400D84FCC9E3DFB96B7DF7EBBF8820B2E6897E38F1D3BB64F3C1EFFFA85175EF879011100A09D959696FE60DCB871E70D1D3A74AF575E79E59557BE336AD4A8BD9E73F869A239895FFBDAD7EAC3877708880000EDEFD6A6A6A6274B4A4A9263C78E9D1C86C5117B32DF2F5A047BD9B26505679E7966BB7EC961C386F5C9CACA3A31FC6E03BB42D1AD834887995CF5D2590B6A975D5E99FA78F087756BFAAC6FAC8ED766EAB2F2623941AF7861E380C4411B8A737ACF39A5E0EFFE73EC4167BEA86200B4D03D0C606561582CCBCECEAE2E2D2D7D3A7CFE585E5EDECC071F7C30B5B35F5ABC78F1A5D122D8BBBB94CDDE8A96C039EAA8A33E7CE79D77CE0BBA404FA28048BBFBD6E23BAF5ADB90BC7ED2EADF169D52787470E141E70483BA1D1A94E4F60EF26389A026930A36346C8A2FAEFD53BFD7AB178EFC65D53323CF7FE7FA4DBD730AEFBA6FD0B537AA2000DB290CB78BC2B078512A346EDCB827C2E74FAE5AB5EAD999336736B67C63F8DAE033CE38A343BED4B061C3BA870171888008BB7059C5ED7FBF2ABDFEF90FEB561D7CF521E3B2BED4F3B8203B2BFB13EF8B42627E5E22E89FD72F38A3E884E0FABF1D1FBCBA717E8FBB3E7AE286910BAEBA6C407EC9C89F1F71D51C15ED1CA2F940E1AE229D4EBFD055EF2000EC571261501C1FEEC7979494443D8B2F656565DDBFAD67B1B2B2B2E0B0C30EEB902F127E4E34C9F1D8AE5054019176F1CD25B7DFF4D6E6A537FE53C9E8D8C5079DBBC360B82B51988CB647D6BCD8F7BF2B9F9CFDED2577DC76CF91575DAFB29DC2AD5B1B8F783C3376ECD877C286F87FC2A7331389C4EC5D0DF3D0F9D4ADAB0BDE7AEBAD28F4DFAC1A741151CFE2056160BC20954A45FF6DBF5F5D5D9D535858D8211FDEB367CF9270D7254E9C0544DADC75CBEEF9C16B9B16DE74CFC0EF657DBEE0C8561DEBA2E2E1C1890547C5BEBDF48EEB2E5B7C678F5F0CFADE7754B873081BE058180E3F173E8CB69B9A8779DE085F7F36168BBD1C9EB52FDC7EA887CEE5E3D91F072BE7AD8C1EDEA41A745147D4D5D5B5DBD5CBDB8BAE660E758905B30544DAD49845375CF9874D0B6F79FCB337664543C66DE1E8FCC382C7C2E38D7BEF87FF3C76D1CD95538EBEF93695DE77CACBCBB3C2B3F2A61DB58D61388CE6DE0CC96432414949C986F07D33C2E7BFC9CECE7EF9D1471F5DA97A9D4BBFC1FD827E95FD8279F3E6DDA21A7462BB7302930EDB9FA6F0A4F5AF724DF87C593C1E1F50535313EB8890585B5BFB51B8EB2920420BA7CEFDE611CB6BAB6EFBE59157C7DA2A1C6E131DEFDE8157C5BEF1DE8F7F387CE195CFBF78EC7FCC57F14EAF57B89D1F6DE9743A1AEA49878F1755565606C11714A733C8EB93171C73C231C1B5D75E7BB36AD059856DC70E03629807A3118A4C180273C37D76B88F5E4B86FB97C3EDD1BCBCBC17A2692F975F7E79AABABA3AAF2302623299DC18EE1A044468A15B4EFEF317179F95D3DA61E59D897A1227F6FF6ACEA455CF3D1D3E1DA0E2ED63C2840989542A551236B42561239BD87E1FBEE5A0BD3C743411F5D879F3E60503BEEC8F0FD82BD162D4D1C966B716BD85D19CBF17C26D4AB76EDD5E0E4361B2E52F1416162E5BB162C5D1252525EDFEE5162C58B0283AF71210A1D997E64D2CCBC9CAFE4C3467B03D45C79FB2E6954386CC9F78D9EF8FFBD92F547EC7C68C1953929D9D9DD855C80BF745D1F3F071F4FC2FFB686277243A1BDFD17E0F4543D12D7FB1E2F8E38F3F6A43B0C11F12B037725B84C269E1F65C229178765717C885A1F1B773E7CE3DFA94534E69F72FF7FCF3CF47DD94D30544D8F637363BE7966B0EBD303B5AF4BABD7DFF6F2FCABE71F9FDD7850FBB7440DC55C88BC5623D5B3EDF3EE46D3BC6AE425EF87B3BFBE8A8A1AD6ADE52E1EF5485EFDDB6AF6B7EFDD36ADFD8DCBE441FB830FCBD7BC3467A7274667FC92597340988C01E9F6D3635453D8333C3F6EFA1E6256C92BBF37B15151577E5E4E4FC4B434343767B2E969D4EA7575455559D14EEBBC4C5940222AD367076D9213599DA43A365693AC2A9859F0B1A9B322547CD2A1D50F1C5F2E5FB63C06B3154BB7DB06BB9DF69C8DB16EE7611F2AA5A04BD1D86BCE6B93A7F793D6CD45253A74EADDA9D7FB7D2D2D21D05C4C6F038B1E8EAE6E6B6E5854C2673E79A356B66BA9A1968851BC2B66579229198B6374B694517C85D79E5958BA64F9F7EECF0E1ED37CA3569D2A437C3EF5918B6A34B0544081DDCAD68FC909E9F8FEFE95A87AD716EEF53729E5EFFDAC5413B2ECF3161C284A2542A55149EAD168541A7287CA96FB815B445C0DB4D3B0D79E1F7D9B85DE8DBE390D7866AC22D1A568987DF2B0A9DF785DFE3DEAED24802FB567979F98F5A7B8C6432F9F5279F7C72CEE9A79F9ED31E17ABD4D6D62E0E03E869615B3CBAABD45D40A4D57283F8974F2BFC5CAC233FF3E41E4707CF6F7863D4A705C49DF5E2853F3A24DCF29A876B0BB61BA68DD6B0EABB6D2E5EB4644B4B6D11F05A0CD56EFF7A2A3C4BAEDACF169C8E5ADBBF1A46F6B702E84C1E78E081F913274E7C74CA9429632FBEF8E26E6D7CF8E4F5D75FFF5AD8066E09C3EC5C01119AAD6FDCF499E80AE38E54940C63E9CCF5C7949696DE1E85B9F02F665174D145D0DCCBD762FF57A16EFB70D772B87607A249D06B9B8762A3D0B3367AAD0B06BCD6308C0CEC17162C5870694D4DCDC9C5C5C5478C1A35AAADAE346EBCF3CE3B1FAAACAC8CD67F3DBD2BD54B40A4D55299FAA27E39451DFA9915731606FD66A5A31EBFAB7614FC5A58BB2DE8B508777FE9C50BF7D1E2CDA9743A5D153EDEBC0F8769F7375787757ACA3032B0BF884E62FBF7EF3FFC89279E9813B6FF3D468F1EDDBD95874C46E170EEDCB96785FFEFF87257BB37BD8048AB353435E6E6C7121DFA99434EFB5270CFAAA783BF9915DC103E5DB92DF46D0B8389442269A8B3FD949797DFA10AC0FE26BA60A5ACACECA45FFFFAD7CF5556561E3C7EFCF87ECDB7C7DB23D19CC3685839EA398CC261D8262EEF6AB5121069FD7F4459F1BA9A4C2AAF2343625149EF60F5A9B18657BFFBD88FFC0900B0272171E8D0A15FA8AFAFFFB759B366FDE3F9E79FDF3072E4C87ED9D99F7EA165B494CDC30F3F3CE777BFFBDDE9D19CC36858B9ABF51C0A88B499BCAC9C0D1F37244B0ECB2BE9B0CFDCD0B029C8C98A57AB3E007BAA79CEF4F7C68E1D3BE9B1C71EBBBDBCBC7CC8A04183169F75D65985871F7E786EAF5EBD0ECACFCF8FD7D6D6AE4E2693EBDE7DF7DD779E7DF6D982AAAAAAE3A3F9EE61303C6FCA9429B3BB728D04445AAD29C8CC7DB766F9B96140ECB0756E16D7FE29FC67D65BAA0FC0DE0A43DEC270776E5959D921151515A3172D5A343C0C80C7067F5E8122BAD0319AA7581B6E3DC2ED956811EC0365EEB58048AB6D694ABDF84AF2CD53CFED35B877477DE6AB1BE7276B33752FA93E00AD150D3B87BB7B9A37423125A0B5B2D2F1A76624E7C5D24DE90EFBCCE7D6CFCAE4A4B7DE8713001010E96C960E7E74654DBAEE8FD3936F75C89CC0FFDD387FF39674ED92CE7C9B3D00101039E03564D277DFB0FCFE9A8EE845FCFEF25F6EAC6F4AFF97AA0380804827F6FE298F3FB5BEB1FABDBB2BA7AD68CFCFB967D5532B3FAEDFB0E2902DABCA551D0004443AB9EC74D3845FADFA4DF7B736BDD72E6B42BD53B3BCE6EE8FA6259A62C12533CF705B37001010E9F4A239810D41E3C46F2CFEC99695756BEADAF2D8D1F1C655DCBCB9B12973C5E2131FAF506D001010D94FBC7FD294F2BA4CDDBF8E5878F586B99B2AD6B5C531176EF9605D74BCDA74EAA74B4F7E7CB22A038080C87E66C9C9E50FA69AEAAEB8B0E287C18F3F7CF88FADB970E5A71F4D79FBABEFFE205D9FA9BF6EE9C9536E535D00687F16CAA65D443D8947CD2A9D3D69F50BBF9AF2F1F4F77F72F8B752A37A7FF198DDFDFD979373165FF3C1BD0D9B1BB6546765678D5D7262B96165001010D9DF35AF5378CEC039A5177CF7FD9F7DEBEA0F7EDEEBB8EE03579CDF6748E2841E47161F9CDBA7283F96E85E93496D595B9FDCF076CD07EB9F5AFB6AF5ECEA770FABCFD4AF09B282FBFBD7544D76410A00088874314B4F2A8FEE78326DE0ECB243E66E7EEF82B9D515A7356505BDB28260DBBD9BB7ED3F6C0A82DF47774859D2BC08F612E5030001912E1C14076FBDD7E55DCD1B00D049B94805000001110000011100000111000001110000011100000111000001118076905202404004F6B9744E3A95579BA7109D40A226313FDC55A904202002FB54434EC30B3D933D332AB1EF1DFCA7832B9A9A9A66AA04202002FB54417DC1C4DE55BD3775DBD24D31F6A1FCEAFC5F75DBD4EDAC4C2673836A00DBCB5602A0233DF4D043D513C64F985BB4AE6864BC31BEA63EB7BE5B3A27EDBEF01D2395A849BCD9FF83FE2F1557168F88C562970D1B366CB6B200DBCB5202605F983163C621E974FAD6F0E1D0A6A6A6012AD261AAA261E5A8E770C488114B9503000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E854FE1F5EFD99B91416FC3A0000000049454E44AE426082, + NULL); +INSERT INTO `act_ge_bytearray` +VALUES ('302635', 1, 'source', NULL, + 0x7B227265736F757263654964223A2263616E766173222C227374656E63696C736574223A7B226E616D657370616365223A22687474703A2F2F6C656E6F73702E636E23227D2C226964223A2263616E766173227D, + NULL); -- ---------------------------- -- Table structure for act_ge_property -- ---------------------------- DROP TABLE IF EXISTS `act_ge_property`; -CREATE TABLE `act_ge_property` ( - `NAME_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `VALUE_` varchar(300) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `REV_` int(11) NULL DEFAULT NULL, - PRIMARY KEY (`NAME_`) USING BTREE +CREATE TABLE `act_ge_property` +( + `NAME_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `VALUE_` varchar(300) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `REV_` int(11) NULL DEFAULT NULL, + PRIMARY KEY (`NAME_`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of act_ge_property -- ---------------------------- -INSERT INTO `act_ge_property` VALUES ('next.dbid', '305001', 123); -INSERT INTO `act_ge_property` VALUES ('schema.history', 'create(5.22.0.0)', 1); -INSERT INTO `act_ge_property` VALUES ('schema.version', '5.22.0.0', 1); +INSERT INTO `act_ge_property` +VALUES ('next.dbid', '305001', 123); +INSERT INTO `act_ge_property` +VALUES ('schema.history', 'create(5.22.0.0)', 1); +INSERT INTO `act_ge_property` +VALUES ('schema.version', '5.22.0.0', 1); -- ---------------------------- -- Table structure for act_hi_actinst -- ---------------------------- DROP TABLE IF EXISTS `act_hi_actinst`; -CREATE TABLE `act_hi_actinst` ( - `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `ACT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `CALL_PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `ACT_NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `ACT_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `ASSIGNEE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `START_TIME_` datetime(3) NOT NULL, - `END_TIME_` datetime(3) NULL DEFAULT NULL, - `DURATION_` bigint(20) NULL DEFAULT NULL, - `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '', - PRIMARY KEY (`ID_`) USING BTREE, - INDEX `ACT_IDX_HI_ACT_INST_START`(`START_TIME_`) USING BTREE, - INDEX `ACT_IDX_HI_ACT_INST_END`(`END_TIME_`) USING BTREE, - INDEX `ACT_IDX_HI_ACT_INST_PROCINST`(`PROC_INST_ID_`, `ACT_ID_`) USING BTREE, - INDEX `ACT_IDX_HI_ACT_INST_EXEC`(`EXECUTION_ID_`, `ACT_ID_`) USING BTREE +CREATE TABLE `act_hi_actinst` +( + `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `ACT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `CALL_PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `ACT_NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `ACT_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `ASSIGNEE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `START_TIME_` datetime(3) NOT NULL, + `END_TIME_` datetime(3) NULL DEFAULT NULL, + `DURATION_` bigint(20) NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '', + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_HI_ACT_INST_START`(`START_TIME_`) USING BTREE, + INDEX `ACT_IDX_HI_ACT_INST_END`(`END_TIME_`) USING BTREE, + INDEX `ACT_IDX_HI_ACT_INST_PROCINST`(`PROC_INST_ID_`, `ACT_ID_`) USING BTREE, + INDEX `ACT_IDX_HI_ACT_INST_EXEC`(`EXECUTION_ID_`, `ACT_ID_`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of act_hi_actinst -- ---------------------------- -INSERT INTO `act_hi_actinst` VALUES ('247553', 'process_leave:1:247536', '247552', '247552', 'start', NULL, NULL, 'start', 'startEvent', NULL, '2018-06-14 23:44:03.000', '2018-06-14 23:44:03.000', 1, ''); -INSERT INTO `act_hi_actinst` VALUES ('247559', 'process_leave:1:247536', '247552', '247552', 'user1', '247560', NULL, '经理审批', 'userTask', NULL, '2018-06-14 23:44:03.000', NULL, NULL, ''); -INSERT INTO `act_hi_actinst` VALUES ('302557', 'process_leave:1:302555', '302556', '302556', 'start', NULL, NULL, 'start', 'startEvent', NULL, '2022-03-31 10:59:17.000', '2022-03-31 10:59:17.000', 10, ''); -INSERT INTO `act_hi_actinst` VALUES ('302565', 'process_leave:1:302555', '302556', '302556', 'user1', '302566', NULL, '经理审批', 'userTask', '0b7625fedaa05e85f282486e1c9c91b9', '2022-03-31 10:59:17.000', '2022-03-31 11:04:52.000', 335536, ''); -INSERT INTO `act_hi_actinst` VALUES ('302579', 'process_leave:1:302555', '302556', '302556', 'sid-950749EA-4BB6-4276-B67A-DE03E34A0573', NULL, NULL, NULL, 'exclusiveGateway', NULL, '2022-03-31 11:04:52.000', '2022-03-31 11:04:52.000', 43, ''); -INSERT INTO `act_hi_actinst` VALUES ('302581', 'process_leave:1:302555', '302556', '302580', 'child', NULL, NULL, 'subProcess', 'subProcess', NULL, '2022-03-31 11:04:52.000', '2022-03-31 11:05:44.000', 52313, ''); -INSERT INTO `act_hi_actinst` VALUES ('302582', 'process_leave:1:302555', '302556', '302580', 'sstart', NULL, NULL, NULL, 'startEvent', NULL, '2022-03-31 11:04:52.000', '2022-03-31 11:04:52.000', 31, ''); -INSERT INTO `act_hi_actinst` VALUES ('302583', 'process_leave:1:302555', '302556', '302580', 'allmanager', '302584', NULL, '总经理审批', 'userTask', 'd818ac6a86cf1a64d2184bf0699d67a8', '2022-03-31 11:04:52.000', '2022-03-31 11:05:44.000', 52298, ''); -INSERT INTO `act_hi_actinst` VALUES ('302591', 'process_leave:1:302555', '302556', '302580', 'sid-1CC133B2-44B1-4830-9C59-7D3564C933FA', NULL, NULL, NULL, 'exclusiveGateway', NULL, '2022-03-31 11:05:44.000', '2022-03-31 11:05:44.000', 0, ''); -INSERT INTO `act_hi_actinst` VALUES ('302592', 'process_leave:1:302555', '302556', '302580', 'sid-F68DCCA0-F7A4-44D4-9E44-56A682D87ECA', NULL, NULL, NULL, 'endEvent', NULL, '2022-03-31 11:05:44.000', '2022-03-31 11:05:44.000', 0, ''); -INSERT INTO `act_hi_actinst` VALUES ('302593', 'process_leave:1:302555', '302556', '302556', 'sid-BE372D14-F509-4EDB-87E8-7B2107835AE5', NULL, NULL, NULL, 'exclusiveGateway', NULL, '2022-03-31 11:05:44.000', '2022-03-31 11:05:44.000', 0, ''); -INSERT INTO `act_hi_actinst` VALUES ('302594', 'process_leave:1:302555', '302556', '302556', 'user2', '302595', NULL, '人事审批', 'userTask', '98b051b03681de6028993a5d14ac93cb', '2022-03-31 11:05:44.000', NULL, NULL, ''); -INSERT INTO `act_hi_actinst` VALUES ('302600', 'process_leave:1:302555', '302599', '302599', 'start', NULL, NULL, 'start', 'startEvent', NULL, '2022-03-31 11:16:00.000', '2022-03-31 11:16:00.000', 8, ''); -INSERT INTO `act_hi_actinst` VALUES ('302608', 'process_leave:1:302555', '302599', '302599', 'user1', '302609', NULL, '经理审批', 'userTask', '0b7625fedaa05e85f282486e1c9c91b9', '2022-03-31 11:16:00.000', '2022-03-31 11:18:00.000', 120357, ''); -INSERT INTO `act_hi_actinst` VALUES ('302622', 'process_leave:1:302555', '302599', '302599', 'sid-950749EA-4BB6-4276-B67A-DE03E34A0573', NULL, NULL, NULL, 'exclusiveGateway', NULL, '2022-03-31 11:18:00.000', '2022-03-31 11:18:00.000', 0, ''); -INSERT INTO `act_hi_actinst` VALUES ('302624', 'process_leave:1:302555', '302599', '302623', 'child', NULL, NULL, 'subProcess', 'subProcess', NULL, '2022-03-31 11:18:00.000', NULL, NULL, ''); -INSERT INTO `act_hi_actinst` VALUES ('302625', 'process_leave:1:302555', '302599', '302623', 'sstart', NULL, NULL, NULL, 'startEvent', NULL, '2022-03-31 11:18:00.000', '2022-03-31 11:18:00.000', 9, ''); -INSERT INTO `act_hi_actinst` VALUES ('302626', 'process_leave:1:302555', '302599', '302623', 'allmanager', '302627', NULL, '总经理审批', 'userTask', 'd818ac6a86cf1a64d2184bf0699d67a8', '2022-03-31 11:18:00.000', NULL, NULL, ''); +INSERT INTO `act_hi_actinst` +VALUES ('247553', 'process_leave:1:247536', '247552', '247552', 'start', NULL, NULL, 'start', 'startEvent', NULL, + '2018-06-14 23:44:03.000', '2018-06-14 23:44:03.000', 1, ''); +INSERT INTO `act_hi_actinst` +VALUES ('247559', 'process_leave:1:247536', '247552', '247552', 'user1', '247560', NULL, '经理审批', 'userTask', NULL, + '2018-06-14 23:44:03.000', NULL, NULL, ''); +INSERT INTO `act_hi_actinst` +VALUES ('302557', 'process_leave:1:302555', '302556', '302556', 'start', NULL, NULL, 'start', 'startEvent', NULL, + '2022-03-31 10:59:17.000', '2022-03-31 10:59:17.000', 10, ''); +INSERT INTO `act_hi_actinst` +VALUES ('302565', 'process_leave:1:302555', '302556', '302556', 'user1', '302566', NULL, '经理审批', 'userTask', + '0b7625fedaa05e85f282486e1c9c91b9', '2022-03-31 10:59:17.000', '2022-03-31 11:04:52.000', 335536, ''); +INSERT INTO `act_hi_actinst` +VALUES ('302579', 'process_leave:1:302555', '302556', '302556', 'sid-950749EA-4BB6-4276-B67A-DE03E34A0573', NULL, NULL, + NULL, 'exclusiveGateway', NULL, '2022-03-31 11:04:52.000', '2022-03-31 11:04:52.000', 43, ''); +INSERT INTO `act_hi_actinst` +VALUES ('302581', 'process_leave:1:302555', '302556', '302580', 'child', NULL, NULL, 'subProcess', 'subProcess', NULL, + '2022-03-31 11:04:52.000', '2022-03-31 11:05:44.000', 52313, ''); +INSERT INTO `act_hi_actinst` +VALUES ('302582', 'process_leave:1:302555', '302556', '302580', 'sstart', NULL, NULL, NULL, 'startEvent', NULL, + '2022-03-31 11:04:52.000', '2022-03-31 11:04:52.000', 31, ''); +INSERT INTO `act_hi_actinst` +VALUES ('302583', 'process_leave:1:302555', '302556', '302580', 'allmanager', '302584', NULL, '总经理审批', 'userTask', + 'd818ac6a86cf1a64d2184bf0699d67a8', '2022-03-31 11:04:52.000', '2022-03-31 11:05:44.000', 52298, ''); +INSERT INTO `act_hi_actinst` +VALUES ('302591', 'process_leave:1:302555', '302556', '302580', 'sid-1CC133B2-44B1-4830-9C59-7D3564C933FA', NULL, NULL, + NULL, 'exclusiveGateway', NULL, '2022-03-31 11:05:44.000', '2022-03-31 11:05:44.000', 0, ''); +INSERT INTO `act_hi_actinst` +VALUES ('302592', 'process_leave:1:302555', '302556', '302580', 'sid-F68DCCA0-F7A4-44D4-9E44-56A682D87ECA', NULL, NULL, + NULL, 'endEvent', NULL, '2022-03-31 11:05:44.000', '2022-03-31 11:05:44.000', 0, ''); +INSERT INTO `act_hi_actinst` +VALUES ('302593', 'process_leave:1:302555', '302556', '302556', 'sid-BE372D14-F509-4EDB-87E8-7B2107835AE5', NULL, NULL, + NULL, 'exclusiveGateway', NULL, '2022-03-31 11:05:44.000', '2022-03-31 11:05:44.000', 0, ''); +INSERT INTO `act_hi_actinst` +VALUES ('302594', 'process_leave:1:302555', '302556', '302556', 'user2', '302595', NULL, '人事审批', 'userTask', + '98b051b03681de6028993a5d14ac93cb', '2022-03-31 11:05:44.000', NULL, NULL, ''); +INSERT INTO `act_hi_actinst` +VALUES ('302600', 'process_leave:1:302555', '302599', '302599', 'start', NULL, NULL, 'start', 'startEvent', NULL, + '2022-03-31 11:16:00.000', '2022-03-31 11:16:00.000', 8, ''); +INSERT INTO `act_hi_actinst` +VALUES ('302608', 'process_leave:1:302555', '302599', '302599', 'user1', '302609', NULL, '经理审批', 'userTask', + '0b7625fedaa05e85f282486e1c9c91b9', '2022-03-31 11:16:00.000', '2022-03-31 11:18:00.000', 120357, ''); +INSERT INTO `act_hi_actinst` +VALUES ('302622', 'process_leave:1:302555', '302599', '302599', 'sid-950749EA-4BB6-4276-B67A-DE03E34A0573', NULL, NULL, + NULL, 'exclusiveGateway', NULL, '2022-03-31 11:18:00.000', '2022-03-31 11:18:00.000', 0, ''); +INSERT INTO `act_hi_actinst` +VALUES ('302624', 'process_leave:1:302555', '302599', '302623', 'child', NULL, NULL, 'subProcess', 'subProcess', NULL, + '2022-03-31 11:18:00.000', NULL, NULL, ''); +INSERT INTO `act_hi_actinst` +VALUES ('302625', 'process_leave:1:302555', '302599', '302623', 'sstart', NULL, NULL, NULL, 'startEvent', NULL, + '2022-03-31 11:18:00.000', '2022-03-31 11:18:00.000', 9, ''); +INSERT INTO `act_hi_actinst` +VALUES ('302626', 'process_leave:1:302555', '302599', '302623', 'allmanager', '302627', NULL, '总经理审批', 'userTask', + 'd818ac6a86cf1a64d2184bf0699d67a8', '2022-03-31 11:18:00.000', NULL, NULL, ''); -- ---------------------------- -- Table structure for act_hi_attachment -- ---------------------------- DROP TABLE IF EXISTS `act_hi_attachment`; -CREATE TABLE `act_hi_attachment` ( - `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `REV_` int(11) NULL DEFAULT NULL, - `USER_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `DESCRIPTION_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `URL_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `CONTENT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `TIME_` datetime(3) NULL DEFAULT NULL, - PRIMARY KEY (`ID_`) USING BTREE +CREATE TABLE `act_hi_attachment` +( + `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `REV_` int(11) NULL DEFAULT NULL, + `USER_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `DESCRIPTION_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `URL_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `CONTENT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TIME_` datetime(3) NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for act_hi_comment -- ---------------------------- DROP TABLE IF EXISTS `act_hi_comment`; -CREATE TABLE `act_hi_comment` ( - `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `TIME_` datetime(3) NOT NULL, - `USER_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `ACTION_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `MESSAGE_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `FULL_MSG_` longblob NULL, - PRIMARY KEY (`ID_`) USING BTREE +CREATE TABLE `act_hi_comment` +( + `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TIME_` datetime(3) NOT NULL, + `USER_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `ACTION_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `MESSAGE_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `FULL_MSG_` longblob NULL, + PRIMARY KEY (`ID_`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for act_hi_detail -- ---------------------------- DROP TABLE IF EXISTS `act_hi_detail`; -CREATE TABLE `act_hi_detail` ( - `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `ACT_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `VAR_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `REV_` int(11) NULL DEFAULT NULL, - `TIME_` datetime(3) NOT NULL, - `BYTEARRAY_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `DOUBLE_` double NULL DEFAULT NULL, - `LONG_` bigint(20) NULL DEFAULT NULL, - `TEXT_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `TEXT2_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - PRIMARY KEY (`ID_`) USING BTREE, - INDEX `ACT_IDX_HI_DETAIL_PROC_INST`(`PROC_INST_ID_`) USING BTREE, - INDEX `ACT_IDX_HI_DETAIL_ACT_INST`(`ACT_INST_ID_`) USING BTREE, - INDEX `ACT_IDX_HI_DETAIL_TIME`(`TIME_`) USING BTREE, - INDEX `ACT_IDX_HI_DETAIL_NAME`(`NAME_`) USING BTREE, - INDEX `ACT_IDX_HI_DETAIL_TASK_ID`(`TASK_ID_`) USING BTREE +CREATE TABLE `act_hi_detail` +( + `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `ACT_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `VAR_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `REV_` int(11) NULL DEFAULT NULL, + `TIME_` datetime(3) NOT NULL, + `BYTEARRAY_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `DOUBLE_` double NULL DEFAULT NULL, + `LONG_` bigint(20) NULL DEFAULT NULL, + `TEXT_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TEXT2_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_HI_DETAIL_PROC_INST`(`PROC_INST_ID_`) USING BTREE, + INDEX `ACT_IDX_HI_DETAIL_ACT_INST`(`ACT_INST_ID_`) USING BTREE, + INDEX `ACT_IDX_HI_DETAIL_TIME`(`TIME_`) USING BTREE, + INDEX `ACT_IDX_HI_DETAIL_NAME`(`NAME_`) USING BTREE, + INDEX `ACT_IDX_HI_DETAIL_TASK_ID`(`TASK_ID_`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of act_hi_detail -- ---------------------------- -INSERT INTO `act_hi_detail` VALUES ('247558', 'VariableUpdate', '247552', '247552', NULL, '247553', 'userLeave', 'serializable', 0, '2018-06-14 23:44:03.000', '247557', NULL, NULL, NULL, NULL); -INSERT INTO `act_hi_detail` VALUES ('302562', 'VariableUpdate', '302556', '302556', NULL, '302557', 'baseTask', 'serializable', 0, '2022-03-31 10:59:17.000', '302561', NULL, NULL, NULL, NULL); -INSERT INTO `act_hi_detail` VALUES ('302564', 'VariableUpdate', '302556', '302556', NULL, '302557', 'day', 'integer', 0, '2022-03-31 10:59:17.000', NULL, NULL, 3, '3', NULL); -INSERT INTO `act_hi_detail` VALUES ('302570', 'VariableUpdate', '302556', '302556', NULL, '302565', 'flag', 'boolean', 0, '2022-03-31 11:04:52.000', NULL, NULL, 1, NULL, NULL); -INSERT INTO `act_hi_detail` VALUES ('302572', 'VariableUpdate', '302556', '302556', NULL, '302565', 'needfinish', 'integer', 0, '2022-03-31 11:04:52.000', NULL, NULL, 1, '1', NULL); -INSERT INTO `act_hi_detail` VALUES ('302577', 'VariableUpdate', '302556', '302556', NULL, '302565', 'leaveOpinionList', 'serializable', 0, '2022-03-31 11:04:52.000', '302576', NULL, NULL, NULL, NULL); -INSERT INTO `act_hi_detail` VALUES ('302578', 'VariableUpdate', '302556', '302556', NULL, '302565', 'day', 'integer', 1, '2022-03-31 11:04:52.000', NULL, NULL, 3, '3', NULL); -INSERT INTO `act_hi_detail` VALUES ('302586', 'VariableUpdate', '302556', '302556', NULL, '302583', 'flag', 'boolean', 1, '2022-03-31 11:05:44.000', NULL, NULL, 1, NULL, NULL); -INSERT INTO `act_hi_detail` VALUES ('302587', 'VariableUpdate', '302556', '302556', NULL, '302583', 'needfinish', 'integer', 1, '2022-03-31 11:05:44.000', NULL, NULL, 1, '1', NULL); -INSERT INTO `act_hi_detail` VALUES ('302589', 'VariableUpdate', '302556', '302556', NULL, '302583', 'leaveOpinionList', 'serializable', 1, '2022-03-31 11:05:44.000', '302588', NULL, NULL, NULL, NULL); -INSERT INTO `act_hi_detail` VALUES ('302590', 'VariableUpdate', '302556', '302556', NULL, '302583', 'day', 'integer', 1, '2022-03-31 11:05:44.000', NULL, NULL, 3, '3', NULL); -INSERT INTO `act_hi_detail` VALUES ('302605', 'VariableUpdate', '302599', '302599', NULL, '302600', 'baseTask', 'serializable', 0, '2022-03-31 11:16:00.000', '302604', NULL, NULL, NULL, NULL); -INSERT INTO `act_hi_detail` VALUES ('302607', 'VariableUpdate', '302599', '302599', NULL, '302600', 'day', 'integer', 0, '2022-03-31 11:16:00.000', NULL, NULL, 5, '5', NULL); -INSERT INTO `act_hi_detail` VALUES ('302613', 'VariableUpdate', '302599', '302599', NULL, '302608', 'flag', 'boolean', 0, '2022-03-31 11:18:00.000', NULL, NULL, 1, NULL, NULL); -INSERT INTO `act_hi_detail` VALUES ('302615', 'VariableUpdate', '302599', '302599', NULL, '302608', 'needfinish', 'integer', 0, '2022-03-31 11:18:00.000', NULL, NULL, 1, '1', NULL); -INSERT INTO `act_hi_detail` VALUES ('302620', 'VariableUpdate', '302599', '302599', NULL, '302608', 'leaveOpinionList', 'serializable', 0, '2022-03-31 11:18:00.000', '302619', NULL, NULL, NULL, NULL); -INSERT INTO `act_hi_detail` VALUES ('302621', 'VariableUpdate', '302599', '302599', NULL, '302608', 'day', 'integer', 1, '2022-03-31 11:18:00.000', NULL, NULL, 5, '5', NULL); +INSERT INTO `act_hi_detail` +VALUES ('247558', 'VariableUpdate', '247552', '247552', NULL, '247553', 'userLeave', 'serializable', 0, + '2018-06-14 23:44:03.000', '247557', NULL, NULL, NULL, NULL); +INSERT INTO `act_hi_detail` +VALUES ('302562', 'VariableUpdate', '302556', '302556', NULL, '302557', 'baseTask', 'serializable', 0, + '2022-03-31 10:59:17.000', '302561', NULL, NULL, NULL, NULL); +INSERT INTO `act_hi_detail` +VALUES ('302564', 'VariableUpdate', '302556', '302556', NULL, '302557', 'day', 'integer', 0, '2022-03-31 10:59:17.000', + NULL, NULL, 3, '3', NULL); +INSERT INTO `act_hi_detail` +VALUES ('302570', 'VariableUpdate', '302556', '302556', NULL, '302565', 'flag', 'boolean', 0, '2022-03-31 11:04:52.000', + NULL, NULL, 1, NULL, NULL); +INSERT INTO `act_hi_detail` +VALUES ('302572', 'VariableUpdate', '302556', '302556', NULL, '302565', 'needfinish', 'integer', 0, + '2022-03-31 11:04:52.000', NULL, NULL, 1, '1', NULL); +INSERT INTO `act_hi_detail` +VALUES ('302577', 'VariableUpdate', '302556', '302556', NULL, '302565', 'leaveOpinionList', 'serializable', 0, + '2022-03-31 11:04:52.000', '302576', NULL, NULL, NULL, NULL); +INSERT INTO `act_hi_detail` +VALUES ('302578', 'VariableUpdate', '302556', '302556', NULL, '302565', 'day', 'integer', 1, '2022-03-31 11:04:52.000', + NULL, NULL, 3, '3', NULL); +INSERT INTO `act_hi_detail` +VALUES ('302586', 'VariableUpdate', '302556', '302556', NULL, '302583', 'flag', 'boolean', 1, '2022-03-31 11:05:44.000', + NULL, NULL, 1, NULL, NULL); +INSERT INTO `act_hi_detail` +VALUES ('302587', 'VariableUpdate', '302556', '302556', NULL, '302583', 'needfinish', 'integer', 1, + '2022-03-31 11:05:44.000', NULL, NULL, 1, '1', NULL); +INSERT INTO `act_hi_detail` +VALUES ('302589', 'VariableUpdate', '302556', '302556', NULL, '302583', 'leaveOpinionList', 'serializable', 1, + '2022-03-31 11:05:44.000', '302588', NULL, NULL, NULL, NULL); +INSERT INTO `act_hi_detail` +VALUES ('302590', 'VariableUpdate', '302556', '302556', NULL, '302583', 'day', 'integer', 1, '2022-03-31 11:05:44.000', + NULL, NULL, 3, '3', NULL); +INSERT INTO `act_hi_detail` +VALUES ('302605', 'VariableUpdate', '302599', '302599', NULL, '302600', 'baseTask', 'serializable', 0, + '2022-03-31 11:16:00.000', '302604', NULL, NULL, NULL, NULL); +INSERT INTO `act_hi_detail` +VALUES ('302607', 'VariableUpdate', '302599', '302599', NULL, '302600', 'day', 'integer', 0, '2022-03-31 11:16:00.000', + NULL, NULL, 5, '5', NULL); +INSERT INTO `act_hi_detail` +VALUES ('302613', 'VariableUpdate', '302599', '302599', NULL, '302608', 'flag', 'boolean', 0, '2022-03-31 11:18:00.000', + NULL, NULL, 1, NULL, NULL); +INSERT INTO `act_hi_detail` +VALUES ('302615', 'VariableUpdate', '302599', '302599', NULL, '302608', 'needfinish', 'integer', 0, + '2022-03-31 11:18:00.000', NULL, NULL, 1, '1', NULL); +INSERT INTO `act_hi_detail` +VALUES ('302620', 'VariableUpdate', '302599', '302599', NULL, '302608', 'leaveOpinionList', 'serializable', 0, + '2022-03-31 11:18:00.000', '302619', NULL, NULL, NULL, NULL); +INSERT INTO `act_hi_detail` +VALUES ('302621', 'VariableUpdate', '302599', '302599', NULL, '302608', 'day', 'integer', 1, '2022-03-31 11:18:00.000', + NULL, NULL, 5, '5', NULL); -- ---------------------------- -- Table structure for act_hi_identitylink -- ---------------------------- DROP TABLE IF EXISTS `act_hi_identitylink`; -CREATE TABLE `act_hi_identitylink` ( - `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `GROUP_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `USER_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - PRIMARY KEY (`ID_`) USING BTREE, - INDEX `ACT_IDX_HI_IDENT_LNK_USER`(`USER_ID_`) USING BTREE, - INDEX `ACT_IDX_HI_IDENT_LNK_TASK`(`TASK_ID_`) USING BTREE, - INDEX `ACT_IDX_HI_IDENT_LNK_PROCINST`(`PROC_INST_ID_`) USING BTREE +CREATE TABLE `act_hi_identitylink` +( + `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `GROUP_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `USER_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_HI_IDENT_LNK_USER`(`USER_ID_`) USING BTREE, + INDEX `ACT_IDX_HI_IDENT_LNK_TASK`(`TASK_ID_`) USING BTREE, + INDEX `ACT_IDX_HI_IDENT_LNK_PROCINST`(`PROC_INST_ID_`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of act_hi_identitylink -- ---------------------------- -INSERT INTO `act_hi_identitylink` VALUES ('302567', NULL, 'participant', '0b7625fedaa05e85f282486e1c9c91b9', NULL, '302556'); -INSERT INTO `act_hi_identitylink` VALUES ('302568', 'e346e96368484c8fa7f217ce550a0186', 'candidate', NULL, '302566', NULL); -INSERT INTO `act_hi_identitylink` VALUES ('302585', NULL, 'participant', 'd818ac6a86cf1a64d2184bf0699d67a8', NULL, '302556'); -INSERT INTO `act_hi_identitylink` VALUES ('302596', NULL, 'participant', '98b051b03681de6028993a5d14ac93cb', NULL, '302556'); -INSERT INTO `act_hi_identitylink` VALUES ('302610', NULL, 'participant', '0b7625fedaa05e85f282486e1c9c91b9', NULL, '302599'); -INSERT INTO `act_hi_identitylink` VALUES ('302611', 'e346e96368484c8fa7f217ce550a0186', 'candidate', NULL, '302609', NULL); -INSERT INTO `act_hi_identitylink` VALUES ('302628', NULL, 'participant', 'd818ac6a86cf1a64d2184bf0699d67a8', NULL, '302599'); +INSERT INTO `act_hi_identitylink` +VALUES ('302567', NULL, 'participant', '0b7625fedaa05e85f282486e1c9c91b9', NULL, '302556'); +INSERT INTO `act_hi_identitylink` +VALUES ('302568', 'e346e96368484c8fa7f217ce550a0186', 'candidate', NULL, '302566', NULL); +INSERT INTO `act_hi_identitylink` +VALUES ('302585', NULL, 'participant', 'd818ac6a86cf1a64d2184bf0699d67a8', NULL, '302556'); +INSERT INTO `act_hi_identitylink` +VALUES ('302596', NULL, 'participant', '98b051b03681de6028993a5d14ac93cb', NULL, '302556'); +INSERT INTO `act_hi_identitylink` +VALUES ('302610', NULL, 'participant', '0b7625fedaa05e85f282486e1c9c91b9', NULL, '302599'); +INSERT INTO `act_hi_identitylink` +VALUES ('302611', 'e346e96368484c8fa7f217ce550a0186', 'candidate', NULL, '302609', NULL); +INSERT INTO `act_hi_identitylink` +VALUES ('302628', NULL, 'participant', 'd818ac6a86cf1a64d2184bf0699d67a8', NULL, '302599'); -- ---------------------------- -- Table structure for act_hi_procinst -- ---------------------------- DROP TABLE IF EXISTS `act_hi_procinst`; -CREATE TABLE `act_hi_procinst` ( - `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `BUSINESS_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `START_TIME_` datetime(3) NOT NULL, - `END_TIME_` datetime(3) NULL DEFAULT NULL, - `DURATION_` bigint(20) NULL DEFAULT NULL, - `START_USER_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `START_ACT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `END_ACT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `SUPER_PROCESS_INSTANCE_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `DELETE_REASON_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '', - `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - PRIMARY KEY (`ID_`) USING BTREE, - UNIQUE INDEX `PROC_INST_ID_`(`PROC_INST_ID_`) USING BTREE, - INDEX `ACT_IDX_HI_PRO_INST_END`(`END_TIME_`) USING BTREE, - INDEX `ACT_IDX_HI_PRO_I_BUSKEY`(`BUSINESS_KEY_`) USING BTREE +CREATE TABLE `act_hi_procinst` +( + `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `BUSINESS_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `START_TIME_` datetime(3) NOT NULL, + `END_TIME_` datetime(3) NULL DEFAULT NULL, + `DURATION_` bigint(20) NULL DEFAULT NULL, + `START_USER_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `START_ACT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `END_ACT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `SUPER_PROCESS_INSTANCE_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `DELETE_REASON_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '', + `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + UNIQUE INDEX `PROC_INST_ID_`(`PROC_INST_ID_`) USING BTREE, + INDEX `ACT_IDX_HI_PRO_INST_END`(`END_TIME_`) USING BTREE, + INDEX `ACT_IDX_HI_PRO_I_BUSKEY`(`BUSINESS_KEY_`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of act_hi_procinst -- ---------------------------- -INSERT INTO `act_hi_procinst` VALUES ('247552', '247552', NULL, 'process_leave:1:247536', '2018-06-14 23:44:03.000', NULL, NULL, NULL, 'start', NULL, NULL, NULL, '', NULL); -INSERT INTO `act_hi_procinst` VALUES ('302556', '302556', NULL, 'process_leave:1:302555', '2022-03-31 10:59:17.000', NULL, NULL, NULL, 'start', NULL, NULL, NULL, '', NULL); -INSERT INTO `act_hi_procinst` VALUES ('302599', '302599', NULL, 'process_leave:1:302555', '2022-03-31 11:16:00.000', NULL, NULL, NULL, 'start', NULL, NULL, NULL, '', NULL); +INSERT INTO `act_hi_procinst` +VALUES ('247552', '247552', NULL, 'process_leave:1:247536', '2018-06-14 23:44:03.000', NULL, NULL, NULL, 'start', NULL, + NULL, NULL, '', NULL); +INSERT INTO `act_hi_procinst` +VALUES ('302556', '302556', NULL, 'process_leave:1:302555', '2022-03-31 10:59:17.000', NULL, NULL, NULL, 'start', NULL, + NULL, NULL, '', NULL); +INSERT INTO `act_hi_procinst` +VALUES ('302599', '302599', NULL, 'process_leave:1:302555', '2022-03-31 11:16:00.000', NULL, NULL, NULL, 'start', NULL, + NULL, NULL, '', NULL); -- ---------------------------- -- Table structure for act_hi_taskinst -- ---------------------------- DROP TABLE IF EXISTS `act_hi_taskinst`; -CREATE TABLE `act_hi_taskinst` ( - `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `TASK_DEF_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `PARENT_TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `DESCRIPTION_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `OWNER_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `ASSIGNEE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `START_TIME_` datetime(3) NOT NULL, - `CLAIM_TIME_` datetime(3) NULL DEFAULT NULL, - `END_TIME_` datetime(3) NULL DEFAULT NULL, - `DURATION_` bigint(20) NULL DEFAULT NULL, - `DELETE_REASON_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `PRIORITY_` int(11) NULL DEFAULT NULL, - `DUE_DATE_` datetime(3) NULL DEFAULT NULL, - `FORM_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `CATEGORY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '', - PRIMARY KEY (`ID_`) USING BTREE, - INDEX `ACT_IDX_HI_TASK_INST_PROCINST`(`PROC_INST_ID_`) USING BTREE +CREATE TABLE `act_hi_taskinst` +( + `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TASK_DEF_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `PARENT_TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `DESCRIPTION_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `OWNER_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `ASSIGNEE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `START_TIME_` datetime(3) NOT NULL, + `CLAIM_TIME_` datetime(3) NULL DEFAULT NULL, + `END_TIME_` datetime(3) NULL DEFAULT NULL, + `DURATION_` bigint(20) NULL DEFAULT NULL, + `DELETE_REASON_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `PRIORITY_` int(11) NULL DEFAULT NULL, + `DUE_DATE_` datetime(3) NULL DEFAULT NULL, + `FORM_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `CATEGORY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '', + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_HI_TASK_INST_PROCINST`(`PROC_INST_ID_`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of act_hi_taskinst -- ---------------------------- -INSERT INTO `act_hi_taskinst` VALUES ('247560', 'process_leave:1:247536', 'user1', '247552', '247552', '经理审批', NULL, NULL, NULL, NULL, '2018-06-14 23:44:03.000', NULL, NULL, NULL, NULL, 50, NULL, NULL, NULL, ''); -INSERT INTO `act_hi_taskinst` VALUES ('302566', 'process_leave:1:302555', 'user1', '302556', '302556', '经理审批', NULL, NULL, NULL, '0b7625fedaa05e85f282486e1c9c91b9', '2022-03-31 10:59:17.000', NULL, '2022-03-31 11:04:52.000', 335519, 'completed', 50, NULL, NULL, NULL, ''); -INSERT INTO `act_hi_taskinst` VALUES ('302584', 'process_leave:1:302555', 'allmanager', '302556', '302580', '总经理审批', NULL, NULL, NULL, 'd818ac6a86cf1a64d2184bf0699d67a8', '2022-03-31 11:04:52.000', NULL, '2022-03-31 11:05:44.000', 52287, 'completed', 50, NULL, NULL, NULL, ''); -INSERT INTO `act_hi_taskinst` VALUES ('302595', 'process_leave:1:302555', 'user2', '302556', '302556', '人事审批', NULL, NULL, NULL, '98b051b03681de6028993a5d14ac93cb', '2022-03-31 11:05:44.000', NULL, NULL, NULL, NULL, 50, NULL, NULL, NULL, ''); -INSERT INTO `act_hi_taskinst` VALUES ('302609', 'process_leave:1:302555', 'user1', '302599', '302599', '经理审批', NULL, NULL, NULL, '0b7625fedaa05e85f282486e1c9c91b9', '2022-03-31 11:16:00.000', NULL, '2022-03-31 11:18:00.000', 120347, 'completed', 50, NULL, NULL, NULL, ''); -INSERT INTO `act_hi_taskinst` VALUES ('302627', 'process_leave:1:302555', 'allmanager', '302599', '302623', '总经理审批', NULL, NULL, NULL, 'd818ac6a86cf1a64d2184bf0699d67a8', '2022-03-31 11:18:00.000', NULL, NULL, NULL, NULL, 50, NULL, NULL, NULL, ''); +INSERT INTO `act_hi_taskinst` +VALUES ('247560', 'process_leave:1:247536', 'user1', '247552', '247552', '经理审批', NULL, NULL, NULL, NULL, + '2018-06-14 23:44:03.000', NULL, NULL, NULL, NULL, 50, NULL, NULL, NULL, ''); +INSERT INTO `act_hi_taskinst` +VALUES ('302566', 'process_leave:1:302555', 'user1', '302556', '302556', '经理审批', NULL, NULL, NULL, + '0b7625fedaa05e85f282486e1c9c91b9', '2022-03-31 10:59:17.000', NULL, '2022-03-31 11:04:52.000', 335519, + 'completed', 50, NULL, NULL, NULL, ''); +INSERT INTO `act_hi_taskinst` +VALUES ('302584', 'process_leave:1:302555', 'allmanager', '302556', '302580', '总经理审批', NULL, NULL, NULL, + 'd818ac6a86cf1a64d2184bf0699d67a8', '2022-03-31 11:04:52.000', NULL, '2022-03-31 11:05:44.000', 52287, + 'completed', 50, NULL, NULL, NULL, ''); +INSERT INTO `act_hi_taskinst` +VALUES ('302595', 'process_leave:1:302555', 'user2', '302556', '302556', '人事审批', NULL, NULL, NULL, + '98b051b03681de6028993a5d14ac93cb', '2022-03-31 11:05:44.000', NULL, NULL, NULL, NULL, 50, NULL, NULL, NULL, + ''); +INSERT INTO `act_hi_taskinst` +VALUES ('302609', 'process_leave:1:302555', 'user1', '302599', '302599', '经理审批', NULL, NULL, NULL, + '0b7625fedaa05e85f282486e1c9c91b9', '2022-03-31 11:16:00.000', NULL, '2022-03-31 11:18:00.000', 120347, + 'completed', 50, NULL, NULL, NULL, ''); +INSERT INTO `act_hi_taskinst` +VALUES ('302627', 'process_leave:1:302555', 'allmanager', '302599', '302623', '总经理审批', NULL, NULL, NULL, + 'd818ac6a86cf1a64d2184bf0699d67a8', '2022-03-31 11:18:00.000', NULL, NULL, NULL, NULL, 50, NULL, NULL, NULL, + ''); -- ---------------------------- -- Table structure for act_hi_varinst -- ---------------------------- DROP TABLE IF EXISTS `act_hi_varinst`; -CREATE TABLE `act_hi_varinst` ( - `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `VAR_TYPE_` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `REV_` int(11) NULL DEFAULT NULL, - `BYTEARRAY_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `DOUBLE_` double NULL DEFAULT NULL, - `LONG_` bigint(20) NULL DEFAULT NULL, - `TEXT_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `TEXT2_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `CREATE_TIME_` datetime(3) NULL DEFAULT NULL, - `LAST_UPDATED_TIME_` datetime(3) NULL DEFAULT NULL, - PRIMARY KEY (`ID_`) USING BTREE, - INDEX `ACT_IDX_HI_PROCVAR_PROC_INST`(`PROC_INST_ID_`) USING BTREE, - INDEX `ACT_IDX_HI_PROCVAR_NAME_TYPE`(`NAME_`, `VAR_TYPE_`) USING BTREE, - INDEX `ACT_IDX_HI_PROCVAR_TASK_ID`(`TASK_ID_`) USING BTREE +CREATE TABLE `act_hi_varinst` +( + `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `VAR_TYPE_` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `REV_` int(11) NULL DEFAULT NULL, + `BYTEARRAY_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `DOUBLE_` double NULL DEFAULT NULL, + `LONG_` bigint(20) NULL DEFAULT NULL, + `TEXT_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TEXT2_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `CREATE_TIME_` datetime(3) NULL DEFAULT NULL, + `LAST_UPDATED_TIME_` datetime(3) NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_HI_PROCVAR_PROC_INST`(`PROC_INST_ID_`) USING BTREE, + INDEX `ACT_IDX_HI_PROCVAR_NAME_TYPE`(`NAME_`, `VAR_TYPE_`) USING BTREE, + INDEX `ACT_IDX_HI_PROCVAR_TASK_ID`(`TASK_ID_`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of act_hi_varinst -- ---------------------------- -INSERT INTO `act_hi_varinst` VALUES ('247555', '247552', '247552', NULL, 'userLeave', 'serializable', 0, '247556', NULL, NULL, NULL, NULL, '2018-06-14 23:44:03.000', '2018-06-14 23:44:03.000'); -INSERT INTO `act_hi_varinst` VALUES ('302559', '302556', '302556', NULL, 'baseTask', 'serializable', 0, '302560', NULL, NULL, NULL, NULL, '2022-03-31 10:59:17.000', '2022-03-31 10:59:17.000'); -INSERT INTO `act_hi_varinst` VALUES ('302563', '302556', '302556', NULL, 'day', 'integer', 2, NULL, NULL, 3, '3', NULL, '2022-03-31 10:59:17.000', '2022-03-31 11:05:44.000'); -INSERT INTO `act_hi_varinst` VALUES ('302569', '302556', '302556', NULL, 'flag', 'boolean', 1, NULL, NULL, 1, NULL, NULL, '2022-03-31 11:04:52.000', '2022-03-31 11:05:44.000'); -INSERT INTO `act_hi_varinst` VALUES ('302571', '302556', '302556', NULL, 'needfinish', 'integer', 1, NULL, NULL, 1, '1', NULL, '2022-03-31 11:04:52.000', '2022-03-31 11:05:44.000'); -INSERT INTO `act_hi_varinst` VALUES ('302574', '302556', '302556', NULL, 'leaveOpinionList', 'serializable', 1, '302575', NULL, NULL, NULL, NULL, '2022-03-31 11:04:52.000', '2022-03-31 11:05:44.000'); -INSERT INTO `act_hi_varinst` VALUES ('302602', '302599', '302599', NULL, 'baseTask', 'serializable', 0, '302603', NULL, NULL, NULL, NULL, '2022-03-31 11:16:00.000', '2022-03-31 11:16:00.000'); -INSERT INTO `act_hi_varinst` VALUES ('302606', '302599', '302599', NULL, 'day', 'integer', 1, NULL, NULL, 5, '5', NULL, '2022-03-31 11:16:00.000', '2022-03-31 11:18:00.000'); -INSERT INTO `act_hi_varinst` VALUES ('302612', '302599', '302599', NULL, 'flag', 'boolean', 0, NULL, NULL, 1, NULL, NULL, '2022-03-31 11:18:00.000', '2022-03-31 11:18:00.000'); -INSERT INTO `act_hi_varinst` VALUES ('302614', '302599', '302599', NULL, 'needfinish', 'integer', 0, NULL, NULL, 1, '1', NULL, '2022-03-31 11:18:00.000', '2022-03-31 11:18:00.000'); -INSERT INTO `act_hi_varinst` VALUES ('302617', '302599', '302599', NULL, 'leaveOpinionList', 'serializable', 0, '302618', NULL, NULL, NULL, NULL, '2022-03-31 11:18:00.000', '2022-03-31 11:18:00.000'); +INSERT INTO `act_hi_varinst` +VALUES ('247555', '247552', '247552', NULL, 'userLeave', 'serializable', 0, '247556', NULL, NULL, NULL, NULL, + '2018-06-14 23:44:03.000', '2018-06-14 23:44:03.000'); +INSERT INTO `act_hi_varinst` +VALUES ('302559', '302556', '302556', NULL, 'baseTask', 'serializable', 0, '302560', NULL, NULL, NULL, NULL, + '2022-03-31 10:59:17.000', '2022-03-31 10:59:17.000'); +INSERT INTO `act_hi_varinst` +VALUES ('302563', '302556', '302556', NULL, 'day', 'integer', 2, NULL, NULL, 3, '3', NULL, '2022-03-31 10:59:17.000', + '2022-03-31 11:05:44.000'); +INSERT INTO `act_hi_varinst` +VALUES ('302569', '302556', '302556', NULL, 'flag', 'boolean', 1, NULL, NULL, 1, NULL, NULL, '2022-03-31 11:04:52.000', + '2022-03-31 11:05:44.000'); +INSERT INTO `act_hi_varinst` +VALUES ('302571', '302556', '302556', NULL, 'needfinish', 'integer', 1, NULL, NULL, 1, '1', NULL, + '2022-03-31 11:04:52.000', '2022-03-31 11:05:44.000'); +INSERT INTO `act_hi_varinst` +VALUES ('302574', '302556', '302556', NULL, 'leaveOpinionList', 'serializable', 1, '302575', NULL, NULL, NULL, NULL, + '2022-03-31 11:04:52.000', '2022-03-31 11:05:44.000'); +INSERT INTO `act_hi_varinst` +VALUES ('302602', '302599', '302599', NULL, 'baseTask', 'serializable', 0, '302603', NULL, NULL, NULL, NULL, + '2022-03-31 11:16:00.000', '2022-03-31 11:16:00.000'); +INSERT INTO `act_hi_varinst` +VALUES ('302606', '302599', '302599', NULL, 'day', 'integer', 1, NULL, NULL, 5, '5', NULL, '2022-03-31 11:16:00.000', + '2022-03-31 11:18:00.000'); +INSERT INTO `act_hi_varinst` +VALUES ('302612', '302599', '302599', NULL, 'flag', 'boolean', 0, NULL, NULL, 1, NULL, NULL, '2022-03-31 11:18:00.000', + '2022-03-31 11:18:00.000'); +INSERT INTO `act_hi_varinst` +VALUES ('302614', '302599', '302599', NULL, 'needfinish', 'integer', 0, NULL, NULL, 1, '1', NULL, + '2022-03-31 11:18:00.000', '2022-03-31 11:18:00.000'); +INSERT INTO `act_hi_varinst` +VALUES ('302617', '302599', '302599', NULL, 'leaveOpinionList', 'serializable', 0, '302618', NULL, NULL, NULL, NULL, + '2022-03-31 11:18:00.000', '2022-03-31 11:18:00.000'); -- ---------------------------- -- Table structure for act_id_group -- ---------------------------- DROP TABLE IF EXISTS `act_id_group`; -CREATE TABLE `act_id_group` ( - `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `REV_` int(11) NULL DEFAULT NULL, - `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - PRIMARY KEY (`ID_`) USING BTREE +CREATE TABLE `act_id_group` +( + `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `REV_` int(11) NULL DEFAULT NULL, + `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of act_id_group -- ---------------------------- -INSERT INTO `act_id_group` VALUES ('023366f3457511e8bcf1309c2315f9aa', 1, 'hr', NULL); -INSERT INTO `act_id_group` VALUES ('0ea934e5e55411e7b983201a068c6482', 1, 'manage', NULL); -INSERT INTO `act_id_group` VALUES ('2619a672e53811e7b983201a068c6482', 1, 'admin', NULL); -INSERT INTO `act_id_group` VALUES ('4bb891d8caf84cc6ba27e515e80ac40d', 1, 'blogAdmin', NULL); -INSERT INTO `act_id_group` VALUES ('dcb0f642fe9611e7b472201a068c6482', 1, 'dev', NULL); -INSERT INTO `act_id_group` VALUES ('e346e96368484c8fa7f217ce550a0186', 1, 'DeputyManager', NULL); +INSERT INTO `act_id_group` +VALUES ('023366f3457511e8bcf1309c2315f9aa', 1, 'hr', NULL); +INSERT INTO `act_id_group` +VALUES ('0ea934e5e55411e7b983201a068c6482', 1, 'manage', NULL); +INSERT INTO `act_id_group` +VALUES ('2619a672e53811e7b983201a068c6482', 1, 'admin', NULL); +INSERT INTO `act_id_group` +VALUES ('4bb891d8caf84cc6ba27e515e80ac40d', 1, 'blogAdmin', NULL); +INSERT INTO `act_id_group` +VALUES ('dcb0f642fe9611e7b472201a068c6482', 1, 'dev', NULL); +INSERT INTO `act_id_group` +VALUES ('e346e96368484c8fa7f217ce550a0186', 1, 'DeputyManager', NULL); -- ---------------------------- -- Table structure for act_id_info -- ---------------------------- DROP TABLE IF EXISTS `act_id_info`; -CREATE TABLE `act_id_info` ( - `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `REV_` int(11) NULL DEFAULT NULL, - `USER_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `TYPE_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `VALUE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `PASSWORD_` longblob NULL, - `PARENT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - PRIMARY KEY (`ID_`) USING BTREE +CREATE TABLE `act_id_info` +( + `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `REV_` int(11) NULL DEFAULT NULL, + `USER_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TYPE_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `VALUE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `PASSWORD_` longblob NULL, + `PARENT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for act_id_membership -- ---------------------------- DROP TABLE IF EXISTS `act_id_membership`; -CREATE TABLE `act_id_membership` ( - `USER_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `GROUP_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - PRIMARY KEY (`USER_ID_`, `GROUP_ID_`) USING BTREE, - INDEX `ACT_FK_MEMB_GROUP`(`GROUP_ID_`) USING BTREE, - CONSTRAINT `ACT_FK_MEMB_GROUP` FOREIGN KEY (`GROUP_ID_`) REFERENCES `act_id_group` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, - CONSTRAINT `ACT_FK_MEMB_USER` FOREIGN KEY (`USER_ID_`) REFERENCES `act_id_user` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT +CREATE TABLE `act_id_membership` +( + `USER_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `GROUP_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + PRIMARY KEY (`USER_ID_`, `GROUP_ID_`) USING BTREE, + INDEX `ACT_FK_MEMB_GROUP`(`GROUP_ID_`) USING BTREE, + CONSTRAINT `ACT_FK_MEMB_GROUP` FOREIGN KEY (`GROUP_ID_`) REFERENCES `act_id_group` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_MEMB_USER` FOREIGN KEY (`USER_ID_`) REFERENCES `act_id_user` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of act_id_membership -- ---------------------------- -INSERT INTO `act_id_membership` VALUES ('98b051b03681de6028993a5d14ac93cb', '023366f3457511e8bcf1309c2315f9aa'); -INSERT INTO `act_id_membership` VALUES ('d818ac6a86cf1a64d2184bf0699d67a8', '0ea934e5e55411e7b983201a068c6482'); -INSERT INTO `act_id_membership` VALUES ('acfc0e9232f54732a5d9ffe9071bf572', '2619a672e53811e7b983201a068c6482'); -INSERT INTO `act_id_membership` VALUES ('acfc0e9232f54732a5d9ffe9071bf572', '4bb891d8caf84cc6ba27e515e80ac40d'); -INSERT INTO `act_id_membership` VALUES ('5946a985f733c57f1ab71689f7b6aeea', 'dcb0f642fe9611e7b472201a068c6482'); -INSERT INTO `act_id_membership` VALUES ('0b7625fedaa05e85f282486e1c9c91b9', 'e346e96368484c8fa7f217ce550a0186'); +INSERT INTO `act_id_membership` +VALUES ('98b051b03681de6028993a5d14ac93cb', '023366f3457511e8bcf1309c2315f9aa'); +INSERT INTO `act_id_membership` +VALUES ('d818ac6a86cf1a64d2184bf0699d67a8', '0ea934e5e55411e7b983201a068c6482'); +INSERT INTO `act_id_membership` +VALUES ('acfc0e9232f54732a5d9ffe9071bf572', '2619a672e53811e7b983201a068c6482'); +INSERT INTO `act_id_membership` +VALUES ('acfc0e9232f54732a5d9ffe9071bf572', '4bb891d8caf84cc6ba27e515e80ac40d'); +INSERT INTO `act_id_membership` +VALUES ('5946a985f733c57f1ab71689f7b6aeea', 'dcb0f642fe9611e7b472201a068c6482'); +INSERT INTO `act_id_membership` +VALUES ('0b7625fedaa05e85f282486e1c9c91b9', 'e346e96368484c8fa7f217ce550a0186'); -- ---------------------------- -- Table structure for act_id_user -- ---------------------------- DROP TABLE IF EXISTS `act_id_user`; -CREATE TABLE `act_id_user` ( - `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `REV_` int(11) NULL DEFAULT NULL, - `FIRST_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `LAST_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `EMAIL_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `PWD_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `PICTURE_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - PRIMARY KEY (`ID_`) USING BTREE +CREATE TABLE `act_id_user` +( + `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `REV_` int(11) NULL DEFAULT NULL, + `FIRST_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `LAST_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `EMAIL_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `PWD_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `PICTURE_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of act_id_user -- ---------------------------- -INSERT INTO `act_id_user` VALUES ('0b7625fedaa05e85f282486e1c9c91b9', 1, NULL, NULL, '11@qq.com', NULL, NULL); -INSERT INTO `act_id_user` VALUES ('5946a985f733c57f1ab71689f7b6aeea', 1, NULL, NULL, '11@qq.com', NULL, NULL); -INSERT INTO `act_id_user` VALUES ('98b051b03681de6028993a5d14ac93cb', 1, NULL, NULL, '11@qq.com', NULL, NULL); -INSERT INTO `act_id_user` VALUES ('acfc0e9232f54732a5d9ffe9071bf572', 1, NULL, NULL, '', NULL, NULL); -INSERT INTO `act_id_user` VALUES ('d818ac6a86cf1a64d2184bf0699d67a8', 1, NULL, NULL, '11@qq.com', NULL, NULL); +INSERT INTO `act_id_user` +VALUES ('0b7625fedaa05e85f282486e1c9c91b9', 1, NULL, NULL, '11@qq.com', NULL, NULL); +INSERT INTO `act_id_user` +VALUES ('5946a985f733c57f1ab71689f7b6aeea', 1, NULL, NULL, '11@qq.com', NULL, NULL); +INSERT INTO `act_id_user` +VALUES ('98b051b03681de6028993a5d14ac93cb', 1, NULL, NULL, '11@qq.com', NULL, NULL); +INSERT INTO `act_id_user` +VALUES ('acfc0e9232f54732a5d9ffe9071bf572', 1, NULL, NULL, '', NULL, NULL); +INSERT INTO `act_id_user` +VALUES ('d818ac6a86cf1a64d2184bf0699d67a8', 1, NULL, NULL, '11@qq.com', NULL, NULL); -- ---------------------------- -- Table structure for act_procdef_info -- ---------------------------- DROP TABLE IF EXISTS `act_procdef_info`; -CREATE TABLE `act_procdef_info` ( - `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `REV_` int(11) NULL DEFAULT NULL, - `INFO_JSON_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - PRIMARY KEY (`ID_`) USING BTREE, - UNIQUE INDEX `ACT_UNIQ_INFO_PROCDEF`(`PROC_DEF_ID_`) USING BTREE, - INDEX `ACT_IDX_INFO_PROCDEF`(`PROC_DEF_ID_`) USING BTREE, - INDEX `ACT_FK_INFO_JSON_BA`(`INFO_JSON_ID_`) USING BTREE, - CONSTRAINT `ACT_FK_INFO_JSON_BA` FOREIGN KEY (`INFO_JSON_ID_`) REFERENCES `act_ge_bytearray` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, - CONSTRAINT `ACT_FK_INFO_PROCDEF` FOREIGN KEY (`PROC_DEF_ID_`) REFERENCES `act_re_procdef` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT +CREATE TABLE `act_procdef_info` +( + `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `REV_` int(11) NULL DEFAULT NULL, + `INFO_JSON_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + UNIQUE INDEX `ACT_UNIQ_INFO_PROCDEF`(`PROC_DEF_ID_`) USING BTREE, + INDEX `ACT_IDX_INFO_PROCDEF`(`PROC_DEF_ID_`) USING BTREE, + INDEX `ACT_FK_INFO_JSON_BA`(`INFO_JSON_ID_`) USING BTREE, + CONSTRAINT `ACT_FK_INFO_JSON_BA` FOREIGN KEY (`INFO_JSON_ID_`) REFERENCES `act_ge_bytearray` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_INFO_PROCDEF` FOREIGN KEY (`PROC_DEF_ID_`) REFERENCES `act_re_procdef` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for act_re_deployment -- ---------------------------- DROP TABLE IF EXISTS `act_re_deployment`; -CREATE TABLE `act_re_deployment` ( - `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `CATEGORY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '', - `DEPLOY_TIME_` timestamp(3) NULL DEFAULT NULL, - PRIMARY KEY (`ID_`) USING BTREE +CREATE TABLE `act_re_deployment` +( + `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `CATEGORY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '', + `DEPLOY_TIME_` timestamp(3) NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of act_re_deployment -- ---------------------------- -INSERT INTO `act_re_deployment` VALUES ('247533', '请假流程', NULL, '', '2018-06-14 23:37:51.000'); -INSERT INTO `act_re_deployment` VALUES ('302552', '请假流程', NULL, '', '2022-03-31 10:58:53.000'); +INSERT INTO `act_re_deployment` +VALUES ('247533', '请假流程', NULL, '', '2018-06-14 23:37:51.000'); +INSERT INTO `act_re_deployment` +VALUES ('302552', '请假流程', NULL, '', '2022-03-31 10:58:53.000'); -- ---------------------------- -- Table structure for act_re_model -- ---------------------------- DROP TABLE IF EXISTS `act_re_model`; -CREATE TABLE `act_re_model` ( - `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `REV_` int(11) NULL DEFAULT NULL, - `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `CATEGORY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `CREATE_TIME_` timestamp(3) NULL DEFAULT NULL, - `LAST_UPDATE_TIME_` timestamp(3) NULL DEFAULT NULL, - `VERSION_` int(11) NULL DEFAULT NULL, - `META_INFO_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `DEPLOYMENT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `EDITOR_SOURCE_VALUE_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `EDITOR_SOURCE_EXTRA_VALUE_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '', - PRIMARY KEY (`ID_`) USING BTREE, - INDEX `ACT_FK_MODEL_SOURCE`(`EDITOR_SOURCE_VALUE_ID_`) USING BTREE, - INDEX `ACT_FK_MODEL_SOURCE_EXTRA`(`EDITOR_SOURCE_EXTRA_VALUE_ID_`) USING BTREE, - INDEX `ACT_FK_MODEL_DEPLOYMENT`(`DEPLOYMENT_ID_`) USING BTREE, - CONSTRAINT `ACT_FK_MODEL_DEPLOYMENT` FOREIGN KEY (`DEPLOYMENT_ID_`) REFERENCES `act_re_deployment` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, - CONSTRAINT `ACT_FK_MODEL_SOURCE` FOREIGN KEY (`EDITOR_SOURCE_VALUE_ID_`) REFERENCES `act_ge_bytearray` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, - CONSTRAINT `ACT_FK_MODEL_SOURCE_EXTRA` FOREIGN KEY (`EDITOR_SOURCE_EXTRA_VALUE_ID_`) REFERENCES `act_ge_bytearray` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT +CREATE TABLE `act_re_model` +( + `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `REV_` int(11) NULL DEFAULT NULL, + `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `CATEGORY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `CREATE_TIME_` timestamp(3) NULL DEFAULT NULL, + `LAST_UPDATE_TIME_` timestamp(3) NULL DEFAULT NULL, + `VERSION_` int(11) NULL DEFAULT NULL, + `META_INFO_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `DEPLOYMENT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `EDITOR_SOURCE_VALUE_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `EDITOR_SOURCE_EXTRA_VALUE_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '', + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_FK_MODEL_SOURCE`(`EDITOR_SOURCE_VALUE_ID_`) USING BTREE, + INDEX `ACT_FK_MODEL_SOURCE_EXTRA`(`EDITOR_SOURCE_EXTRA_VALUE_ID_`) USING BTREE, + INDEX `ACT_FK_MODEL_DEPLOYMENT`(`DEPLOYMENT_ID_`) USING BTREE, + CONSTRAINT `ACT_FK_MODEL_DEPLOYMENT` FOREIGN KEY (`DEPLOYMENT_ID_`) REFERENCES `act_re_deployment` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_MODEL_SOURCE` FOREIGN KEY (`EDITOR_SOURCE_VALUE_ID_`) REFERENCES `act_ge_bytearray` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_MODEL_SOURCE_EXTRA` FOREIGN KEY (`EDITOR_SOURCE_EXTRA_VALUE_ID_`) REFERENCES `act_ge_bytearray` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of act_re_model -- ---------------------------- -INSERT INTO `act_re_model` VALUES ('142517', 75, '请假流程', 'processKey', NULL, '2018-01-25 17:21:39.000', '2022-03-31 10:58:54.000', 1, '{\"name\":\"请假流程\",\"description\":\"\"}', '302552', '142518', '142519', ''); -INSERT INTO `act_re_model` VALUES ('212510', 11, '测试流程', 'processKey', NULL, '2018-04-27 19:57:22.000', '2018-12-11 23:10:00.000', 1, '{\"name\":\"测试流程\",\"description\":\"\"}', NULL, '212511', '212512', ''); -INSERT INTO `act_re_model` VALUES ('302597', 4, '新建流程', 'processKey', NULL, '2022-03-31 11:08:57.000', '2022-03-31 11:32:34.000', 1, '{\"name\":\"新建流程\",\"description\":\"\"}', NULL, '302598', '302633', ''); -INSERT INTO `act_re_model` VALUES ('302629', 2, '新建流程', 'processKey', NULL, '2022-03-31 11:25:58.000', '2022-03-31 11:25:58.000', 1, '{\"name\":\"新建流程\",\"description\":\"\",\"revision\":1}', NULL, '302630', NULL, ''); -INSERT INTO `act_re_model` VALUES ('302631', 2, '新建流程', 'processKey', NULL, '2022-03-31 11:31:43.000', '2022-03-31 11:31:43.000', 1, '{\"name\":\"新建流程\",\"description\":\"\",\"revision\":1}', NULL, '302632', NULL, ''); -INSERT INTO `act_re_model` VALUES ('302634', 2, '新建流程', 'processKey', NULL, '2022-03-31 11:39:26.000', '2022-03-31 11:39:26.000', 1, '{\"name\":\"新建流程\",\"description\":\"\",\"revision\":1}', NULL, '302635', NULL, ''); +INSERT INTO `act_re_model` +VALUES ('142517', 75, '请假流程', 'processKey', NULL, '2018-01-25 17:21:39.000', '2022-03-31 10:58:54.000', 1, + '{\"name\":\"请假流程\",\"description\":\"\"}', '302552', '142518', '142519', ''); +INSERT INTO `act_re_model` +VALUES ('212510', 11, '测试流程', 'processKey', NULL, '2018-04-27 19:57:22.000', '2018-12-11 23:10:00.000', 1, + '{\"name\":\"测试流程\",\"description\":\"\"}', NULL, '212511', '212512', ''); +INSERT INTO `act_re_model` +VALUES ('302597', 4, '新建流程', 'processKey', NULL, '2022-03-31 11:08:57.000', '2022-03-31 11:32:34.000', 1, + '{\"name\":\"新建流程\",\"description\":\"\"}', NULL, '302598', '302633', ''); +INSERT INTO `act_re_model` +VALUES ('302629', 2, '新建流程', 'processKey', NULL, '2022-03-31 11:25:58.000', '2022-03-31 11:25:58.000', 1, + '{\"name\":\"新建流程\",\"description\":\"\",\"revision\":1}', NULL, '302630', NULL, ''); +INSERT INTO `act_re_model` +VALUES ('302631', 2, '新建流程', 'processKey', NULL, '2022-03-31 11:31:43.000', '2022-03-31 11:31:43.000', 1, + '{\"name\":\"新建流程\",\"description\":\"\",\"revision\":1}', NULL, '302632', NULL, ''); +INSERT INTO `act_re_model` +VALUES ('302634', 2, '新建流程', 'processKey', NULL, '2022-03-31 11:39:26.000', '2022-03-31 11:39:26.000', 1, + '{\"name\":\"新建流程\",\"description\":\"\",\"revision\":1}', NULL, '302635', NULL, ''); -- ---------------------------- -- Table structure for act_re_procdef -- ---------------------------- DROP TABLE IF EXISTS `act_re_procdef`; -CREATE TABLE `act_re_procdef` ( - `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `REV_` int(11) NULL DEFAULT NULL, - `CATEGORY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `VERSION_` int(11) NOT NULL, - `DEPLOYMENT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `RESOURCE_NAME_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `DGRM_RESOURCE_NAME_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `DESCRIPTION_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `HAS_START_FORM_KEY_` tinyint(4) NULL DEFAULT NULL, - `HAS_GRAPHICAL_NOTATION_` tinyint(4) NULL DEFAULT NULL, - `SUSPENSION_STATE_` int(11) NULL DEFAULT NULL, - `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '', - PRIMARY KEY (`ID_`) USING BTREE, - UNIQUE INDEX `ACT_UNIQ_PROCDEF`(`KEY_`, `VERSION_`, `TENANT_ID_`) USING BTREE +CREATE TABLE `act_re_procdef` +( + `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `REV_` int(11) NULL DEFAULT NULL, + `CATEGORY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `VERSION_` int(11) NOT NULL, + `DEPLOYMENT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `RESOURCE_NAME_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `DGRM_RESOURCE_NAME_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `DESCRIPTION_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `HAS_START_FORM_KEY_` tinyint(4) NULL DEFAULT NULL, + `HAS_GRAPHICAL_NOTATION_` tinyint(4) NULL DEFAULT NULL, + `SUSPENSION_STATE_` int(11) NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '', + PRIMARY KEY (`ID_`) USING BTREE, + UNIQUE INDEX `ACT_UNIQ_PROCDEF`(`KEY_`, `VERSION_`, `TENANT_ID_`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of act_re_procdef -- ---------------------------- -INSERT INTO `act_re_procdef` VALUES ('process_leave:1:302555', 1, 'http://www.activiti.org/processdef', '请假流程', 'process_leave', 1, '302552', '请假流程.bpmn20.xml', '请假流程.process_leave.png', NULL, 0, 1, 1, ''); +INSERT INTO `act_re_procdef` +VALUES ('process_leave:1:302555', 1, 'http://www.activiti.org/processdef', '请假流程', 'process_leave', 1, '302552', + '请假流程.bpmn20.xml', '请假流程.process_leave.png', NULL, 0, 1, 1, ''); -- ---------------------------- -- Table structure for act_ru_event_subscr -- ---------------------------- DROP TABLE IF EXISTS `act_ru_event_subscr`; -CREATE TABLE `act_ru_event_subscr` ( - `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `REV_` int(11) NULL DEFAULT NULL, - `EVENT_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `EVENT_NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `ACTIVITY_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `CONFIGURATION_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `CREATED_` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '', - PRIMARY KEY (`ID_`) USING BTREE, - INDEX `ACT_IDX_EVENT_SUBSCR_CONFIG_`(`CONFIGURATION_`) USING BTREE, - INDEX `ACT_FK_EVENT_EXEC`(`EXECUTION_ID_`) USING BTREE, - CONSTRAINT `ACT_FK_EVENT_EXEC` FOREIGN KEY (`EXECUTION_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT +CREATE TABLE `act_ru_event_subscr` +( + `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `REV_` int(11) NULL DEFAULT NULL, + `EVENT_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `EVENT_NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `ACTIVITY_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `CONFIGURATION_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `CREATED_` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '', + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_EVENT_SUBSCR_CONFIG_`(`CONFIGURATION_`) USING BTREE, + INDEX `ACT_FK_EVENT_EXEC`(`EXECUTION_ID_`) USING BTREE, + CONSTRAINT `ACT_FK_EVENT_EXEC` FOREIGN KEY (`EXECUTION_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for act_ru_execution -- ---------------------------- DROP TABLE IF EXISTS `act_ru_execution`; -CREATE TABLE `act_ru_execution` ( - `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `REV_` int(11) NULL DEFAULT NULL, - `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `BUSINESS_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `PARENT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `SUPER_EXEC_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `ACT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `IS_ACTIVE_` tinyint(4) NULL DEFAULT NULL, - `IS_CONCURRENT_` tinyint(4) NULL DEFAULT NULL, - `IS_SCOPE_` tinyint(4) NULL DEFAULT NULL, - `IS_EVENT_SCOPE_` tinyint(4) NULL DEFAULT NULL, - `SUSPENSION_STATE_` int(11) NULL DEFAULT NULL, - `CACHED_ENT_STATE_` int(11) NULL DEFAULT NULL, - `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '', - `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `LOCK_TIME_` timestamp(3) NULL DEFAULT NULL, - PRIMARY KEY (`ID_`) USING BTREE, - INDEX `ACT_IDX_EXEC_BUSKEY`(`BUSINESS_KEY_`) USING BTREE, - INDEX `ACT_FK_EXE_PROCINST`(`PROC_INST_ID_`) USING BTREE, - INDEX `ACT_FK_EXE_PARENT`(`PARENT_ID_`) USING BTREE, - INDEX `ACT_FK_EXE_SUPER`(`SUPER_EXEC_`) USING BTREE, - INDEX `ACT_FK_EXE_PROCDEF`(`PROC_DEF_ID_`) USING BTREE, - CONSTRAINT `ACT_FK_EXE_PARENT` FOREIGN KEY (`PARENT_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, - CONSTRAINT `ACT_FK_EXE_PROCDEF` FOREIGN KEY (`PROC_DEF_ID_`) REFERENCES `act_re_procdef` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, - CONSTRAINT `ACT_FK_EXE_PROCINST` FOREIGN KEY (`PROC_INST_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `ACT_FK_EXE_SUPER` FOREIGN KEY (`SUPER_EXEC_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT +CREATE TABLE `act_ru_execution` +( + `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `REV_` int(11) NULL DEFAULT NULL, + `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `BUSINESS_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `PARENT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `SUPER_EXEC_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `ACT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `IS_ACTIVE_` tinyint(4) NULL DEFAULT NULL, + `IS_CONCURRENT_` tinyint(4) NULL DEFAULT NULL, + `IS_SCOPE_` tinyint(4) NULL DEFAULT NULL, + `IS_EVENT_SCOPE_` tinyint(4) NULL DEFAULT NULL, + `SUSPENSION_STATE_` int(11) NULL DEFAULT NULL, + `CACHED_ENT_STATE_` int(11) NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '', + `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `LOCK_TIME_` timestamp(3) NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_EXEC_BUSKEY`(`BUSINESS_KEY_`) USING BTREE, + INDEX `ACT_FK_EXE_PROCINST`(`PROC_INST_ID_`) USING BTREE, + INDEX `ACT_FK_EXE_PARENT`(`PARENT_ID_`) USING BTREE, + INDEX `ACT_FK_EXE_SUPER`(`SUPER_EXEC_`) USING BTREE, + INDEX `ACT_FK_EXE_PROCDEF`(`PROC_DEF_ID_`) USING BTREE, + CONSTRAINT `ACT_FK_EXE_PARENT` FOREIGN KEY (`PARENT_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_EXE_PROCDEF` FOREIGN KEY (`PROC_DEF_ID_`) REFERENCES `act_re_procdef` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_EXE_PROCINST` FOREIGN KEY (`PROC_INST_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `ACT_FK_EXE_SUPER` FOREIGN KEY (`SUPER_EXEC_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of act_ru_execution -- ---------------------------- -INSERT INTO `act_ru_execution` VALUES ('302556', 3, '302556', NULL, NULL, 'process_leave:1:302555', NULL, 'user2', 1, 0, 1, 0, 1, 2, '', NULL, NULL); -INSERT INTO `act_ru_execution` VALUES ('302599', 2, '302599', NULL, NULL, 'process_leave:1:302555', NULL, NULL, 0, 0, 1, 0, 1, 0, '', NULL, NULL); -INSERT INTO `act_ru_execution` VALUES ('302623', 1, '302599', NULL, '302599', 'process_leave:1:302555', NULL, 'allmanager', 1, 0, 1, 0, 1, 2, '', NULL, NULL); +INSERT INTO `act_ru_execution` +VALUES ('302556', 3, '302556', NULL, NULL, 'process_leave:1:302555', NULL, 'user2', 1, 0, 1, 0, 1, 2, '', NULL, NULL); +INSERT INTO `act_ru_execution` +VALUES ('302599', 2, '302599', NULL, NULL, 'process_leave:1:302555', NULL, NULL, 0, 0, 1, 0, 1, 0, '', NULL, NULL); +INSERT INTO `act_ru_execution` +VALUES ('302623', 1, '302599', NULL, '302599', 'process_leave:1:302555', NULL, 'allmanager', 1, 0, 1, 0, 1, 2, '', NULL, + NULL); -- ---------------------------- -- Table structure for act_ru_identitylink -- ---------------------------- DROP TABLE IF EXISTS `act_ru_identitylink`; -CREATE TABLE `act_ru_identitylink` ( - `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `REV_` int(11) NULL DEFAULT NULL, - `GROUP_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `USER_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - PRIMARY KEY (`ID_`) USING BTREE, - INDEX `ACT_IDX_IDENT_LNK_USER`(`USER_ID_`) USING BTREE, - INDEX `ACT_IDX_IDENT_LNK_GROUP`(`GROUP_ID_`) USING BTREE, - INDEX `ACT_IDX_ATHRZ_PROCEDEF`(`PROC_DEF_ID_`) USING BTREE, - INDEX `ACT_FK_TSKASS_TASK`(`TASK_ID_`) USING BTREE, - INDEX `ACT_FK_IDL_PROCINST`(`PROC_INST_ID_`) USING BTREE, - CONSTRAINT `ACT_FK_ATHRZ_PROCEDEF` FOREIGN KEY (`PROC_DEF_ID_`) REFERENCES `act_re_procdef` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, - CONSTRAINT `ACT_FK_IDL_PROCINST` FOREIGN KEY (`PROC_INST_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, - CONSTRAINT `ACT_FK_TSKASS_TASK` FOREIGN KEY (`TASK_ID_`) REFERENCES `act_ru_task` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT +CREATE TABLE `act_ru_identitylink` +( + `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `REV_` int(11) NULL DEFAULT NULL, + `GROUP_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `USER_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_IDENT_LNK_USER`(`USER_ID_`) USING BTREE, + INDEX `ACT_IDX_IDENT_LNK_GROUP`(`GROUP_ID_`) USING BTREE, + INDEX `ACT_IDX_ATHRZ_PROCEDEF`(`PROC_DEF_ID_`) USING BTREE, + INDEX `ACT_FK_TSKASS_TASK`(`TASK_ID_`) USING BTREE, + INDEX `ACT_FK_IDL_PROCINST`(`PROC_INST_ID_`) USING BTREE, + CONSTRAINT `ACT_FK_ATHRZ_PROCEDEF` FOREIGN KEY (`PROC_DEF_ID_`) REFERENCES `act_re_procdef` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_IDL_PROCINST` FOREIGN KEY (`PROC_INST_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_TSKASS_TASK` FOREIGN KEY (`TASK_ID_`) REFERENCES `act_ru_task` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of act_ru_identitylink -- ---------------------------- -INSERT INTO `act_ru_identitylink` VALUES ('302567', 1, NULL, 'participant', '0b7625fedaa05e85f282486e1c9c91b9', NULL, '302556', NULL); -INSERT INTO `act_ru_identitylink` VALUES ('302585', 1, NULL, 'participant', 'd818ac6a86cf1a64d2184bf0699d67a8', NULL, '302556', NULL); -INSERT INTO `act_ru_identitylink` VALUES ('302596', 1, NULL, 'participant', '98b051b03681de6028993a5d14ac93cb', NULL, '302556', NULL); -INSERT INTO `act_ru_identitylink` VALUES ('302610', 1, NULL, 'participant', '0b7625fedaa05e85f282486e1c9c91b9', NULL, '302599', NULL); -INSERT INTO `act_ru_identitylink` VALUES ('302628', 1, NULL, 'participant', 'd818ac6a86cf1a64d2184bf0699d67a8', NULL, '302599', NULL); +INSERT INTO `act_ru_identitylink` +VALUES ('302567', 1, NULL, 'participant', '0b7625fedaa05e85f282486e1c9c91b9', NULL, '302556', NULL); +INSERT INTO `act_ru_identitylink` +VALUES ('302585', 1, NULL, 'participant', 'd818ac6a86cf1a64d2184bf0699d67a8', NULL, '302556', NULL); +INSERT INTO `act_ru_identitylink` +VALUES ('302596', 1, NULL, 'participant', '98b051b03681de6028993a5d14ac93cb', NULL, '302556', NULL); +INSERT INTO `act_ru_identitylink` +VALUES ('302610', 1, NULL, 'participant', '0b7625fedaa05e85f282486e1c9c91b9', NULL, '302599', NULL); +INSERT INTO `act_ru_identitylink` +VALUES ('302628', 1, NULL, 'participant', 'd818ac6a86cf1a64d2184bf0699d67a8', NULL, '302599', NULL); -- ---------------------------- -- Table structure for act_ru_job -- ---------------------------- DROP TABLE IF EXISTS `act_ru_job`; -CREATE TABLE `act_ru_job` ( - `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `REV_` int(11) NULL DEFAULT NULL, - `TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `LOCK_EXP_TIME_` timestamp(3) NULL DEFAULT NULL, - `LOCK_OWNER_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `EXCLUSIVE_` tinyint(1) NULL DEFAULT NULL, - `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `PROCESS_INSTANCE_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `RETRIES_` int(11) NULL DEFAULT NULL, - `EXCEPTION_STACK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `EXCEPTION_MSG_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `DUEDATE_` timestamp(3) NULL DEFAULT NULL, - `REPEAT_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `HANDLER_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `HANDLER_CFG_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '', - PRIMARY KEY (`ID_`) USING BTREE, - INDEX `ACT_FK_JOB_EXCEPTION`(`EXCEPTION_STACK_ID_`) USING BTREE, - CONSTRAINT `ACT_FK_JOB_EXCEPTION` FOREIGN KEY (`EXCEPTION_STACK_ID_`) REFERENCES `act_ge_bytearray` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT +CREATE TABLE `act_ru_job` +( + `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `REV_` int(11) NULL DEFAULT NULL, + `TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `LOCK_EXP_TIME_` timestamp(3) NULL DEFAULT NULL, + `LOCK_OWNER_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `EXCLUSIVE_` tinyint(1) NULL DEFAULT NULL, + `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `PROCESS_INSTANCE_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `RETRIES_` int(11) NULL DEFAULT NULL, + `EXCEPTION_STACK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `EXCEPTION_MSG_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `DUEDATE_` timestamp(3) NULL DEFAULT NULL, + `REPEAT_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `HANDLER_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `HANDLER_CFG_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '', + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_FK_JOB_EXCEPTION`(`EXCEPTION_STACK_ID_`) USING BTREE, + CONSTRAINT `ACT_FK_JOB_EXCEPTION` FOREIGN KEY (`EXCEPTION_STACK_ID_`) REFERENCES `act_ge_bytearray` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for act_ru_task -- ---------------------------- DROP TABLE IF EXISTS `act_ru_task`; -CREATE TABLE `act_ru_task` ( - `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `REV_` int(11) NULL DEFAULT NULL, - `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `PARENT_TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `DESCRIPTION_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `TASK_DEF_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `OWNER_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `ASSIGNEE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `DELEGATION_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `PRIORITY_` int(11) NULL DEFAULT NULL, - `CREATE_TIME_` timestamp(3) NULL DEFAULT NULL, - `DUE_DATE_` datetime(3) NULL DEFAULT NULL, - `CATEGORY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `SUSPENSION_STATE_` int(11) NULL DEFAULT NULL, - `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '', - `FORM_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - PRIMARY KEY (`ID_`) USING BTREE, - INDEX `ACT_IDX_TASK_CREATE`(`CREATE_TIME_`) USING BTREE, - INDEX `ACT_FK_TASK_EXE`(`EXECUTION_ID_`) USING BTREE, - INDEX `ACT_FK_TASK_PROCINST`(`PROC_INST_ID_`) USING BTREE, - INDEX `ACT_FK_TASK_PROCDEF`(`PROC_DEF_ID_`) USING BTREE, - CONSTRAINT `ACT_FK_TASK_EXE` FOREIGN KEY (`EXECUTION_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, - CONSTRAINT `ACT_FK_TASK_PROCDEF` FOREIGN KEY (`PROC_DEF_ID_`) REFERENCES `act_re_procdef` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, - CONSTRAINT `ACT_FK_TASK_PROCINST` FOREIGN KEY (`PROC_INST_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT +CREATE TABLE `act_ru_task` +( + `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `REV_` int(11) NULL DEFAULT NULL, + `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `PARENT_TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `DESCRIPTION_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TASK_DEF_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `OWNER_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `ASSIGNEE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `DELEGATION_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `PRIORITY_` int(11) NULL DEFAULT NULL, + `CREATE_TIME_` timestamp(3) NULL DEFAULT NULL, + `DUE_DATE_` datetime(3) NULL DEFAULT NULL, + `CATEGORY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `SUSPENSION_STATE_` int(11) NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '', + `FORM_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_TASK_CREATE`(`CREATE_TIME_`) USING BTREE, + INDEX `ACT_FK_TASK_EXE`(`EXECUTION_ID_`) USING BTREE, + INDEX `ACT_FK_TASK_PROCINST`(`PROC_INST_ID_`) USING BTREE, + INDEX `ACT_FK_TASK_PROCDEF`(`PROC_DEF_ID_`) USING BTREE, + CONSTRAINT `ACT_FK_TASK_EXE` FOREIGN KEY (`EXECUTION_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_TASK_PROCDEF` FOREIGN KEY (`PROC_DEF_ID_`) REFERENCES `act_re_procdef` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_TASK_PROCINST` FOREIGN KEY (`PROC_INST_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of act_ru_task -- ---------------------------- -INSERT INTO `act_ru_task` VALUES ('302595', 1, '302556', '302556', 'process_leave:1:302555', '人事审批', NULL, NULL, 'user2', NULL, '98b051b03681de6028993a5d14ac93cb', NULL, 50, '2022-03-31 11:05:44.000', NULL, NULL, 1, '', NULL); -INSERT INTO `act_ru_task` VALUES ('302627', 1, '302623', '302599', 'process_leave:1:302555', '总经理审批', NULL, NULL, 'allmanager', NULL, 'd818ac6a86cf1a64d2184bf0699d67a8', NULL, 50, '2022-03-31 11:18:00.000', NULL, NULL, 1, '', NULL); +INSERT INTO `act_ru_task` +VALUES ('302595', 1, '302556', '302556', 'process_leave:1:302555', '人事审批', NULL, NULL, 'user2', NULL, + '98b051b03681de6028993a5d14ac93cb', NULL, 50, '2022-03-31 11:05:44.000', NULL, NULL, 1, '', NULL); +INSERT INTO `act_ru_task` +VALUES ('302627', 1, '302623', '302599', 'process_leave:1:302555', '总经理审批', NULL, NULL, 'allmanager', NULL, + 'd818ac6a86cf1a64d2184bf0699d67a8', NULL, 50, '2022-03-31 11:18:00.000', NULL, NULL, 1, '', NULL); -- ---------------------------- -- Table structure for act_ru_variable -- ---------------------------- DROP TABLE IF EXISTS `act_ru_variable`; -CREATE TABLE `act_ru_variable` ( - `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `REV_` int(11) NULL DEFAULT NULL, - `TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `BYTEARRAY_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `DOUBLE_` double NULL DEFAULT NULL, - `LONG_` bigint(20) NULL DEFAULT NULL, - `TEXT_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - `TEXT2_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, - PRIMARY KEY (`ID_`) USING BTREE, - INDEX `ACT_IDX_VARIABLE_TASK_ID`(`TASK_ID_`) USING BTREE, - INDEX `ACT_FK_VAR_EXE`(`EXECUTION_ID_`) USING BTREE, - INDEX `ACT_FK_VAR_PROCINST`(`PROC_INST_ID_`) USING BTREE, - INDEX `ACT_FK_VAR_BYTEARRAY`(`BYTEARRAY_ID_`) USING BTREE, - CONSTRAINT `ACT_FK_VAR_BYTEARRAY` FOREIGN KEY (`BYTEARRAY_ID_`) REFERENCES `act_ge_bytearray` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, - CONSTRAINT `ACT_FK_VAR_EXE` FOREIGN KEY (`EXECUTION_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, - CONSTRAINT `ACT_FK_VAR_PROCINST` FOREIGN KEY (`PROC_INST_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT +CREATE TABLE `act_ru_variable` +( + `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `REV_` int(11) NULL DEFAULT NULL, + `TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `BYTEARRAY_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `DOUBLE_` double NULL DEFAULT NULL, + `LONG_` bigint(20) NULL DEFAULT NULL, + `TEXT_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TEXT2_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_VARIABLE_TASK_ID`(`TASK_ID_`) USING BTREE, + INDEX `ACT_FK_VAR_EXE`(`EXECUTION_ID_`) USING BTREE, + INDEX `ACT_FK_VAR_PROCINST`(`PROC_INST_ID_`) USING BTREE, + INDEX `ACT_FK_VAR_BYTEARRAY`(`BYTEARRAY_ID_`) USING BTREE, + CONSTRAINT `ACT_FK_VAR_BYTEARRAY` FOREIGN KEY (`BYTEARRAY_ID_`) REFERENCES `act_ge_bytearray` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_VAR_EXE` FOREIGN KEY (`EXECUTION_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_VAR_PROCINST` FOREIGN KEY (`PROC_INST_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of act_ru_variable -- ---------------------------- -INSERT INTO `act_ru_variable` VALUES ('302559', 1, 'serializable', 'baseTask', '302556', '302556', NULL, '302558', NULL, NULL, NULL, NULL); -INSERT INTO `act_ru_variable` VALUES ('302563', 1, 'integer', 'day', '302556', '302556', NULL, NULL, NULL, 3, '3', NULL); -INSERT INTO `act_ru_variable` VALUES ('302569', 1, 'boolean', 'flag', '302556', '302556', NULL, NULL, NULL, 1, NULL, NULL); -INSERT INTO `act_ru_variable` VALUES ('302571', 1, 'integer', 'needfinish', '302556', '302556', NULL, NULL, NULL, 1, '1', NULL); -INSERT INTO `act_ru_variable` VALUES ('302574', 1, 'serializable', 'leaveOpinionList', '302556', '302556', NULL, '302573', NULL, NULL, NULL, NULL); -INSERT INTO `act_ru_variable` VALUES ('302602', 1, 'serializable', 'baseTask', '302599', '302599', NULL, '302601', NULL, NULL, NULL, NULL); -INSERT INTO `act_ru_variable` VALUES ('302606', 1, 'integer', 'day', '302599', '302599', NULL, NULL, NULL, 5, '5', NULL); -INSERT INTO `act_ru_variable` VALUES ('302612', 1, 'boolean', 'flag', '302599', '302599', NULL, NULL, NULL, 1, NULL, NULL); -INSERT INTO `act_ru_variable` VALUES ('302614', 1, 'integer', 'needfinish', '302599', '302599', NULL, NULL, NULL, 1, '1', NULL); -INSERT INTO `act_ru_variable` VALUES ('302617', 1, 'serializable', 'leaveOpinionList', '302599', '302599', NULL, '302616', NULL, NULL, NULL, NULL); +INSERT INTO `act_ru_variable` +VALUES ('302559', 1, 'serializable', 'baseTask', '302556', '302556', NULL, '302558', NULL, NULL, NULL, NULL); +INSERT INTO `act_ru_variable` +VALUES ('302563', 1, 'integer', 'day', '302556', '302556', NULL, NULL, NULL, 3, '3', NULL); +INSERT INTO `act_ru_variable` +VALUES ('302569', 1, 'boolean', 'flag', '302556', '302556', NULL, NULL, NULL, 1, NULL, NULL); +INSERT INTO `act_ru_variable` +VALUES ('302571', 1, 'integer', 'needfinish', '302556', '302556', NULL, NULL, NULL, 1, '1', NULL); +INSERT INTO `act_ru_variable` +VALUES ('302574', 1, 'serializable', 'leaveOpinionList', '302556', '302556', NULL, '302573', NULL, NULL, NULL, NULL); +INSERT INTO `act_ru_variable` +VALUES ('302602', 1, 'serializable', 'baseTask', '302599', '302599', NULL, '302601', NULL, NULL, NULL, NULL); +INSERT INTO `act_ru_variable` +VALUES ('302606', 1, 'integer', 'day', '302599', '302599', NULL, NULL, NULL, 5, '5', NULL); +INSERT INTO `act_ru_variable` +VALUES ('302612', 1, 'boolean', 'flag', '302599', '302599', NULL, NULL, NULL, 1, NULL, NULL); +INSERT INTO `act_ru_variable` +VALUES ('302614', 1, 'integer', 'needfinish', '302599', '302599', NULL, NULL, NULL, 1, '1', NULL); +INSERT INTO `act_ru_variable` +VALUES ('302617', 1, 'serializable', 'leaveOpinionList', '302599', '302599', NULL, '302616', NULL, NULL, NULL, NULL); -- ---------------------------- -- Table structure for base -- ---------------------------- DROP TABLE IF EXISTS `base`; -CREATE TABLE `base` ( - `id` int(11) NOT NULL, - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, - PRIMARY KEY (`id`) USING BTREE +CREATE TABLE `base` +( + `id` int(11) NOT NULL, + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of base -- ---------------------------- -INSERT INTO `base` VALUES (1, '22'); +INSERT INTO `base` +VALUES (1, '22'); -- ---------------------------- -- Table structure for blog_article -- ---------------------------- DROP TABLE IF EXISTS `blog_article`; -CREATE TABLE `blog_article` ( - `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, - `code` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT 'code', - `title` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '标题', - `first_img` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '列表缩略图', - `content` text CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '文章内容', - `read_number` int(11) NOT NULL DEFAULT 0 COMMENT '阅读次数', - `top_num` int(11) NULL DEFAULT 0 COMMENT '次序(置顶功能)', - `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, - `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, - `create_date` datetime(0) NULL DEFAULT NULL, - `update_date` datetime(0) NULL DEFAULT NULL, - `del_flag` tinyint(4) NOT NULL DEFAULT 0 COMMENT '0正常1删除', - PRIMARY KEY (`id`) USING BTREE +CREATE TABLE `blog_article` +( + `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `code` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT 'code', + `title` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '标题', + `first_img` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '列表缩略图', + `content` text CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '文章内容', + `read_number` int(11) NOT NULL DEFAULT 0 COMMENT '阅读次数', + `top_num` int(11) NULL DEFAULT 0 COMMENT '次序(置顶功能)', + `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `create_date` datetime(0) NULL DEFAULT NULL, + `update_date` datetime(0) NULL DEFAULT NULL, + `del_flag` tinyint(4) NOT NULL DEFAULT 0 COMMENT '0正常1删除', + PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of blog_article -- ---------------------------- -INSERT INTO `blog_article` VALUES ('3887934708c54f49bc5a566f77e2a759', '76249265', 'hello,world', 'http://localhost:8081/img/77e5338a-217c-4b07-a3fd-63f20411dfcb.png', '

你好,世界

<img src=\"http://localhost:8081/img/1b805822-4d00-4695-acdd-90f68af6150e.jpg\">

\n


<img src=\"http://localhost:8081/img/1b805822-4d00-4695-acdd-90f68af6150e.jpg\">

\n

JsonUtil json = new JsonUtil();\nList<BlogCategory> categories = categoryService.selectAll();\ncategories.sort(Comparator.comparing(BlogCategory::getSequence));\njson.setData(categories);\nreturn json;\n
', 16, 0, 'acfc0e9232f54732a5d9ffe9071bf572', 'a4a743bffe9711e7b472201a068c6482', '2018-10-14 17:47:41', '2018-11-25 17:35:00', 0); -INSERT INTO `blog_article` VALUES ('6e3fbd29b226452984428883d6e7a8a2', '53165934', '测试添加', 'http://localhost:8081/img/536ac5c8-ee9a-4826-9977-be8983622e00.png', '

内容啦啦啦啦啦


', 15, 0, 'acfc0e9232f54732a5d9ffe9071bf572', 'a4a743bffe9711e7b472201a068c6482', '2018-11-19 22:57:25', '2018-11-25 18:55:34', 0); -INSERT INTO `blog_article` VALUES ('89f445cbe3334a458a4126741170d1e1', 'ASDFG2', 'java基础1', NULL, 'Java基础知识', 130, 1, 'acfc0e9232f54732a5d9ffe9071bf572', NULL, '2018-10-01 11:24:59', NULL, 0); -INSERT INTO `blog_article` VALUES ('89f445cbe3334a458a4126751170d1e1', 'ASDFG1', 'java基础2', NULL, 'Java基础知识', 127, 1, 'acfc0e9232f54732a5d9ffe9071bf572', NULL, '2018-10-01 11:23:59', NULL, 0); -INSERT INTO `blog_article` VALUES ('89f445cbe3334a458a412691170d1e12', 'xcbbg', 'java基础3', NULL, '

Java基础知识

', 124, 0, 'acfc0e9232f54732a5d9ffe9071bf572', 'a4a743bffe9711e7b472201a068c6482', '2018-10-01 11:22:59', '2018-11-25 22:16:19', 0); -INSERT INTO `blog_article` VALUES ('89f445cbe3334a458a4126951170d1e1', 'ASDFGC', 'java基础4', NULL, 'Java基础知识', 124, 1, 'acfc0e9232f54732a5d9ffe9071bf572', NULL, '2018-10-01 11:21:59', NULL, 0); -INSERT INTO `blog_article` VALUES ('a9455e9f36bc4f33ba01412a64d87d6a', '26873592', '记一次spring boot 功能模块化 freemarker只能识别一个resources目录下前端展示模板问题', 'https://static.oschina.net/uploads/space/2018/0116/183901_IMPm_3312115.png', '

今天开发个人开源框架,完善了系统模块后,集成工作流功能模块,在新的resources下面新建freemarker前端页面(ftl页面),然后正常开发到展示流程表的时候,后台报错情景重新:Could not resolve view with name \'/actList\' in servlet with name \'dispatcherServlet\' 

当时我就想是不是映射地址出错了,检查多次后发现也没错,怎么spring mvc就映射不到呢,而且是相同的的地址路径(模块不一样),和其他模块resources一致的路径,然后我系统模块是完全没问题的,我感觉应该是freemarker配置的问题,然后各种尝试,各种检查,各种查阅资料,发现,的确是freemarker的问题,我少配置了一项freemarker配置:FreeMarkerConfigurationFactory类下的属性:preferFileSystemAccess,<---对就是它,我们来看源码发现默认是true

public class FreeMarkerConfigurationFactory {\n\n	protected final Log logger = LogFactory.getLog(getClass());\n\n	private Resource configLocation;\n\n	private Properties freemarkerSettings;\n\n	private Map<String, Object> freemarkerVariables;\n\n	private String defaultEncoding;\n\n	private final List<TemplateLoader> templateLoaders = new ArrayList<TemplateLoader>();\n\n	private List<TemplateLoader> preTemplateLoaders;\n\n	private List<TemplateLoader> postTemplateLoaders;\n\n	private String[] templateLoaderPaths;\n\n	private ResourceLoader resourceLoader = new DefaultResourceLoader();\n\n	private boolean preferFileSystemAccess = true;\n

那么他是干嘛用的呢,我们看官方介绍是介绍:

Set whether to prefer file system access for template loading. File system access enables hot detection of template changes.

If this is enabled, FreeMarkerConfigurationFactory will try to resolve the specified \"templateLoaderPath\" as file system resource (which will work for expanded class path resources and ServletContext resources too).

Default is \"true\". Turn this off to always load via SpringTemplateLoader (i.e. as stream, without hot detection of template changes), which might be necessary if some of your templates reside in an expanded classes directory while others reside in jar files.

我们随便翻一下:第一句的意思是是否以更喜欢方式来访问模板

如果启用就以templateLoaderPath设置的路径来加载,默认为true,设置为false的话就以SpringTemplateLoader方式访问,那么就是流的方式访问,这可能是必要的,如果你的一些模板驻留在一个扩展的类而其他人驻留在jar文件的目录。

意思就是 如果你的文件在jar包文件目录下,就有必要设置为false,我们是多模块的,最终只运行一个模块,其他模块都是以jar包来加载的,我们要加载jar包里面的文件目录,必须要把这个属性设置为false才行,debug源码看看,先上配置文件:

@Bean\n  public FreeMarkerConfigurer freemarkerConfig() throws IOException, TemplateException {\n    FreeMarkerConfigurationFactory factory = new FreeMarkerConfigurationFactory();\n    factory.setTemplateLoaderPath(\"classpath:/ftl/\");\n    factory.setDefaultEncoding(\"UTF-8\");\n    factory.setPreferFileSystemAccess(true);\n    FreeMarkerConfigurer result = new FreeMarkerConfigurer();\n    freemarker.template.Configuration configuration = factory.createConfiguration();\n    configuration.setClassicCompatible(true);\n    result.setConfiguration(configuration);\n    Properties settings = new Properties();\n    settings.put(\"template_update_delay\", \"0\");\n    settings.put(\"default_encoding\", \"UTF-8\");\n    settings.put(\"number_format\", \"0.######\");\n    settings.put(\"classic_compatible\", true);\n    settings.put(\"template_exception_handler\", \"ignore\");\n    result.setFreemarkerSettings(settings);\n    return result;\n  }\n

FreeMarkerConfigurationFactory

返回

最终返回:

看到没,是单个模块的绝对路径ftl文件夹。

看图我们可以明确知道为true的话,加载的是设置的setTemplateLoaderPath的路径 也就是我其中一个模块下的ftl路径,所以其他模块下ftl路径是加载不出来的,也就是spring mvc 映射不到的原因。

我们试试 将isPreferFileSystemAccess设置为false:

最终我们跟到这里:

发现路径是/ftl/而不是之前的绝对路径,然后set进spring对freemarker的配置对象中。

好的,我们通过分析源码我们可以知道,多模块下,我们设置为false,spring才能以相对路径来访问我们的模板文件夹,问题解决。

', 17, 1, 'acfc0e9232f54732a5d9ffe9071bf572', 'a4a743bffe9711e7b472201a068c6482', '2018-11-25 13:48:54', '2018-11-25 22:12:53', 0); -INSERT INTO `blog_article` VALUES ('fd27b3ed7d344395b7766f596bf6fd06', '36152428', 'spring boot 2.0 集成shiro注意事项', NULL, '

spring boot 2.0 全面拥抱java8,在安全验证上面 很大程度的简化了配置项,用shiro就要把security关闭, security 默认是开启的,在boot1.x版本可以通过配置项

security:\n  basic:\n    enabled: false\nmanagement:\n  security:\n    enabled: false\n

来禁用的,但是2.0由于安全和歧义,security相关配置项去除了,那么集成shiro就没效果。

通过在启动主方法添加注解:

@EnableAutoConfiguration(exclude = {\n        org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class\n})\n

来禁止security自动启动配置,达到shiro集成效果,具体shiro集成和boot 1.x相同,具体可参考我之前集成shiro的博文:https://my.oschina.net/u/3312115/blog/1600830


当spring boot为2.0 后 spring 默认升级到5.0以上,spring mvc对静态资源拦截的自定义方案:继承


WebMvcConfigurerAdapter 实现 addResourceHandlers 已经过时

,用继承:WebMvcConfigurationSupport 来替代即可,这里有一点要特别注意的,就是 有且只能继承一次WebMvcConfigurationSupport 多次会出现部分失效问题。


', 21, 1, 'acfc0e9232f54732a5d9ffe9071bf572', 'a4a743bffe9711e7b472201a068c6482', '2018-11-19 21:39:09', '2018-11-25 19:45:42', 0); +INSERT INTO `blog_article` +VALUES ('3887934708c54f49bc5a566f77e2a759', '76249265', 'hello,world', + 'http://localhost:8081/img/77e5338a-217c-4b07-a3fd-63f20411dfcb.png', + '

你好,世界

<img src=\"http://localhost:8081/img/1b805822-4d00-4695-acdd-90f68af6150e.jpg\">

\n


<img src=\"http://localhost:8081/img/1b805822-4d00-4695-acdd-90f68af6150e.jpg\">

\n

JsonUtil json = new JsonUtil();\nList<BlogCategory> categories = categoryService.selectAll();\ncategories.sort(Comparator.comparing(BlogCategory::getSequence));\njson.setData(categories);\nreturn json;\n
', + 16, 0, 'acfc0e9232f54732a5d9ffe9071bf572', 'a4a743bffe9711e7b472201a068c6482', '2018-10-14 17:47:41', + '2018-11-25 17:35:00', 0); +INSERT INTO `blog_article` +VALUES ('6e3fbd29b226452984428883d6e7a8a2', '53165934', '测试添加', + 'http://localhost:8081/img/536ac5c8-ee9a-4826-9977-be8983622e00.png', + '

内容啦啦啦啦啦


', + 15, 0, 'acfc0e9232f54732a5d9ffe9071bf572', 'a4a743bffe9711e7b472201a068c6482', '2018-11-19 22:57:25', + '2018-11-25 18:55:34', 0); +INSERT INTO `blog_article` +VALUES ('89f445cbe3334a458a4126741170d1e1', 'ASDFG2', 'java基础1', NULL, 'Java基础知识', 130, 1, + 'acfc0e9232f54732a5d9ffe9071bf572', NULL, '2018-10-01 11:24:59', NULL, 0); +INSERT INTO `blog_article` +VALUES ('89f445cbe3334a458a4126751170d1e1', 'ASDFG1', 'java基础2', NULL, 'Java基础知识', 127, 1, + 'acfc0e9232f54732a5d9ffe9071bf572', NULL, '2018-10-01 11:23:59', NULL, 0); +INSERT INTO `blog_article` +VALUES ('89f445cbe3334a458a412691170d1e12', 'xcbbg', 'java基础3', NULL, '

Java基础知识

', 124, 0, + 'acfc0e9232f54732a5d9ffe9071bf572', 'a4a743bffe9711e7b472201a068c6482', '2018-10-01 11:22:59', + '2018-11-25 22:16:19', 0); +INSERT INTO `blog_article` +VALUES ('89f445cbe3334a458a4126951170d1e1', 'ASDFGC', 'java基础4', NULL, 'Java基础知识', 124, 1, + 'acfc0e9232f54732a5d9ffe9071bf572', NULL, '2018-10-01 11:21:59', NULL, 0); +INSERT INTO `blog_article` +VALUES ('a9455e9f36bc4f33ba01412a64d87d6a', '26873592', + '记一次spring boot 功能模块化 freemarker只能识别一个resources目录下前端展示模板问题', + 'https://static.oschina.net/uploads/space/2018/0116/183901_IMPm_3312115.png', + '

今天开发个人开源框架,完善了系统模块后,集成工作流功能模块,在新的resources下面新建freemarker前端页面(ftl页面),然后正常开发到展示流程表的时候,后台报错情景重新:Could not resolve view with name \' / + actList\' in servlet with name \'dispatcherServlet\' 

当时我就想是不是映射地址出错了,检查多次后发现也没错,怎么spring mvc就映射不到呢,而且是相同的的地址路径(模块不一样),和其他模块resources一致的路径,然后我系统模块是完全没问题的,我感觉应该是freemarker配置的问题,然后各种尝试,各种检查,各种查阅资料,发现,的确是freemarker的问题,我少配置了一项freemarker配置:FreeMarkerConfigurationFactory类下的属性:preferFileSystemAccess,<---对就是它,我们来看源码发现默认是true

public class FreeMarkerConfigurationFactory {\n\n	protected final Log logger = LogFactory.getLog(getClass());\n\n	private Resource configLocation;\n\n	private Properties freemarkerSettings;\n\n	private Map<String, Object> freemarkerVariables;\n\n	private String defaultEncoding;\n\n	private final List<TemplateLoader> templateLoaders = new ArrayList<TemplateLoader>();\n\n	private List<TemplateLoader> preTemplateLoaders;\n\n	private List<TemplateLoader> postTemplateLoaders;\n\n	private String[] templateLoaderPaths;\n\n	private ResourceLoader resourceLoader = new DefaultResourceLoader();\n\n	private boolean preferFileSystemAccess = true;\n

那么他是干嘛用的呢,我们看官方介绍是介绍:

Set whether to prefer file system access for template loading. File system access enables hot detection of template changes.

If this is enabled, FreeMarkerConfigurationFactory will try to resolve the specified \"templateLoaderPath\" as file system resource (which will work for expanded class path resources and ServletContext resources too).

Default is \"true\". Turn this off to always load via SpringTemplateLoader (i.e. as stream, without hot detection of template changes), which might be necessary if some of your templates reside in an expanded classes directory while others reside in jar files.

我们随便翻一下:第一句的意思是是否以更喜欢方式来访问模板

如果启用就以templateLoaderPath设置的路径来加载,默认为true,设置为false的话就以SpringTemplateLoader方式访问,那么就是流的方式访问,这可能是必要的,如果你的一些模板驻留在一个扩展的类而其他人驻留在jar文件的目录。

意思就是 如果你的文件在jar包文件目录下,就有必要设置为false,我们是多模块的,最终只运行一个模块,其他模块都是以jar包来加载的,我们要加载jar包里面的文件目录,必须要把这个属性设置为false才行,debug源码看看,先上配置文件:

@Bean\n  public FreeMarkerConfigurer freemarkerConfig() throws IOException, TemplateException {\n    FreeMarkerConfigurationFactory factory = new FreeMarkerConfigurationFactory();\n    factory.setTemplateLoaderPath(\"classpath:/ftl/\");\n    factory.setDefaultEncoding(\"UTF-8\");\n    factory.setPreferFileSystemAccess(true);\n    FreeMarkerConfigurer result = new FreeMarkerConfigurer();\n    freemarker.template.Configuration configuration = factory.createConfiguration();\n    configuration.setClassicCompatible(true);\n    result.setConfiguration(configuration);\n    Properties settings = new Properties();\n    settings.put(\"template_update_delay\", \"0\");\n    settings.put(\"default_encoding\", \"UTF-8\");\n    settings.put(\"number_format\", \"0.######\");\n    settings.put(\"classic_compatible\", true);\n    settings.put(\"template_exception_handler\", \"ignore\");\n    result.setFreemarkerSettings(settings);\n    return result;\n  }\n

FreeMarkerConfigurationFactory

返回

最终返回:

看到没,是单个模块的绝对路径ftl文件夹。

看图我们可以明确知道为true的话,加载的是设置的setTemplateLoaderPath的路径 也就是我其中一个模块下的ftl路径,所以其他模块下ftl路径是加载不出来的,也就是spring mvc 映射不到的原因。

我们试试 将isPreferFileSystemAccess设置为false:

最终我们跟到这里:

发现路径是/ftl/而不是之前的绝对路径,然后set进spring对freemarker的配置对象中。

好的,我们通过分析源码我们可以知道,多模块下,我们设置为false,spring才能以相对路径来访问我们的模板文件夹,问题解决。

', + 17, 1, 'acfc0e9232f54732a5d9ffe9071bf572', 'a4a743bffe9711e7b472201a068c6482', '2018-11-25 13:48:54', + '2018-11-25 22:12:53', 0); +INSERT INTO `blog_article` +VALUES ('fd27b3ed7d344395b7766f596bf6fd06', '36152428', 'spring boot 2.0 集成shiro注意事项', NULL, + '

spring boot 2.0 全面拥抱java8,在安全验证上面 很大程度的简化了配置项,用shiro就要把security关闭, security 默认是开启的,在boot1.x版本可以通过配置项

security:\n  basic:\n    enabled: false\nmanagement:\n  security:\n    enabled: false\n

来禁用的,但是2.0由于安全和歧义,security相关配置项去除了,那么集成shiro就没效果。

通过在启动主方法添加注解:

@EnableAutoConfiguration(exclude = {\n        org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class\n})\n

来禁止security自动启动配置,达到shiro集成效果,具体shiro集成和boot 1.x相同,具体可参考我之前集成shiro的博文:https://my.oschina.net/u/3312115/blog/1600830


当spring boot为2.0 后 spring 默认升级到5.0以上,spring mvc对静态资源拦截的自定义方案:继承


WebMvcConfigurerAdapter 实现 addResourceHandlers 已经过时

,用继承:WebMvcConfigurationSupport 来替代即可,这里有一点要特别注意的,就是 有且只能继承一次WebMvcConfigurationSupport 多次会出现部分失效问题。


', + 21, 1, 'acfc0e9232f54732a5d9ffe9071bf572', 'a4a743bffe9711e7b472201a068c6482', '2018-11-19 21:39:09', + '2018-11-25 19:45:42', 0); -- ---------------------------- -- Table structure for blog_article_category -- ---------------------------- DROP TABLE IF EXISTS `blog_article_category`; -CREATE TABLE `blog_article_category` ( - `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, - `article_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '文章id', - `category_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '标签id', - PRIMARY KEY (`id`) USING BTREE +CREATE TABLE `blog_article_category` +( + `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `article_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '文章id', + `category_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '标签id', + PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '文章标签表' ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of blog_article_category -- ---------------------------- -INSERT INTO `blog_article_category` VALUES ('0037884871fa483db71e4158a18b0af9', '3887934708c54f49bc5a566f77e2a759', '3d4da698fc914ed0b956e86b58f93166'); -INSERT INTO `blog_article_category` VALUES ('2e2c8578a05b4048a9365e9a1b5ff726', '89f445cbe3334a458a412691170d1e12', '3956852574b6490ba6198f35b1c00aee'); -INSERT INTO `blog_article_category` VALUES ('68eeaf5f10a24ed195c042dbc6e25df7', 'a9455e9f36bc4f33ba01412a64d87d6a', '3956852574b6490ba6198f35b1c00aee'); -INSERT INTO `blog_article_category` VALUES ('7659e8a4b97144269775983f886ce25e', '3887934708c54f49bc5a566f77e2a759', '3956852574b6490ba6198f35b1c00aee'); -INSERT INTO `blog_article_category` VALUES ('db7a1ca9b5d04a618f98e65c6c5555db', '6e3fbd29b226452984428883d6e7a8a2', '3956852574b6490ba6198f35b1c00aee'); -INSERT INTO `blog_article_category` VALUES ('e6c27fd837244cefb43b2b2aca276f1f', '3887934708c54f49bc5a566f77e2a759', '2b7c729789de4c03a23fff8311b9eaf4'); -INSERT INTO `blog_article_category` VALUES ('fe7c34ffcf8c4af9922b4438e695c742', 'fd27b3ed7d344395b7766f596bf6fd06', '3956852574b6490ba6198f35b1c00aee'); +INSERT INTO `blog_article_category` +VALUES ('0037884871fa483db71e4158a18b0af9', '3887934708c54f49bc5a566f77e2a759', '3d4da698fc914ed0b956e86b58f93166'); +INSERT INTO `blog_article_category` +VALUES ('2e2c8578a05b4048a9365e9a1b5ff726', '89f445cbe3334a458a412691170d1e12', '3956852574b6490ba6198f35b1c00aee'); +INSERT INTO `blog_article_category` +VALUES ('68eeaf5f10a24ed195c042dbc6e25df7', 'a9455e9f36bc4f33ba01412a64d87d6a', '3956852574b6490ba6198f35b1c00aee'); +INSERT INTO `blog_article_category` +VALUES ('7659e8a4b97144269775983f886ce25e', '3887934708c54f49bc5a566f77e2a759', '3956852574b6490ba6198f35b1c00aee'); +INSERT INTO `blog_article_category` +VALUES ('db7a1ca9b5d04a618f98e65c6c5555db', '6e3fbd29b226452984428883d6e7a8a2', '3956852574b6490ba6198f35b1c00aee'); +INSERT INTO `blog_article_category` +VALUES ('e6c27fd837244cefb43b2b2aca276f1f', '3887934708c54f49bc5a566f77e2a759', '2b7c729789de4c03a23fff8311b9eaf4'); +INSERT INTO `blog_article_category` +VALUES ('fe7c34ffcf8c4af9922b4438e695c742', 'fd27b3ed7d344395b7766f596bf6fd06', '3956852574b6490ba6198f35b1c00aee'); -- ---------------------------- -- Table structure for blog_article_tag -- ---------------------------- DROP TABLE IF EXISTS `blog_article_tag`; -CREATE TABLE `blog_article_tag` ( - `article_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, - `tag_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, - PRIMARY KEY (`article_id`, `tag_id`) USING BTREE +CREATE TABLE `blog_article_tag` +( + `article_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `tag_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + PRIMARY KEY (`article_id`, `tag_id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of blog_article_tag -- ---------------------------- -INSERT INTO `blog_article_tag` VALUES ('3887934708c54f49bc5a566f77e2a759', 'eeba8137d0cc42249a8c1db9b2830e8a'); -INSERT INTO `blog_article_tag` VALUES ('6e3fbd29b226452984428883d6e7a8a2', '0596836fc90540d1a497cd7bfae306e4'); -INSERT INTO `blog_article_tag` VALUES ('6e3fbd29b226452984428883d6e7a8a2', '1f44f472a64f4ebe9782b2b868e2caf2'); -INSERT INTO `blog_article_tag` VALUES ('89f445cbe3334a458a412691170d1e12', 'eeba8137d0cc42249a8c1db9b2830e8a'); -INSERT INTO `blog_article_tag` VALUES ('a9455e9f36bc4f33ba01412a64d87d6a', 'eba6d766a88b4a108d4189c08f86e7a6'); -INSERT INTO `blog_article_tag` VALUES ('fd27b3ed7d344395b7766f596bf6fd06', '0596836fc90540d1a497cd7bfae306e4'); -INSERT INTO `blog_article_tag` VALUES ('fd27b3ed7d344395b7766f596bf6fd06', 'eba6d766a88b4a108d4189c08f86e7a6'); +INSERT INTO `blog_article_tag` +VALUES ('3887934708c54f49bc5a566f77e2a759', 'eeba8137d0cc42249a8c1db9b2830e8a'); +INSERT INTO `blog_article_tag` +VALUES ('6e3fbd29b226452984428883d6e7a8a2', '0596836fc90540d1a497cd7bfae306e4'); +INSERT INTO `blog_article_tag` +VALUES ('6e3fbd29b226452984428883d6e7a8a2', '1f44f472a64f4ebe9782b2b868e2caf2'); +INSERT INTO `blog_article_tag` +VALUES ('89f445cbe3334a458a412691170d1e12', 'eeba8137d0cc42249a8c1db9b2830e8a'); +INSERT INTO `blog_article_tag` +VALUES ('a9455e9f36bc4f33ba01412a64d87d6a', 'eba6d766a88b4a108d4189c08f86e7a6'); +INSERT INTO `blog_article_tag` +VALUES ('fd27b3ed7d344395b7766f596bf6fd06', '0596836fc90540d1a497cd7bfae306e4'); +INSERT INTO `blog_article_tag` +VALUES ('fd27b3ed7d344395b7766f596bf6fd06', 'eba6d766a88b4a108d4189c08f86e7a6'); -- ---------------------------- -- Table structure for blog_category -- ---------------------------- DROP TABLE IF EXISTS `blog_category`; -CREATE TABLE `blog_category` ( - `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, - `sequence` tinyint(2) NOT NULL DEFAULT 0, - `code` varchar(16) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '搜索code', - `name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '类别名称', - `parent_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '0' COMMENT '上层id(目前最多两次层)', - `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, - `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, - `create_date` datetime(0) NULL DEFAULT NULL, - `update_date` datetime(0) NULL DEFAULT NULL, - PRIMARY KEY (`id`) USING BTREE +CREATE TABLE `blog_category` +( + `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `sequence` tinyint(2) NOT NULL DEFAULT 0, + `code` varchar(16) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '搜索code', + `name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '类别名称', + `parent_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '0' COMMENT '上层id(目前最多两次层)', + `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `create_date` datetime(0) NULL DEFAULT NULL, + `update_date` datetime(0) NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '类别表(顶部展示)' ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of blog_category -- ---------------------------- -INSERT INTO `blog_category` VALUES ('2b7c729789de4c03a23fff8311b9eaf4', 3, '架构', '架构', '0', 'zxm', NULL, '2018-10-12 22:30:18', NULL); -INSERT INTO `blog_category` VALUES ('3956852574b6490ba6198f35b1c00aee', 1, 'Java', 'Java', '0', 'zxm', NULL, '2018-10-12 22:30:18', NULL); -INSERT INTO `blog_category` VALUES ('3d4da698fc914ed0b956e86b58f93166', 2, 'Linux', 'Linux', '0', 'zxm', NULL, '2018-10-12 22:30:18', NULL); -INSERT INTO `blog_category` VALUES ('7de23cc796ac4e6887ef1de6ca331bd8', 4, '其他', '其他', '0', 'zxm', NULL, '2018-10-12 22:30:18', NULL); +INSERT INTO `blog_category` +VALUES ('2b7c729789de4c03a23fff8311b9eaf4', 3, '架构', '架构', '0', 'zxm', NULL, '2018-10-12 22:30:18', NULL); +INSERT INTO `blog_category` +VALUES ('3956852574b6490ba6198f35b1c00aee', 1, 'Java', 'Java', '0', 'zxm', NULL, '2018-10-12 22:30:18', NULL); +INSERT INTO `blog_category` +VALUES ('3d4da698fc914ed0b956e86b58f93166', 2, 'Linux', 'Linux', '0', 'zxm', NULL, '2018-10-12 22:30:18', NULL); +INSERT INTO `blog_category` +VALUES ('7de23cc796ac4e6887ef1de6ca331bd8', 4, '其他', '其他', '0', 'zxm', NULL, '2018-10-12 22:30:18', NULL); -- ---------------------------- -- Table structure for blog_tag -- ---------------------------- DROP TABLE IF EXISTS `blog_tag`; -CREATE TABLE `blog_tag` ( - `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, - `tag_code` varchar(16) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '标签code', - `tag_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '标签name', - PRIMARY KEY (`id`) USING BTREE +CREATE TABLE `blog_tag` +( + `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `tag_code` varchar(16) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '标签code', + `tag_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '标签name', + PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of blog_tag -- ---------------------------- -INSERT INTO `blog_tag` VALUES ('0596836fc90540d1a497cd7bfae306e4', 'shiro', 'shiro'); -INSERT INTO `blog_tag` VALUES ('1f44f472a64f4ebe9782b2b868e2caf2', 'spring', 'spring'); -INSERT INTO `blog_tag` VALUES ('32297dbf97d44462bfa8b2f868704660', 'mybatis', 'mybatis'); -INSERT INTO `blog_tag` VALUES ('483af3b2db5743e99a9cde0f81559b43', 'spring cloud', 'spring cloud'); -INSERT INTO `blog_tag` VALUES ('4e4aa6cd7fea4a70a9e31083c1109090', 'sql', 'sql'); -INSERT INTO `blog_tag` VALUES ('56a9dc14db164453a0baa30d3193367c', '22', '22'); -INSERT INTO `blog_tag` VALUES ('75cae88b2f9f451392bfc06928a7c58d', 'centos7', 'centos7'); -INSERT INTO `blog_tag` VALUES ('7b470a9a121b42dc995e876fb532660e', 'linux', 'linux'); -INSERT INTO `blog_tag` VALUES ('7e467f2922a34a0b91afd908676f0ef5', 'spring security', 'spring security'); -INSERT INTO `blog_tag` VALUES ('8f41425ce8794fa8a0affa17beb13f11', 'redis', 'redis'); -INSERT INTO `blog_tag` VALUES ('d4e6b7774db343ff8575b1790a615aa2', 'git', 'git'); -INSERT INTO `blog_tag` VALUES ('da34c84e702341d68e6ea6d004508e67', 'vue', 'vue'); -INSERT INTO `blog_tag` VALUES ('e4ca0a14f2724de8bf71ad0ac8988c57', 'quartz', 'quartz'); -INSERT INTO `blog_tag` VALUES ('eba6d766a88b4a108d4189c08f86e7a6', 'spring boot', 'spring boot'); -INSERT INTO `blog_tag` VALUES ('eeba8137d0cc42249a8c1db9b2830e8a', 'java', 'java'); -INSERT INTO `blog_tag` VALUES ('f4ebc211eb3242739d6007e030c54ae5', 'oauth2.0', 'oauth2.0'); +INSERT INTO `blog_tag` +VALUES ('0596836fc90540d1a497cd7bfae306e4', 'shiro', 'shiro'); +INSERT INTO `blog_tag` +VALUES ('1f44f472a64f4ebe9782b2b868e2caf2', 'spring', 'spring'); +INSERT INTO `blog_tag` +VALUES ('32297dbf97d44462bfa8b2f868704660', 'mybatis', 'mybatis'); +INSERT INTO `blog_tag` +VALUES ('483af3b2db5743e99a9cde0f81559b43', 'spring cloud', 'spring cloud'); +INSERT INTO `blog_tag` +VALUES ('4e4aa6cd7fea4a70a9e31083c1109090', 'sql', 'sql'); +INSERT INTO `blog_tag` +VALUES ('56a9dc14db164453a0baa30d3193367c', '22', '22'); +INSERT INTO `blog_tag` +VALUES ('75cae88b2f9f451392bfc06928a7c58d', 'centos7', 'centos7'); +INSERT INTO `blog_tag` +VALUES ('7b470a9a121b42dc995e876fb532660e', 'linux', 'linux'); +INSERT INTO `blog_tag` +VALUES ('7e467f2922a34a0b91afd908676f0ef5', 'spring security', 'spring security'); +INSERT INTO `blog_tag` +VALUES ('8f41425ce8794fa8a0affa17beb13f11', 'redis', 'redis'); +INSERT INTO `blog_tag` +VALUES ('d4e6b7774db343ff8575b1790a615aa2', 'git', 'git'); +INSERT INTO `blog_tag` +VALUES ('da34c84e702341d68e6ea6d004508e67', 'vue', 'vue'); +INSERT INTO `blog_tag` +VALUES ('e4ca0a14f2724de8bf71ad0ac8988c57', 'quartz', 'quartz'); +INSERT INTO `blog_tag` +VALUES ('eba6d766a88b4a108d4189c08f86e7a6', 'spring boot', 'spring boot'); +INSERT INTO `blog_tag` +VALUES ('eeba8137d0cc42249a8c1db9b2830e8a', 'java', 'java'); +INSERT INTO `blog_tag` +VALUES ('f4ebc211eb3242739d6007e030c54ae5', 'oauth2.0', 'oauth2.0'); -- ---------------------------- -- Table structure for sys_dept -- ---------------------------- DROP TABLE IF EXISTS `sys_dept`; -CREATE TABLE `sys_dept` ( - `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `dept_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '编码', - `dept_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `dept_pid` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0', - `dept_desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, - `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, - `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, - `create_date` datetime(0) NULL DEFAULT NULL, - `update_date` datetime(0) NULL DEFAULT NULL, - PRIMARY KEY (`id`) USING BTREE +CREATE TABLE `sys_dept` +( + `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `dept_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '编码', + `dept_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `dept_pid` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0', + `dept_desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, + `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `create_date` datetime(0) NULL DEFAULT NULL, + `update_date` datetime(0) NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for sys_dict_item -- ---------------------------- DROP TABLE IF EXISTS `sys_dict_item`; -CREATE TABLE `sys_dict_item` ( - `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, - `sequence` int(11) NOT NULL COMMENT '序号', - `value` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '值', - `description` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '描述', - `type_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '字典id外检', - `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, - `create_date` datetime(0) NULL DEFAULT NULL, - `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, - `update_date` datetime(0) NULL DEFAULT NULL, - `del_flag` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '0' COMMENT '删除标识', - PRIMARY KEY (`id`) USING BTREE +CREATE TABLE `sys_dict_item` +( + `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `sequence` int(11) NOT NULL COMMENT '序号', + `value` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '值', + `description` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '描述', + `type_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '字典id外检', + `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `create_date` datetime(0) NULL DEFAULT NULL, + `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `update_date` datetime(0) NULL DEFAULT NULL, + `del_flag` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '0' COMMENT '删除标识', + PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '字典子表' ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for sys_dict_type -- ---------------------------- DROP TABLE IF EXISTS `sys_dict_type`; -CREATE TABLE `sys_dict_type` ( - `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, - `code` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '编码', - `del_flag` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '0' COMMENT '删除标识', - `text` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '字典名称', - `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, - `create_date` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0), - `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, - `update_date` datetime(0) NULL DEFAULT NULL, - PRIMARY KEY (`id`) USING BTREE +CREATE TABLE `sys_dict_type` +( + `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `code` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '编码', + `del_flag` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '0' COMMENT '删除标识', + `text` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '字典名称', + `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `create_date` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP (0), + `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `update_date` datetime(0) NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '字典主表' ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for sys_employee -- ---------------------------- DROP TABLE IF EXISTS `sys_employee`; -CREATE TABLE `sys_employee` ( - `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '主键', - `employee_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '员工编号', - `employee_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '员工姓名', - `employee_gender` int(1) NULL DEFAULT NULL COMMENT '性别 0无 1 男 2 女', - `employee_birthday` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '生日', - `employee_deptcodes` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '部门', - `employee_mobile1` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '公司工作电话', - `employee_mobile2` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '私人电话', - `employee_mail1` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '公司邮箱', - `employee_mail2` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '个人邮箱', - `employee_wechat` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '个人微信', - `employee_qq` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '个人QQ', - `employee_photo` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '头像', - `employee_ssn` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '社保号', - `employee_min` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '医保号', - `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, - `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, - `create_date` datetime(0) NULL DEFAULT NULL, - `update_date` datetime(0) NULL DEFAULT NULL, - PRIMARY KEY (`id`) USING BTREE +CREATE TABLE `sys_employee` +( + `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '主键', + `employee_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '员工编号', + `employee_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '员工姓名', + `employee_gender` int(1) NULL DEFAULT NULL COMMENT '性别 0无 1 男 2 女', + `employee_birthday` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '生日', + `employee_deptcodes` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '部门', + `employee_mobile1` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '公司工作电话', + `employee_mobile2` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '私人电话', + `employee_mail1` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '公司邮箱', + `employee_mail2` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '个人邮箱', + `employee_wechat` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '个人微信', + `employee_qq` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '个人QQ', + `employee_photo` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '头像', + `employee_ssn` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '社保号', + `employee_min` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '医保号', + `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `create_date` datetime(0) NULL DEFAULT NULL, + `update_date` datetime(0) NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for sys_job -- ---------------------------- DROP TABLE IF EXISTS `sys_job`; -CREATE TABLE `sys_job` ( - `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, - `job_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '描述任务', - `cron` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '任务表达式', - `status` tinyint(1) NOT NULL COMMENT '状态:0未启动false/1启动true', - `clazz_path` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '任务执行方法', - `job_desc` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '其他描述', - `create_by` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, - `create_date` datetime(0) NULL DEFAULT NULL, - `update_by` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, - `update_date` datetime(0) NULL DEFAULT NULL, - PRIMARY KEY (`id`) USING BTREE +CREATE TABLE `sys_job` +( + `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `job_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '描述任务', + `cron` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '任务表达式', + `status` tinyint(1) NOT NULL COMMENT '状态:0未启动false/1启动true', + `clazz_path` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '任务执行方法', + `job_desc` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '其他描述', + `create_by` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `create_date` datetime(0) NULL DEFAULT NULL, + `update_by` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `update_date` datetime(0) NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of sys_job -- ---------------------------- -INSERT INTO `sys_job` VALUES ('55147ebdf2f611e7a4fe201a068c6482', '测试定时demo1', '0/5 * * * * ?', 0, 'com.len.core.quartz.CustomQuartz.JobDemo1', '测试定时demo1', 'acfc0e9232f54732a5d9ffe9071bf572', '2018-01-07 12:30:00', 'acfc0e9232f54732a5d9ffe9071bf572', '2018-07-14 13:29:55'); -INSERT INTO `sys_job` VALUES ('ab648a22f38d11e7aca0201a068c6482', '任务demo2', '0 0/1 * * * ?', 0, 'com.len.core.quartz.CustomQuartz.JobDemo2', '任务demo2', 'acfc0e9232f54732a5d9ffe9071bf572', '2018-01-07 17:32:36', 'acfc0e9232f54732a5d9ffe9071bf572', '2018-07-07 17:07:45'); +INSERT INTO `sys_job` +VALUES ('55147ebdf2f611e7a4fe201a068c6482', '测试定时demo1', '0/5 * * * * ?', 0, + 'com.len.core.quartz.CustomQuartz.JobDemo1', '测试定时demo1', 'acfc0e9232f54732a5d9ffe9071bf572', + '2018-01-07 12:30:00', 'acfc0e9232f54732a5d9ffe9071bf572', '2018-07-14 13:29:55'); +INSERT INTO `sys_job` +VALUES ('ab648a22f38d11e7aca0201a068c6482', '任务demo2', '0 0/1 * * * ?', 0, + 'com.len.core.quartz.CustomQuartz.JobDemo2', '任务demo2', 'acfc0e9232f54732a5d9ffe9071bf572', + '2018-01-07 17:32:36', 'acfc0e9232f54732a5d9ffe9071bf572', '2018-07-07 17:07:45'); -- ---------------------------- -- Table structure for sys_log -- ---------------------------- DROP TABLE IF EXISTS `sys_log`; -CREATE TABLE `sys_log` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `user_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, - `ip` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, - `type` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, - `text` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, - `param` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL, - `create_time` datetime(0) NULL DEFAULT NULL, - PRIMARY KEY (`id`) USING BTREE +CREATE TABLE `sys_log` +( + `id` int(11) NOT NULL AUTO_INCREMENT, + `user_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `ip` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `type` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `text` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `param` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL, + `create_time` datetime(0) NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 109 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of sys_log -- ---------------------------- -INSERT INTO `sys_log` VALUES (65, 'admin', '0:0:0:0:0:0:0:1', 'UPDATE', '更新用户', '[参数1:{\"age\":24,\"email\":\"\",\"id\":\"acfc0e9232f54732a5d9ffe9071bf572\",\"photo\":\"ca842e83-6331-4516-b769-8888f297b657.jpeg\",\"realName\":\"管理员\"}]', '2022-03-06 22:12:40'); -INSERT INTO `sys_log` VALUES (66, 'admin', '0:0:0:0:0:0:0:1', 'UPDATE', '更新用户', '[参数1:{\"age\":24,\"email\":\"\",\"id\":\"acfc0e9232f54732a5d9ffe9071bf572\",\"photo\":\"a88e6ae3-af87-490e-8f3e-6a92156dc95f.jpeg\",\"realName\":\"管理员\"}]', '2022-03-06 22:13:34'); -INSERT INTO `sys_log` VALUES (67, 'admin', '0:0:0:0:0:0:0:1', 'UPDATE', '更新用户', '[参数1:{\"age\":24,\"email\":\"\",\"id\":\"acfc0e9232f54732a5d9ffe9071bf572\",\"photo\":\"a88e6ae3-af87-490e-8f3e-6a92156dc95f.jpeg\"}][参数2:[\"2619a672e53811e7b983201a068c6482\",\"4bb891d8caf84cc6ba27e515e80ac40d\"]]', '2022-03-26 21:30:47'); -INSERT INTO `sys_log` VALUES (104, 'admin', '0:0:0:0:0:0:0:1', 'ATHOR', '添加用户', '[参数1:{\"age\":20,\"email\":\"11@qq.com\",\"id\":\"d818ac6a86cf1a64d2184bf0699d67a8\",\"password\":\"6a333668613ef7946f4462866f537fb5\",\"photo\":\"\",\"username\":\"jingli\"}][参数2:[\"0ea934e5e55411e7b983201a068c6482\"]]', '2022-03-31 10:54:36'); -INSERT INTO `sys_log` VALUES (105, 'admin', '0:0:0:0:0:0:0:1', 'ATHOR', '添加用户', '[参数1:{\"age\":20,\"email\":\"11@qq.com\",\"id\":\"98b051b03681de6028993a5d14ac93cb\",\"password\":\"bce07289deffa09011e644813e6d86a4\",\"photo\":\"\",\"username\":\"hr\"}][参数2:[\"023366f3457511e8bcf1309c2315f9aa\"]]', '2022-03-31 10:55:54'); -INSERT INTO `sys_log` VALUES (106, 'admin', '0:0:0:0:0:0:0:1', 'ATHOR', '添加用户', '[参数1:{\"age\":20,\"email\":\"11@qq.com\",\"id\":\"5946a985f733c57f1ab71689f7b6aeea\",\"password\":\"a07e4c18324811b0d0ec17a89e0f855b\",\"photo\":\"\",\"username\":\"zhangsan\"}][参数2:[\"dcb0f642fe9611e7b472201a068c6482\"]]', '2022-03-31 10:56:46'); -INSERT INTO `sys_log` VALUES (107, 'admin', '0:0:0:0:0:0:0:1', 'ATHOR', '添加用户', '[参数1:{\"age\":20,\"email\":\"11@qq.com\",\"id\":\"0b7625fedaa05e85f282486e1c9c91b9\",\"password\":\"40d400f384b4996fd6ab30dab720ef1e\",\"photo\":\"\",\"username\":\"jingli1\"}][参数2:[\"e346e96368484c8fa7f217ce550a0186\"]]', '2022-03-31 10:57:48'); -INSERT INTO `sys_log` VALUES (108, 'admin', '0:0:0:0:0:0:0:1', 'SELECT', '展示菜单', NULL, '2022-06-23 18:03:21'); +INSERT INTO `sys_log` +VALUES (65, 'admin', '0:0:0:0:0:0:0:1', 'UPDATE', '更新用户', + '[参数1:{\"age\":24,\"email\":\"\",\"id\":\"acfc0e9232f54732a5d9ffe9071bf572\",\"photo\":\"ca842e83-6331-4516-b769-8888f297b657.jpeg\",\"realName\":\"管理员\"}]', + '2022-03-06 22:12:40'); +INSERT INTO `sys_log` +VALUES (66, 'admin', '0:0:0:0:0:0:0:1', 'UPDATE', '更新用户', + '[参数1:{\"age\":24,\"email\":\"\",\"id\":\"acfc0e9232f54732a5d9ffe9071bf572\",\"photo\":\"a88e6ae3-af87-490e-8f3e-6a92156dc95f.jpeg\",\"realName\":\"管理员\"}]', + '2022-03-06 22:13:34'); +INSERT INTO `sys_log` +VALUES (67, 'admin', '0:0:0:0:0:0:0:1', 'UPDATE', '更新用户', + '[参数1:{\"age\":24,\"email\":\"\",\"id\":\"acfc0e9232f54732a5d9ffe9071bf572\",\"photo\":\"a88e6ae3-af87-490e-8f3e-6a92156dc95f.jpeg\"}][参数2:[\"2619a672e53811e7b983201a068c6482\",\"4bb891d8caf84cc6ba27e515e80ac40d\"]]', + '2022-03-26 21:30:47'); +INSERT INTO `sys_log` +VALUES (104, 'admin', '0:0:0:0:0:0:0:1', 'ATHOR', '添加用户', + '[参数1:{\"age\":20,\"email\":\"11@qq.com\",\"id\":\"d818ac6a86cf1a64d2184bf0699d67a8\",\"password\":\"6a333668613ef7946f4462866f537fb5\",\"photo\":\"\",\"username\":\"jingli\"}][参数2:[\"0ea934e5e55411e7b983201a068c6482\"]]', + '2022-03-31 10:54:36'); +INSERT INTO `sys_log` +VALUES (105, 'admin', '0:0:0:0:0:0:0:1', 'ATHOR', '添加用户', + '[参数1:{\"age\":20,\"email\":\"11@qq.com\",\"id\":\"98b051b03681de6028993a5d14ac93cb\",\"password\":\"bce07289deffa09011e644813e6d86a4\",\"photo\":\"\",\"username\":\"hr\"}][参数2:[\"023366f3457511e8bcf1309c2315f9aa\"]]', + '2022-03-31 10:55:54'); +INSERT INTO `sys_log` +VALUES (106, 'admin', '0:0:0:0:0:0:0:1', 'ATHOR', '添加用户', + '[参数1:{\"age\":20,\"email\":\"11@qq.com\",\"id\":\"5946a985f733c57f1ab71689f7b6aeea\",\"password\":\"a07e4c18324811b0d0ec17a89e0f855b\",\"photo\":\"\",\"username\":\"zhangsan\"}][参数2:[\"dcb0f642fe9611e7b472201a068c6482\"]]', + '2022-03-31 10:56:46'); +INSERT INTO `sys_log` +VALUES (107, 'admin', '0:0:0:0:0:0:0:1', 'ATHOR', '添加用户', + '[参数1:{\"age\":20,\"email\":\"11@qq.com\",\"id\":\"0b7625fedaa05e85f282486e1c9c91b9\",\"password\":\"40d400f384b4996fd6ab30dab720ef1e\",\"photo\":\"\",\"username\":\"jingli1\"}][参数2:[\"e346e96368484c8fa7f217ce550a0186\"]]', + '2022-03-31 10:57:48'); +INSERT INTO `sys_log` +VALUES (108, 'admin', '0:0:0:0:0:0:0:1', 'SELECT', '展示菜单', NULL, '2022-06-23 18:03:21'); -- ---------------------------- -- Table structure for sys_menu -- ---------------------------- DROP TABLE IF EXISTS `sys_menu`; -CREATE TABLE `sys_menu` ( - `id` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, - `code` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, - `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, - `p_id` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, - `router` varchar(16) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, - `url` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, - `order_num` int(4) NULL DEFAULT NULL COMMENT '排序字段', - `icon` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '图标', - `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, - `create_date` datetime(0) NULL DEFAULT NULL, - `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, - `update_date` datetime(0) NULL DEFAULT NULL, - `permission` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '权限', - `menu_type` tinyint(4) NOT NULL DEFAULT 0 COMMENT '1栏目2菜单', - PRIMARY KEY (`id`) USING BTREE +CREATE TABLE `sys_menu` +( + `id` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `code` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `p_id` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `router` varchar(16) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `url` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `order_num` int(4) NULL DEFAULT NULL COMMENT '排序字段', + `icon` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '图标', + `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `create_date` datetime(0) NULL DEFAULT NULL, + `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `update_date` datetime(0) NULL DEFAULT NULL, + `permission` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '权限', + `menu_type` tinyint(4) NOT NULL DEFAULT 0 COMMENT '1栏目2菜单', + PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of sys_menu -- ---------------------------- -INSERT INTO `sys_menu` VALUES ('0e6c8d4cf09511e78a57201a068c6482', '1010', '删除', 'cff61424dfb311e7b555201a068c6482', '', NULL, 3, '', 'acfc0e9232f54732a5d9ffe9071bf572', '2018-01-03 22:47:44', NULL, NULL, 'role:del', 1); -INSERT INTO `sys_menu` VALUES ('18bf8d5df09511e78a57201a068c6482', '1777', '新增', '3873ccc2dfda11e7b555201a068c6482', '', NULL, 1, '', 'acfc0e9232f54732a5d9ffe9071bf572', '2018-01-03 22:48:01', NULL, NULL, 'nemu:add', 1); -INSERT INTO `sys_menu` VALUES ('28661300f9d411e7a009201a068c6482', '9610', '流程管理', 'e06da471f90311e780aa201a068c6482', 'bpmn', '/act/goAct', 2, '', 'acfc0e9232f54732a5d9ffe9071bf572', '2018-01-15 17:12:06', NULL, NULL, 'act:deployment', 0); -INSERT INTO `sys_menu` VALUES ('2b56410cf09411e78a57201a068c6482', '4736', '新增', 'cff61424dfb311e7b555201a068c6482', '', NULL, 1, '', 'acfc0e9232f54732a5d9ffe9071bf572', '2018-01-03 22:41:23', NULL, NULL, 'role:add', 1); -INSERT INTO `sys_menu` VALUES ('3873ccc2dfda11e7b555201a068c6482', '8484', '菜单管理', 'cfda8029dfb311e7b555201a068c6482', 'menu', 'menu/showMenu', 1, '', NULL, '2017-12-14 14:02:50', 'acfc0e9232f54732a5d9ffe9071bf572', '2018-04-23 19:43:54', 'menu:show', 0); -INSERT INTO `sys_menu` VALUES ('433089a6eb0111e782d5201a068c6482', '3804', '编辑', 'cfe54921dfb311e7b555201a068c6482', '', '', NULL, '1', 'acfc0e9232f54732a5d9ffe9071bf572', '2017-12-27 20:27:11', NULL, NULL, 'user:update', 1); -INSERT INTO `sys_menu` VALUES ('4d603831fe9b11e7b472201a068c6482', '2286', '待办任务', 'e06da471f90311e780aa201a068c6482', '', '/leave/showTask', 5, '', 'acfc0e9232f54732a5d9ffe9071bf572', '2018-01-21 19:07:43', NULL, NULL, 'task:show', 0); -INSERT INTO `sys_menu` VALUES ('5ae3d4e9f38e11e7aca0201a068c6482', '2030', '新增', 'e9a13e55f35911e7aca0201a068c6482', '', NULL, 1, '', 'acfc0e9232f54732a5d9ffe9071bf572', '2018-01-07 17:37:30', NULL, NULL, 'job:add', 1); -INSERT INTO `sys_menu` VALUES ('6315968bf37111e7aca0201a068c6482', '4120', '停止', 'e9a13e55f35911e7aca0201a068c6482', '', NULL, 4, '', 'acfc0e9232f54732a5d9ffe9071bf572', '2018-01-07 14:10:09', NULL, NULL, 'job:end', 1); -INSERT INTO `sys_menu` VALUES ('63da4415fc6211e7a781201a068c6482', '3793', '模型列表', 'e06da471f90311e780aa201a068c6482', 'temp', '/act/goActModel', 3, '', 'acfc0e9232f54732a5d9ffe9071bf572', '2018-01-18 23:15:17', NULL, NULL, 'act', 0); -INSERT INTO `sys_menu` VALUES ('6931fd22f09611e78a57201a068c6482', '8953', '删除', 'b441914cee0811e7a60d201a068c6482', '', NULL, 1, '', 'acfc0e9232f54732a5d9ffe9071bf572', '2018-01-03 22:57:26', NULL, NULL, 'control:del', 1); -INSERT INTO `sys_menu` VALUES ('69f3f59cf38e11e7aca0201a068c6482', '6022', '编辑', 'e9a13e55f35911e7aca0201a068c6482', '', NULL, 2, '', 'acfc0e9232f54732a5d9ffe9071bf572', '2018-01-07 17:37:56', NULL, NULL, 'job:update', 1); -INSERT INTO `sys_menu` VALUES ('6dc13c6eec5f11e7a472201a068c6482', '3060', '系统日志', 'a1ca6642ec5e11e7a472201a068c6482', 'log', 'log/showLog', 1, '', 'acfc0e9232f54732a5d9ffe9071bf572', '2017-12-29 14:43:46', NULL, '2017-12-29 14:43:46', 'log:show', 0); -INSERT INTO `sys_menu` VALUES ('788d8e34f38e11e7aca0201a068c6482', '7543', '删除', 'e9a13e55f35911e7aca0201a068c6482', '', NULL, 5, '', 'acfc0e9232f54732a5d9ffe9071bf572', '2018-01-07 17:38:20', NULL, NULL, 'job:del', 1); -INSERT INTO `sys_menu` VALUES ('7967e098ee0611e7a60d201a068c6482', '6033', '接口api', 'a1ca6642ec5e11e7a472201a068c6482', 'api', 'swagger-ui.html', 2, '', 'acfc0e9232f54732a5d9ffe9071bf572', '2017-12-31 16:42:04', NULL, NULL, NULL, 0); -INSERT INTO `sys_menu` VALUES ('873f30b0f38e11e7aca0201a068c6482', '5879', '查看', 'e9a13e55f35911e7aca0201a068c6482', '', NULL, 6, '', 'acfc0e9232f54732a5d9ffe9071bf572', '2018-01-07 17:38:45', NULL, NULL, 'job:select', 1); -INSERT INTO `sys_menu` VALUES ('88b8e5d1f38911e7aca0201a068c6482', '9952', '查看', 'cff61424dfb311e7b555201a068c6482', '', NULL, 4, '', 'acfc0e9232f54732a5d9ffe9071bf572', '2018-01-07 17:03:00', NULL, NULL, 'role:select', 1); -INSERT INTO `sys_menu` VALUES ('8a6c8bfa7f804eac810c5790cad9a62a', '0141', '删除', '3873ccc2dfda11e7b555201a068c6482', '', NULL, 2, NULL, 'acfc0e9232f54732a5d9ffe9071bf572', '2018-06-20 21:55:55', NULL, NULL, 'menu:del', 1); -INSERT INTO `sys_menu` VALUES ('a1ca6642ec5e11e7a472201a068c6482', '8970', '系统监控', NULL, '', NULL, 2, '', 'acfc0e9232f54732a5d9ffe9071bf572', '2018-01-03 10:56:14', NULL, '2018-01-03 10:56:14', NULL, 0); -INSERT INTO `sys_menu` VALUES ('b441914cee0811e7a60d201a068c6482', '4299', '系统监控', 'a1ca6642ec5e11e7a472201a068c6482', 'control', 'druid/index.html', 3, '', 'acfc0e9232f54732a5d9ffe9071bf572', '2017-12-31 16:58:01', NULL, NULL, NULL, 0); -INSERT INTO `sys_menu` VALUES ('b7839f59fe8811e7b472201a068c6482', '9021', '请假流程', 'e06da471f90311e780aa201a068c6482', 'leave', '/leave/showLeave', 4, '', 'acfc0e9232f54732a5d9ffe9071bf572', '2018-01-21 16:54:40', NULL, NULL, 'leave:show', 0); -INSERT INTO `sys_menu` VALUES ('cfda8029dfb311e7b555201a068c6482', '1862', '系统管理', NULL, '', NULL, 1, '', NULL, '2018-01-03 10:56:13', NULL, '2018-01-03 10:56:13', NULL, 0); -INSERT INTO `sys_menu` VALUES ('cfe54921dfb311e7b555201a068c6482', '2643', '用户管理', 'cfda8029dfb311e7b555201a068c6482', 'user', '/user/showUser', 2, '', NULL, '2017-12-29 14:40:34', NULL, '2017-12-29 14:40:34', 'user:show', 0); -INSERT INTO `sys_menu` VALUES ('cfe54921dfb311e7b555201a068c6483', '0337', '增加', 'cfe54921dfb311e7b555201a068c6482', '', NULL, 1, NULL, NULL, NULL, NULL, NULL, 'user:select', 1); -INSERT INTO `sys_menu` VALUES ('cff61424dfb311e7b555201a068c6482', '5303', '角色管理', 'cfda8029dfb311e7b555201a068c6482', 'role', '/role/showRole', 3, '', NULL, '2017-12-29 14:40:36', NULL, '2017-12-29 14:40:36', 'role:show', 0); -INSERT INTO `sys_menu` VALUES ('e06da471f90311e780aa201a068c6482', '3371', '工作流程管理', NULL, '', NULL, 3, '', 'acfc0e9232f54732a5d9ffe9071bf572', '2018-01-14 16:21:10', NULL, NULL, NULL, 0); -INSERT INTO `sys_menu` VALUES ('e3b11497eb9e11e7928d201a068c6482', '8792', '删除', 'cfe54921dfb311e7b555201a068c6482', '', '', NULL, '', 'acfc0e9232f54732a5d9ffe9071bf572', '2017-12-28 15:17:07', NULL, '2017-12-28 15:17:07', 'user:del', 1); -INSERT INTO `sys_menu` VALUES ('e9a13e55f35911e7aca0201a068c6482', '9437', '定时任务', 'a1ca6642ec5e11e7a472201a068c6482', 'job', '/job/showJob', 3, '', 'acfc0e9232f54732a5d9ffe9071bf572', '2018-01-07 11:22:06', NULL, NULL, 'job:show', 0); -INSERT INTO `sys_menu` VALUES ('ecda560cf36f11e7aca0201a068c6482', '4908', '启动', 'e9a13e55f35911e7aca0201a068c6482', '', NULL, 3, '', 'acfc0e9232f54732a5d9ffe9071bf572', '2018-01-07 13:59:41', NULL, NULL, 'job:start', 1); -INSERT INTO `sys_menu` VALUES ('f23f6a6bf09511e78a57201a068c6482', '2812', '修改密码', 'cfe54921dfb311e7b555201a068c6482', '', NULL, 4, '', 'acfc0e9232f54732a5d9ffe9071bf572', '2018-01-03 22:54:06', NULL, NULL, 'user:repass', 1); -INSERT INTO `sys_menu` VALUES ('ff015ea5f09411e78a57201a068c6482', '3643', '编辑', 'cff61424dfb311e7b555201a068c6482', '', NULL, 2, '', 'acfc0e9232f54732a5d9ffe9071bf572', '2018-01-03 22:47:18', NULL, NULL, 'role:update', 1); +INSERT INTO `sys_menu` +VALUES ('0e6c8d4cf09511e78a57201a068c6482', '1010', '删除', 'cff61424dfb311e7b555201a068c6482', '', NULL, 3, '', + 'acfc0e9232f54732a5d9ffe9071bf572', '2018-01-03 22:47:44', NULL, NULL, 'role:del', 1); +INSERT INTO `sys_menu` +VALUES ('18bf8d5df09511e78a57201a068c6482', '1777', '新增', '3873ccc2dfda11e7b555201a068c6482', '', NULL, 1, '', + 'acfc0e9232f54732a5d9ffe9071bf572', '2018-01-03 22:48:01', NULL, NULL, 'nemu:add', 1); +INSERT INTO `sys_menu` +VALUES ('28661300f9d411e7a009201a068c6482', '9610', '流程管理', 'e06da471f90311e780aa201a068c6482', 'bpmn', + '/act/goAct', 2, '', 'acfc0e9232f54732a5d9ffe9071bf572', '2018-01-15 17:12:06', NULL, NULL, + 'act:deployment', 0); +INSERT INTO `sys_menu` +VALUES ('2b56410cf09411e78a57201a068c6482', '4736', '新增', 'cff61424dfb311e7b555201a068c6482', '', NULL, 1, '', + 'acfc0e9232f54732a5d9ffe9071bf572', '2018-01-03 22:41:23', NULL, NULL, 'role:add', 1); +INSERT INTO `sys_menu` +VALUES ('3873ccc2dfda11e7b555201a068c6482', '8484', '菜单管理', 'cfda8029dfb311e7b555201a068c6482', 'menu', + 'menu/showMenu', 1, '', NULL, '2017-12-14 14:02:50', 'acfc0e9232f54732a5d9ffe9071bf572', '2018-04-23 19:43:54', + 'menu:show', 0); +INSERT INTO `sys_menu` +VALUES ('433089a6eb0111e782d5201a068c6482', '3804', '编辑', 'cfe54921dfb311e7b555201a068c6482', '', '', NULL, '1', + 'acfc0e9232f54732a5d9ffe9071bf572', '2017-12-27 20:27:11', NULL, NULL, 'user:update', 1); +INSERT INTO `sys_menu` +VALUES ('4d603831fe9b11e7b472201a068c6482', '2286', '待办任务', 'e06da471f90311e780aa201a068c6482', '', + '/leave/showTask', 5, '', 'acfc0e9232f54732a5d9ffe9071bf572', '2018-01-21 19:07:43', NULL, NULL, + 'task:show', 0); +INSERT INTO `sys_menu` +VALUES ('5ae3d4e9f38e11e7aca0201a068c6482', '2030', '新增', 'e9a13e55f35911e7aca0201a068c6482', '', NULL, 1, '', + 'acfc0e9232f54732a5d9ffe9071bf572', '2018-01-07 17:37:30', NULL, NULL, 'job:add', 1); +INSERT INTO `sys_menu` +VALUES ('6315968bf37111e7aca0201a068c6482', '4120', '停止', 'e9a13e55f35911e7aca0201a068c6482', '', NULL, 4, '', + 'acfc0e9232f54732a5d9ffe9071bf572', '2018-01-07 14:10:09', NULL, NULL, 'job:end', 1); +INSERT INTO `sys_menu` +VALUES ('63da4415fc6211e7a781201a068c6482', '3793', '模型列表', 'e06da471f90311e780aa201a068c6482', 'temp', + '/act/goActModel', 3, '', 'acfc0e9232f54732a5d9ffe9071bf572', '2018-01-18 23:15:17', NULL, NULL, 'act', + 0); +INSERT INTO `sys_menu` +VALUES ('6931fd22f09611e78a57201a068c6482', '8953', '删除', 'b441914cee0811e7a60d201a068c6482', '', NULL, 1, '', + 'acfc0e9232f54732a5d9ffe9071bf572', '2018-01-03 22:57:26', NULL, NULL, 'control:del', 1); +INSERT INTO `sys_menu` +VALUES ('69f3f59cf38e11e7aca0201a068c6482', '6022', '编辑', 'e9a13e55f35911e7aca0201a068c6482', '', NULL, 2, '', + 'acfc0e9232f54732a5d9ffe9071bf572', '2018-01-07 17:37:56', NULL, NULL, 'job:update', 1); +INSERT INTO `sys_menu` +VALUES ('6dc13c6eec5f11e7a472201a068c6482', '3060', '系统日志', 'a1ca6642ec5e11e7a472201a068c6482', 'log', + 'log/showLog', 1, '', 'acfc0e9232f54732a5d9ffe9071bf572', '2017-12-29 14:43:46', NULL, + '2017-12-29 14:43:46', 'log:show', 0); +INSERT INTO `sys_menu` +VALUES ('788d8e34f38e11e7aca0201a068c6482', '7543', '删除', 'e9a13e55f35911e7aca0201a068c6482', '', NULL, 5, '', + 'acfc0e9232f54732a5d9ffe9071bf572', '2018-01-07 17:38:20', NULL, NULL, 'job:del', 1); +INSERT INTO `sys_menu` +VALUES ('7967e098ee0611e7a60d201a068c6482', '6033', '接口api', 'a1ca6642ec5e11e7a472201a068c6482', 'api', + 'swagger-ui.html', 2, '', 'acfc0e9232f54732a5d9ffe9071bf572', '2017-12-31 16:42:04', NULL, NULL, NULL, + 0); +INSERT INTO `sys_menu` +VALUES ('873f30b0f38e11e7aca0201a068c6482', '5879', '查看', 'e9a13e55f35911e7aca0201a068c6482', '', NULL, 6, '', + 'acfc0e9232f54732a5d9ffe9071bf572', '2018-01-07 17:38:45', NULL, NULL, 'job:select', 1); +INSERT INTO `sys_menu` +VALUES ('88b8e5d1f38911e7aca0201a068c6482', '9952', '查看', 'cff61424dfb311e7b555201a068c6482', '', NULL, 4, '', + 'acfc0e9232f54732a5d9ffe9071bf572', '2018-01-07 17:03:00', NULL, NULL, 'role:select', 1); +INSERT INTO `sys_menu` +VALUES ('8a6c8bfa7f804eac810c5790cad9a62a', '0141', '删除', '3873ccc2dfda11e7b555201a068c6482', '', NULL, 2, NULL, + 'acfc0e9232f54732a5d9ffe9071bf572', '2018-06-20 21:55:55', NULL, NULL, 'menu:del', 1); +INSERT INTO `sys_menu` +VALUES ('a1ca6642ec5e11e7a472201a068c6482', '8970', '系统监控', NULL, '', NULL, 2, '', + 'acfc0e9232f54732a5d9ffe9071bf572', '2018-01-03 10:56:14', NULL, '2018-01-03 10:56:14', NULL, 0); +INSERT INTO `sys_menu` +VALUES ('b441914cee0811e7a60d201a068c6482', '4299', '系统监控', 'a1ca6642ec5e11e7a472201a068c6482', 'control', + 'druid/index.html', 3, '', 'acfc0e9232f54732a5d9ffe9071bf572', '2017-12-31 16:58:01', NULL, NULL, NULL, + 0); +INSERT INTO `sys_menu` +VALUES ('b7839f59fe8811e7b472201a068c6482', '9021', '请假流程', 'e06da471f90311e780aa201a068c6482', 'leave', + '/leave/showLeave', 4, '', 'acfc0e9232f54732a5d9ffe9071bf572', '2018-01-21 16:54:40', NULL, NULL, + 'leave:show', 0); +INSERT INTO `sys_menu` +VALUES ('cfda8029dfb311e7b555201a068c6482', '1862', '系统管理', NULL, '', NULL, 1, '', NULL, + '2018-01-03 10:56:13', NULL, '2018-01-03 10:56:13', NULL, 0); +INSERT INTO `sys_menu` +VALUES ('cfe54921dfb311e7b555201a068c6482', '2643', '用户管理', 'cfda8029dfb311e7b555201a068c6482', 'user', + '/user/showUser', 2, '', NULL, '2017-12-29 14:40:34', NULL, '2017-12-29 14:40:34', 'user:show', 0); +INSERT INTO `sys_menu` +VALUES ('cfe54921dfb311e7b555201a068c6483', '0337', '增加', 'cfe54921dfb311e7b555201a068c6482', '', NULL, 1, NULL, NULL, + NULL, NULL, NULL, 'user:select', 1); +INSERT INTO `sys_menu` +VALUES ('cff61424dfb311e7b555201a068c6482', '5303', '角色管理', 'cfda8029dfb311e7b555201a068c6482', 'role', + '/role/showRole', 3, '', NULL, '2017-12-29 14:40:36', NULL, '2017-12-29 14:40:36', 'role:show', 0); +INSERT INTO `sys_menu` +VALUES ('e06da471f90311e780aa201a068c6482', '3371', '工作流程管理', NULL, '', NULL, 3, '', + 'acfc0e9232f54732a5d9ffe9071bf572', '2018-01-14 16:21:10', NULL, NULL, NULL, 0); +INSERT INTO `sys_menu` +VALUES ('e3b11497eb9e11e7928d201a068c6482', '8792', '删除', 'cfe54921dfb311e7b555201a068c6482', '', '', NULL, '', + 'acfc0e9232f54732a5d9ffe9071bf572', '2017-12-28 15:17:07', NULL, '2017-12-28 15:17:07', 'user:del', 1); +INSERT INTO `sys_menu` +VALUES ('e9a13e55f35911e7aca0201a068c6482', '9437', '定时任务', 'a1ca6642ec5e11e7a472201a068c6482', 'job', + '/job/showJob', 3, '', 'acfc0e9232f54732a5d9ffe9071bf572', '2018-01-07 11:22:06', NULL, NULL, + 'job:show', 0); +INSERT INTO `sys_menu` +VALUES ('ecda560cf36f11e7aca0201a068c6482', '4908', '启动', 'e9a13e55f35911e7aca0201a068c6482', '', NULL, 3, '', + 'acfc0e9232f54732a5d9ffe9071bf572', '2018-01-07 13:59:41', NULL, NULL, 'job:start', 1); +INSERT INTO `sys_menu` +VALUES ('f23f6a6bf09511e78a57201a068c6482', '2812', '修改密码', 'cfe54921dfb311e7b555201a068c6482', '', NULL, 4, '', + 'acfc0e9232f54732a5d9ffe9071bf572', '2018-01-03 22:54:06', NULL, NULL, 'user:repass', 1); +INSERT INTO `sys_menu` +VALUES ('ff015ea5f09411e78a57201a068c6482', '3643', '编辑', 'cff61424dfb311e7b555201a068c6482', '', NULL, 2, '', + 'acfc0e9232f54732a5d9ffe9071bf572', '2018-01-03 22:47:18', NULL, NULL, 'role:update', 1); -- ---------------------------- -- Table structure for sys_panelopt -- ---------------------------- DROP TABLE IF EXISTS `sys_panelopt`; -CREATE TABLE `sys_panelopt` ( - `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `panelopt_column` int(4) NOT NULL COMMENT '菜单顺序', - `panelopt_index` int(4) NOT NULL COMMENT '行', - `panelopt_code` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '列', - `panelopt_userid` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, - `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, - `create_date` datetime(0) NULL DEFAULT NULL, - `update_date` datetime(0) NULL DEFAULT NULL, - PRIMARY KEY (`id`) USING BTREE +CREATE TABLE `sys_panelopt` +( + `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `panelopt_column` int(4) NOT NULL COMMENT '菜单顺序', + `panelopt_index` int(4) NOT NULL COMMENT '行', + `panelopt_code` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '列', + `panelopt_userid` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `create_date` datetime(0) NULL DEFAULT NULL, + `update_date` datetime(0) NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of sys_panelopt -- ---------------------------- -INSERT INTO `sys_panelopt` VALUES ('4ce6ed8e7724d5eca359fe4000678ec4', 1, 1, 'BACKLOG', 'acfc0e9232f54732a5d9ffe9071bf572', NULL, NULL, NULL, NULL); -INSERT INTO `sys_panelopt` VALUES ('6a11703827eb95735368f587350d4822', 2, 0, 'DYNAMIC', 'acfc0e9232f54732a5d9ffe9071bf572', NULL, NULL, NULL, NULL); -INSERT INTO `sys_panelopt` VALUES ('f42c77353ce806e5b5a788b508f76c88', 1, 0, 'SHORTCUTS', 'acfc0e9232f54732a5d9ffe9071bf572', NULL, NULL, NULL, NULL); +INSERT INTO `sys_panelopt` +VALUES ('4ce6ed8e7724d5eca359fe4000678ec4', 1, 1, 'BACKLOG', 'acfc0e9232f54732a5d9ffe9071bf572', NULL, NULL, NULL, + NULL); +INSERT INTO `sys_panelopt` +VALUES ('6a11703827eb95735368f587350d4822', 2, 0, 'DYNAMIC', 'acfc0e9232f54732a5d9ffe9071bf572', NULL, NULL, NULL, + NULL); +INSERT INTO `sys_panelopt` +VALUES ('f42c77353ce806e5b5a788b508f76c88', 1, 0, 'SHORTCUTS', 'acfc0e9232f54732a5d9ffe9071bf572', NULL, NULL, NULL, + NULL); -- ---------------------------- -- Table structure for sys_role -- ---------------------------- DROP TABLE IF EXISTS `sys_role`; -CREATE TABLE `sys_role` ( - `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, - `role_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, - `remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, - `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, - `create_date` datetime(0) NULL DEFAULT NULL, - `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, - `update_date` datetime(0) NULL DEFAULT NULL, - PRIMARY KEY (`id`) USING BTREE +CREATE TABLE `sys_role` +( + `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `role_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `create_date` datetime(0) NULL DEFAULT NULL, + `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `update_date` datetime(0) NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of sys_role -- ---------------------------- -INSERT INTO `sys_role` VALUES ('023366f3457511e8bcf1309c2315f9aa', 'hr', '人事', 'acfc0e9232f54732a5d9ffe9071bf572', '2018-04-21 23:02:16', NULL, NULL); -INSERT INTO `sys_role` VALUES ('0ea934e5e55411e7b983201a068c6482', 'manage', '经理', 'acfc0e9232f54732a5d9ffe9071bf572', '2017-12-20 15:04:44', NULL, '2018-01-02 11:41:43'); -INSERT INTO `sys_role` VALUES ('2619a672e53811e7b983201a068c6482', 'admin', '管理员', 'acfc0e9232f54732a5d9ffe9071bf572', '2017-12-20 11:44:57', NULL, '2018-01-02 11:38:37'); -INSERT INTO `sys_role` VALUES ('4bb891d8caf84cc6ba27e515e80ac40d', 'blogAdmin', '博客管理员', 'acfc0e9232f54732a5d9ffe9071bf572', '2018-10-01 10:21:10', NULL, NULL); -INSERT INTO `sys_role` VALUES ('dcb0f642fe9611e7b472201a068c6482', 'dev', '开发', 'acfc0e9232f54732a5d9ffe9071bf572', '2018-01-21 18:35:56', NULL, NULL); -INSERT INTO `sys_role` VALUES ('e346e96368484c8fa7f217ce550a0186', 'DeputyManager', '副经理', 'acfc0e9232f54732a5d9ffe9071bf572', '2018-06-14 23:21:36', NULL, NULL); +INSERT INTO `sys_role` +VALUES ('023366f3457511e8bcf1309c2315f9aa', 'hr', '人事', 'acfc0e9232f54732a5d9ffe9071bf572', '2018-04-21 23:02:16', + NULL, NULL); +INSERT INTO `sys_role` +VALUES ('0ea934e5e55411e7b983201a068c6482', 'manage', '经理', 'acfc0e9232f54732a5d9ffe9071bf572', '2017-12-20 15:04:44', + NULL, '2018-01-02 11:41:43'); +INSERT INTO `sys_role` +VALUES ('2619a672e53811e7b983201a068c6482', 'admin', '管理员', 'acfc0e9232f54732a5d9ffe9071bf572', + '2017-12-20 11:44:57', NULL, '2018-01-02 11:38:37'); +INSERT INTO `sys_role` +VALUES ('4bb891d8caf84cc6ba27e515e80ac40d', 'blogAdmin', '博客管理员', 'acfc0e9232f54732a5d9ffe9071bf572', + '2018-10-01 10:21:10', NULL, NULL); +INSERT INTO `sys_role` +VALUES ('dcb0f642fe9611e7b472201a068c6482', 'dev', '开发', 'acfc0e9232f54732a5d9ffe9071bf572', '2018-01-21 18:35:56', + NULL, NULL); +INSERT INTO `sys_role` +VALUES ('e346e96368484c8fa7f217ce550a0186', 'DeputyManager', '副经理', 'acfc0e9232f54732a5d9ffe9071bf572', + '2018-06-14 23:21:36', NULL, NULL); -- ---------------------------- -- Table structure for sys_role_menu -- ---------------------------- DROP TABLE IF EXISTS `sys_role_menu`; -CREATE TABLE `sys_role_menu` ( - `role_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, - `menu_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, - PRIMARY KEY (`role_id`, `menu_id`) USING BTREE +CREATE TABLE `sys_role_menu` +( + `role_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `menu_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + PRIMARY KEY (`role_id`, `menu_id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of sys_role_menu -- ---------------------------- -INSERT INTO `sys_role_menu` VALUES ('023366f3457511e8bcf1309c2315f9aa', '433089a6eb0111e782d5201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('023366f3457511e8bcf1309c2315f9aa', '4d603831fe9b11e7b472201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('023366f3457511e8bcf1309c2315f9aa', 'b7839f59fe8811e7b472201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('023366f3457511e8bcf1309c2315f9aa', 'cfda8029dfb311e7b555201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('023366f3457511e8bcf1309c2315f9aa', 'cfe54921dfb311e7b555201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('023366f3457511e8bcf1309c2315f9aa', 'cfe54921dfb311e7b555201a068c6483'); -INSERT INTO `sys_role_menu` VALUES ('023366f3457511e8bcf1309c2315f9aa', 'e06da471f90311e780aa201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('023366f3457511e8bcf1309c2315f9aa', 'e3b11497eb9e11e7928d201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('023366f3457511e8bcf1309c2315f9aa', 'f23f6a6bf09511e78a57201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('0ea934e5e55411e7b983201a068c6482', '433089a6eb0111e782d5201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('0ea934e5e55411e7b983201a068c6482', '4d603831fe9b11e7b472201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('0ea934e5e55411e7b983201a068c6482', '6931fd22f09611e78a57201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('0ea934e5e55411e7b983201a068c6482', '6dc13c6eec5f11e7a472201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('0ea934e5e55411e7b983201a068c6482', 'a1ca6642ec5e11e7a472201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('0ea934e5e55411e7b983201a068c6482', 'b7839f59fe8811e7b472201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('0ea934e5e55411e7b983201a068c6482', 'cfda8029dfb311e7b555201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('0ea934e5e55411e7b983201a068c6482', 'cfe54921dfb311e7b555201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('0ea934e5e55411e7b983201a068c6482', 'e06da471f90311e780aa201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('2619a672e53811e7b983201a068c6482', '0e6c8d4cf09511e78a57201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('2619a672e53811e7b983201a068c6482', '18bf8d5df09511e78a57201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('2619a672e53811e7b983201a068c6482', '28661300f9d411e7a009201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('2619a672e53811e7b983201a068c6482', '2b56410cf09411e78a57201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('2619a672e53811e7b983201a068c6482', '3873ccc2dfda11e7b555201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('2619a672e53811e7b983201a068c6482', '433089a6eb0111e782d5201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('2619a672e53811e7b983201a068c6482', '4d603831fe9b11e7b472201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('2619a672e53811e7b983201a068c6482', '5ae3d4e9f38e11e7aca0201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('2619a672e53811e7b983201a068c6482', '6315968bf37111e7aca0201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('2619a672e53811e7b983201a068c6482', '63da4415fc6211e7a781201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('2619a672e53811e7b983201a068c6482', '6931fd22f09611e78a57201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('2619a672e53811e7b983201a068c6482', '69f3f59cf38e11e7aca0201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('2619a672e53811e7b983201a068c6482', '6dc13c6eec5f11e7a472201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('2619a672e53811e7b983201a068c6482', '788d8e34f38e11e7aca0201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('2619a672e53811e7b983201a068c6482', '7967e098ee0611e7a60d201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('2619a672e53811e7b983201a068c6482', '873f30b0f38e11e7aca0201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('2619a672e53811e7b983201a068c6482', '88b8e5d1f38911e7aca0201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('2619a672e53811e7b983201a068c6482', 'a1ca6642ec5e11e7a472201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('2619a672e53811e7b983201a068c6482', 'b441914cee0811e7a60d201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('2619a672e53811e7b983201a068c6482', 'b7839f59fe8811e7b472201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('2619a672e53811e7b983201a068c6482', 'cfda8029dfb311e7b555201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('2619a672e53811e7b983201a068c6482', 'cfe54921dfb311e7b555201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('2619a672e53811e7b983201a068c6482', 'cfe54921dfb311e7b555201a068c6483'); -INSERT INTO `sys_role_menu` VALUES ('2619a672e53811e7b983201a068c6482', 'cff61424dfb311e7b555201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('2619a672e53811e7b983201a068c6482', 'e06da471f90311e780aa201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('2619a672e53811e7b983201a068c6482', 'e3b11497eb9e11e7928d201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('2619a672e53811e7b983201a068c6482', 'e9a13e55f35911e7aca0201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('2619a672e53811e7b983201a068c6482', 'ecda560cf36f11e7aca0201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('2619a672e53811e7b983201a068c6482', 'f23f6a6bf09511e78a57201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('2619a672e53811e7b983201a068c6482', 'ff015ea5f09411e78a57201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('35f7934d335e4641b7887e4b3b1885a5', '18bf8d5df09511e78a57201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('35f7934d335e4641b7887e4b3b1885a5', '3873ccc2dfda11e7b555201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('35f7934d335e4641b7887e4b3b1885a5', 'cfda8029dfb311e7b555201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('a56219ffeb7d11e7928d201a068c6482', '433089a6eb0111e782d5201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('a56219ffeb7d11e7928d201a068c6482', 'cfda8029dfb311e7b555201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('a56219ffeb7d11e7928d201a068c6482', 'cfe54921dfb311e7b555201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('dcb0f642fe9611e7b472201a068c6482', '4d603831fe9b11e7b472201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('dcb0f642fe9611e7b472201a068c6482', '5ae3d4e9f38e11e7aca0201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('dcb0f642fe9611e7b472201a068c6482', '6315968bf37111e7aca0201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('dcb0f642fe9611e7b472201a068c6482', '69f3f59cf38e11e7aca0201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('dcb0f642fe9611e7b472201a068c6482', '788d8e34f38e11e7aca0201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('dcb0f642fe9611e7b472201a068c6482', '873f30b0f38e11e7aca0201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('dcb0f642fe9611e7b472201a068c6482', 'a1ca6642ec5e11e7a472201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('dcb0f642fe9611e7b472201a068c6482', 'b7839f59fe8811e7b472201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('dcb0f642fe9611e7b472201a068c6482', 'e06da471f90311e780aa201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('dcb0f642fe9611e7b472201a068c6482', 'e9a13e55f35911e7aca0201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('dcb0f642fe9611e7b472201a068c6482', 'ecda560cf36f11e7aca0201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('e346e96368484c8fa7f217ce550a0186', '4d603831fe9b11e7b472201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('e346e96368484c8fa7f217ce550a0186', 'b7839f59fe8811e7b472201a068c6482'); -INSERT INTO `sys_role_menu` VALUES ('e346e96368484c8fa7f217ce550a0186', 'e06da471f90311e780aa201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('023366f3457511e8bcf1309c2315f9aa', '433089a6eb0111e782d5201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('023366f3457511e8bcf1309c2315f9aa', '4d603831fe9b11e7b472201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('023366f3457511e8bcf1309c2315f9aa', 'b7839f59fe8811e7b472201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('023366f3457511e8bcf1309c2315f9aa', 'cfda8029dfb311e7b555201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('023366f3457511e8bcf1309c2315f9aa', 'cfe54921dfb311e7b555201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('023366f3457511e8bcf1309c2315f9aa', 'cfe54921dfb311e7b555201a068c6483'); +INSERT INTO `sys_role_menu` +VALUES ('023366f3457511e8bcf1309c2315f9aa', 'e06da471f90311e780aa201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('023366f3457511e8bcf1309c2315f9aa', 'e3b11497eb9e11e7928d201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('023366f3457511e8bcf1309c2315f9aa', 'f23f6a6bf09511e78a57201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('0ea934e5e55411e7b983201a068c6482', '433089a6eb0111e782d5201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('0ea934e5e55411e7b983201a068c6482', '4d603831fe9b11e7b472201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('0ea934e5e55411e7b983201a068c6482', '6931fd22f09611e78a57201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('0ea934e5e55411e7b983201a068c6482', '6dc13c6eec5f11e7a472201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('0ea934e5e55411e7b983201a068c6482', 'a1ca6642ec5e11e7a472201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('0ea934e5e55411e7b983201a068c6482', 'b7839f59fe8811e7b472201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('0ea934e5e55411e7b983201a068c6482', 'cfda8029dfb311e7b555201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('0ea934e5e55411e7b983201a068c6482', 'cfe54921dfb311e7b555201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('0ea934e5e55411e7b983201a068c6482', 'e06da471f90311e780aa201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('2619a672e53811e7b983201a068c6482', '0e6c8d4cf09511e78a57201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('2619a672e53811e7b983201a068c6482', '18bf8d5df09511e78a57201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('2619a672e53811e7b983201a068c6482', '28661300f9d411e7a009201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('2619a672e53811e7b983201a068c6482', '2b56410cf09411e78a57201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('2619a672e53811e7b983201a068c6482', '3873ccc2dfda11e7b555201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('2619a672e53811e7b983201a068c6482', '433089a6eb0111e782d5201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('2619a672e53811e7b983201a068c6482', '4d603831fe9b11e7b472201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('2619a672e53811e7b983201a068c6482', '5ae3d4e9f38e11e7aca0201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('2619a672e53811e7b983201a068c6482', '6315968bf37111e7aca0201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('2619a672e53811e7b983201a068c6482', '63da4415fc6211e7a781201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('2619a672e53811e7b983201a068c6482', '6931fd22f09611e78a57201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('2619a672e53811e7b983201a068c6482', '69f3f59cf38e11e7aca0201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('2619a672e53811e7b983201a068c6482', '6dc13c6eec5f11e7a472201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('2619a672e53811e7b983201a068c6482', '788d8e34f38e11e7aca0201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('2619a672e53811e7b983201a068c6482', '7967e098ee0611e7a60d201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('2619a672e53811e7b983201a068c6482', '873f30b0f38e11e7aca0201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('2619a672e53811e7b983201a068c6482', '88b8e5d1f38911e7aca0201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('2619a672e53811e7b983201a068c6482', 'a1ca6642ec5e11e7a472201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('2619a672e53811e7b983201a068c6482', 'b441914cee0811e7a60d201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('2619a672e53811e7b983201a068c6482', 'b7839f59fe8811e7b472201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('2619a672e53811e7b983201a068c6482', 'cfda8029dfb311e7b555201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('2619a672e53811e7b983201a068c6482', 'cfe54921dfb311e7b555201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('2619a672e53811e7b983201a068c6482', 'cfe54921dfb311e7b555201a068c6483'); +INSERT INTO `sys_role_menu` +VALUES ('2619a672e53811e7b983201a068c6482', 'cff61424dfb311e7b555201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('2619a672e53811e7b983201a068c6482', 'e06da471f90311e780aa201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('2619a672e53811e7b983201a068c6482', 'e3b11497eb9e11e7928d201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('2619a672e53811e7b983201a068c6482', 'e9a13e55f35911e7aca0201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('2619a672e53811e7b983201a068c6482', 'ecda560cf36f11e7aca0201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('2619a672e53811e7b983201a068c6482', 'f23f6a6bf09511e78a57201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('2619a672e53811e7b983201a068c6482', 'ff015ea5f09411e78a57201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('35f7934d335e4641b7887e4b3b1885a5', '18bf8d5df09511e78a57201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('35f7934d335e4641b7887e4b3b1885a5', '3873ccc2dfda11e7b555201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('35f7934d335e4641b7887e4b3b1885a5', 'cfda8029dfb311e7b555201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('a56219ffeb7d11e7928d201a068c6482', '433089a6eb0111e782d5201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('a56219ffeb7d11e7928d201a068c6482', 'cfda8029dfb311e7b555201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('a56219ffeb7d11e7928d201a068c6482', 'cfe54921dfb311e7b555201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('dcb0f642fe9611e7b472201a068c6482', '4d603831fe9b11e7b472201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('dcb0f642fe9611e7b472201a068c6482', '5ae3d4e9f38e11e7aca0201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('dcb0f642fe9611e7b472201a068c6482', '6315968bf37111e7aca0201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('dcb0f642fe9611e7b472201a068c6482', '69f3f59cf38e11e7aca0201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('dcb0f642fe9611e7b472201a068c6482', '788d8e34f38e11e7aca0201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('dcb0f642fe9611e7b472201a068c6482', '873f30b0f38e11e7aca0201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('dcb0f642fe9611e7b472201a068c6482', 'a1ca6642ec5e11e7a472201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('dcb0f642fe9611e7b472201a068c6482', 'b7839f59fe8811e7b472201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('dcb0f642fe9611e7b472201a068c6482', 'e06da471f90311e780aa201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('dcb0f642fe9611e7b472201a068c6482', 'e9a13e55f35911e7aca0201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('dcb0f642fe9611e7b472201a068c6482', 'ecda560cf36f11e7aca0201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('e346e96368484c8fa7f217ce550a0186', '4d603831fe9b11e7b472201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('e346e96368484c8fa7f217ce550a0186', 'b7839f59fe8811e7b472201a068c6482'); +INSERT INTO `sys_role_menu` +VALUES ('e346e96368484c8fa7f217ce550a0186', 'e06da471f90311e780aa201a068c6482'); -- ---------------------------- -- Table structure for sys_role_user -- ---------------------------- DROP TABLE IF EXISTS `sys_role_user`; -CREATE TABLE `sys_role_user` ( - `user_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, - `role_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, - PRIMARY KEY (`user_id`, `role_id`) USING BTREE +CREATE TABLE `sys_role_user` +( + `user_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `role_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + PRIMARY KEY (`user_id`, `role_id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of sys_role_user -- ---------------------------- -INSERT INTO `sys_role_user` VALUES ('0b7625fedaa05e85f282486e1c9c91b9', 'e346e96368484c8fa7f217ce550a0186'); -INSERT INTO `sys_role_user` VALUES ('5946a985f733c57f1ab71689f7b6aeea', 'dcb0f642fe9611e7b472201a068c6482'); -INSERT INTO `sys_role_user` VALUES ('98b051b03681de6028993a5d14ac93cb', '023366f3457511e8bcf1309c2315f9aa'); -INSERT INTO `sys_role_user` VALUES ('acfc0e9232f54732a5d9ffe9071bf572', '2619a672e53811e7b983201a068c6482'); -INSERT INTO `sys_role_user` VALUES ('acfc0e9232f54732a5d9ffe9071bf572', '4bb891d8caf84cc6ba27e515e80ac40d'); -INSERT INTO `sys_role_user` VALUES ('d818ac6a86cf1a64d2184bf0699d67a8', '0ea934e5e55411e7b983201a068c6482'); +INSERT INTO `sys_role_user` +VALUES ('0b7625fedaa05e85f282486e1c9c91b9', 'e346e96368484c8fa7f217ce550a0186'); +INSERT INTO `sys_role_user` +VALUES ('5946a985f733c57f1ab71689f7b6aeea', 'dcb0f642fe9611e7b472201a068c6482'); +INSERT INTO `sys_role_user` +VALUES ('98b051b03681de6028993a5d14ac93cb', '023366f3457511e8bcf1309c2315f9aa'); +INSERT INTO `sys_role_user` +VALUES ('acfc0e9232f54732a5d9ffe9071bf572', '2619a672e53811e7b983201a068c6482'); +INSERT INTO `sys_role_user` +VALUES ('acfc0e9232f54732a5d9ffe9071bf572', '4bb891d8caf84cc6ba27e515e80ac40d'); +INSERT INTO `sys_role_user` +VALUES ('d818ac6a86cf1a64d2184bf0699d67a8', '0ea934e5e55411e7b983201a068c6482'); -- ---------------------------- -- Table structure for sys_shortcuts -- ---------------------------- DROP TABLE IF EXISTS `sys_shortcuts`; -CREATE TABLE `sys_shortcuts` ( - `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `shortcuts_num` int(4) NOT NULL COMMENT '序号', - `shortcuts_userid` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '用户id', - `shortcuts_menuid` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '菜单id', - `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, - `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, - `create_date` datetime(0) NULL DEFAULT NULL, - `update_date` datetime(0) NULL DEFAULT NULL, - PRIMARY KEY (`id`) USING BTREE +CREATE TABLE `sys_shortcuts` +( + `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `shortcuts_num` int(4) NOT NULL COMMENT '序号', + `shortcuts_userid` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '用户id', + `shortcuts_menuid` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '菜单id', + `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `create_date` datetime(0) NULL DEFAULT NULL, + `update_date` datetime(0) NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of sys_shortcuts -- ---------------------------- -INSERT INTO `sys_shortcuts` VALUES ('326c6c7b1cbd4aadbd9f562b15f30f3e', 5, 'acfc0e9232f54732a5d9ffe9071bf572', 'e9a13e55f35911e7aca0201a068c6482', 'acfc0e9232f54732a5d9ffe9071bf572', NULL, '2022-04-30 22:22:10', NULL); -INSERT INTO `sys_shortcuts` VALUES ('468edda3053f49879fcb5b4b124c6362', 5, 'acfc0e9232f54732a5d9ffe9071bf572', '6dc13c6eec5f11e7a472201a068c6482', 'acfc0e9232f54732a5d9ffe9071bf572', NULL, '2022-07-20 18:10:26', NULL); -INSERT INTO `sys_shortcuts` VALUES ('63131105465041b4ac01c3e2ad72e48e', 1, 'acfc0e9232f54732a5d9ffe9071bf572', '3873ccc2dfda11e7b555201a068c6482', 'acfc0e9232f54732a5d9ffe9071bf572', NULL, '2022-04-17 23:09:37', NULL); -INSERT INTO `sys_shortcuts` VALUES ('a3c5d6a90a2146d9b19a6119581157c5', 2, 'acfc0e9232f54732a5d9ffe9071bf572', 'cfe54921dfb311e7b555201a068c6482', 'acfc0e9232f54732a5d9ffe9071bf572', NULL, '2022-05-03 09:14:22', NULL); -INSERT INTO `sys_shortcuts` VALUES ('bf1bbfc705bb46bfb3f2c247a8e799eb', 0, 'acfc0e9232f54732a5d9ffe9071bf572', '7967e098ee0611e7a60d201a068c6482', 'acfc0e9232f54732a5d9ffe9071bf572', NULL, '2022-05-02 23:52:20', NULL); -INSERT INTO `sys_shortcuts` VALUES ('ca68ff4350b74fb0b339d464f2b10423', 3, 'acfc0e9232f54732a5d9ffe9071bf572', 'b441914cee0811e7a60d201a068c6482', 'acfc0e9232f54732a5d9ffe9071bf572', NULL, '2022-05-03 09:14:10', NULL); +INSERT INTO `sys_shortcuts` +VALUES ('326c6c7b1cbd4aadbd9f562b15f30f3e', 5, 'acfc0e9232f54732a5d9ffe9071bf572', 'e9a13e55f35911e7aca0201a068c6482', + 'acfc0e9232f54732a5d9ffe9071bf572', NULL, '2022-04-30 22:22:10', NULL); +INSERT INTO `sys_shortcuts` +VALUES ('468edda3053f49879fcb5b4b124c6362', 5, 'acfc0e9232f54732a5d9ffe9071bf572', '6dc13c6eec5f11e7a472201a068c6482', + 'acfc0e9232f54732a5d9ffe9071bf572', NULL, '2022-07-20 18:10:26', NULL); +INSERT INTO `sys_shortcuts` +VALUES ('63131105465041b4ac01c3e2ad72e48e', 1, 'acfc0e9232f54732a5d9ffe9071bf572', '3873ccc2dfda11e7b555201a068c6482', + 'acfc0e9232f54732a5d9ffe9071bf572', NULL, '2022-04-17 23:09:37', NULL); +INSERT INTO `sys_shortcuts` +VALUES ('a3c5d6a90a2146d9b19a6119581157c5', 2, 'acfc0e9232f54732a5d9ffe9071bf572', 'cfe54921dfb311e7b555201a068c6482', + 'acfc0e9232f54732a5d9ffe9071bf572', NULL, '2022-05-03 09:14:22', NULL); +INSERT INTO `sys_shortcuts` +VALUES ('bf1bbfc705bb46bfb3f2c247a8e799eb', 0, 'acfc0e9232f54732a5d9ffe9071bf572', '7967e098ee0611e7a60d201a068c6482', + 'acfc0e9232f54732a5d9ffe9071bf572', NULL, '2022-05-02 23:52:20', NULL); +INSERT INTO `sys_shortcuts` +VALUES ('ca68ff4350b74fb0b339d464f2b10423', 3, 'acfc0e9232f54732a5d9ffe9071bf572', 'b441914cee0811e7a60d201a068c6482', + 'acfc0e9232f54732a5d9ffe9071bf572', NULL, '2022-05-03 09:14:10', NULL); -- ---------------------------- -- Table structure for sys_user -- ---------------------------- DROP TABLE IF EXISTS `sys_user`; -CREATE TABLE `sys_user` ( - `id` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, - `username` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, - `password` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, - `age` int(4) NULL DEFAULT NULL, - `email` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, - `photo` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, - `real_name` varchar(18) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, - `user_empid` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '员工id', - `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, - `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, - `create_date` datetime(0) NULL DEFAULT NULL, - `update_date` datetime(0) NULL DEFAULT NULL, - `del_flag` tinyint(4) NOT NULL DEFAULT 0 COMMENT '0可用1封禁', - PRIMARY KEY (`id`) USING BTREE +CREATE TABLE `sys_user` +( + `id` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `username` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `password` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `age` int(4) NULL DEFAULT NULL, + `email` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `photo` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `real_name` varchar(18) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `user_empid` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '员工id', + `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `create_date` datetime(0) NULL DEFAULT NULL, + `update_date` datetime(0) NULL DEFAULT NULL, + `del_flag` tinyint(4) NOT NULL DEFAULT 0 COMMENT '0可用1封禁', + PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of sys_user -- ---------------------------- -INSERT INTO `sys_user` VALUES ('0b7625fedaa05e85f282486e1c9c91b9', 'jingli1', '40d400f384b4996fd6ab30dab720ef1e', 20, '11@qq.com', '', NULL, NULL, NULL, NULL, NULL, NULL, 0); -INSERT INTO `sys_user` VALUES ('5946a985f733c57f1ab71689f7b6aeea', 'zhangsan', 'a07e4c18324811b0d0ec17a89e0f855b', 20, '11@qq.com', '', NULL, NULL, NULL, NULL, NULL, NULL, 0); -INSERT INTO `sys_user` VALUES ('98b051b03681de6028993a5d14ac93cb', 'hr', 'bce07289deffa09011e644813e6d86a4', 20, '11@qq.com', '', NULL, NULL, NULL, NULL, NULL, NULL, 0); -INSERT INTO `sys_user` VALUES ('acfc0e9232f54732a5d9ffe9071bf572', 'admin', 'e0b141de1c8091be350d3fc80de66528', 24, '', 'a88e6ae3-af87-490e-8f3e-6a92156dc95f.jpeg', '管理员', NULL, NULL, 'acfc0e9232f54732a5d9ffe9071bf572', '2017-12-20 16:34:06', '2018-10-01 10:21:19', 0); -INSERT INTO `sys_user` VALUES ('c7f1a7d7018311e8a1a2201a068c6482', '666', 'c6953f608430df414ea52e8c01b81a45', 24, '', '', '666', NULL, 'acfc0e9232f54732a5d9ffe9071bf572', 'acfc0e9232f54732a5d9ffe9071bf572', '2018-01-25 11:56:54', '2018-06-14 23:18:51', 1); -INSERT INTO `sys_user` VALUES ('d818ac6a86cf1a64d2184bf0699d67a8', 'jingli', '6a333668613ef7946f4462866f537fb5', 20, '11@qq.com', '', NULL, NULL, NULL, NULL, NULL, NULL, 0); +INSERT INTO `sys_user` +VALUES ('0b7625fedaa05e85f282486e1c9c91b9', 'jingli1', '40d400f384b4996fd6ab30dab720ef1e', 20, '11@qq.com', '', NULL, + NULL, NULL, NULL, NULL, NULL, 0); +INSERT INTO `sys_user` +VALUES ('5946a985f733c57f1ab71689f7b6aeea', 'zhangsan', 'a07e4c18324811b0d0ec17a89e0f855b', 20, '11@qq.com', '', NULL, + NULL, NULL, NULL, NULL, NULL, 0); +INSERT INTO `sys_user` +VALUES ('98b051b03681de6028993a5d14ac93cb', 'hr', 'bce07289deffa09011e644813e6d86a4', 20, '11@qq.com', '', NULL, NULL, + NULL, NULL, NULL, NULL, 0); +INSERT INTO `sys_user` +VALUES ('acfc0e9232f54732a5d9ffe9071bf572', 'admin', 'e0b141de1c8091be350d3fc80de66528', 24, '', + 'a88e6ae3-af87-490e-8f3e-6a92156dc95f.jpeg', '管理员', NULL, NULL, 'acfc0e9232f54732a5d9ffe9071bf572', + '2017-12-20 16:34:06', '2018-10-01 10:21:19', 0); +INSERT INTO `sys_user` +VALUES ('c7f1a7d7018311e8a1a2201a068c6482', '666', 'c6953f608430df414ea52e8c01b81a45', 24, '', '', '666', NULL, + 'acfc0e9232f54732a5d9ffe9071bf572', 'acfc0e9232f54732a5d9ffe9071bf572', '2018-01-25 11:56:54', + '2018-06-14 23:18:51', 1); +INSERT INTO `sys_user` +VALUES ('d818ac6a86cf1a64d2184bf0699d67a8', 'jingli', '6a333668613ef7946f4462866f537fb5', 20, '11@qq.com', '', NULL, + NULL, NULL, NULL, NULL, NULL, 0); -- ---------------------------- -- Table structure for test -- ---------------------------- DROP TABLE IF EXISTS `test`; -CREATE TABLE `test` ( - `id` int(11) NOT NULL, - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, - PRIMARY KEY (`id`) USING BTREE +CREATE TABLE `test` +( + `id` int(11) NOT NULL, + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of test -- ---------------------------- -INSERT INTO `test` VALUES (1, '22'); +INSERT INTO `test` +VALUES (1, '22'); -- ---------------------------- -- Table structure for user_leave -- ---------------------------- DROP TABLE IF EXISTS `user_leave`; -CREATE TABLE `user_leave` ( - `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, - `user_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, - `user_name` varchar(18) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, - `begin_time` datetime(0) NULL DEFAULT NULL, - `end_time` datetime(0) NULL DEFAULT NULL, - `reason` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, - `days` int(11) NULL DEFAULT NULL, - `process_instance_Id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, - `status` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, - `create_date` datetime(0) NULL DEFAULT NULL, - `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, - `update_date` datetime(0) NULL DEFAULT NULL, - `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, - `task_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, - `urlpath` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, - `submittimes` int(10) NULL DEFAULT 1, - PRIMARY KEY (`id`) USING BTREE +CREATE TABLE `user_leave` +( + `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `user_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `user_name` varchar(18) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `begin_time` datetime(0) NULL DEFAULT NULL, + `end_time` datetime(0) NULL DEFAULT NULL, + `reason` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `days` int(11) NULL DEFAULT NULL, + `process_instance_Id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `status` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `create_date` datetime(0) NULL DEFAULT NULL, + `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `update_date` datetime(0) NULL DEFAULT NULL, + `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `task_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `urlpath` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `submittimes` int(10) NULL DEFAULT 1, + PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of user_leave -- ---------------------------- -INSERT INTO `user_leave` VALUES ('432070fc1f52c0cc177ad901a5aac8d1', '5946a985f733c57f1ab71689f7b6aeea', 'zhangsan', '2022-03-31 00:00:00', '2022-04-02 00:00:00', '111', 3, '302556', NULL, NULL, NULL, NULL, NULL, NULL, '/leave/readOnlyLeave/432070fc1f52c0cc177ad901a5aac8d1', 1); -INSERT INTO `user_leave` VALUES ('7d5b418cc0b1cecdc7545261ba6b0b18', 'acfc0e9232f54732a5d9ffe9071bf572', 'admin', '2022-03-31 00:00:00', '2022-04-01 00:00:00', '111', 2, '302527', NULL, NULL, NULL, NULL, NULL, NULL, '/leave/readOnlyLeave/7d5b418cc0b1cecdc7545261ba6b0b18', 1); -INSERT INTO `user_leave` VALUES ('7e804e7eb7ab8f354af131cbbc62c683', '5946a985f733c57f1ab71689f7b6aeea', 'zhangsan', '2022-03-31 00:00:00', '2022-04-04 00:00:00', '222', 5, '302599', NULL, NULL, NULL, NULL, NULL, NULL, '/leave/readOnlyLeave/7e804e7eb7ab8f354af131cbbc62c683', 1); -INSERT INTO `user_leave` VALUES ('89f445cbe3334a458a412691170d1e11', 'a4a743bffe9711e7b472201a068c6482', 'zxm', '2018-07-19 00:00:00', '2018-07-25 00:00:00', '2222', 3, '277535', NULL, NULL, NULL, NULL, NULL, NULL, '/leave/readOnlyLeave/89f445cbe3334a458a412691170d1e11', 1); -INSERT INTO `user_leave` VALUES ('9b691eafc3521b8a316815f7a3a98b8f', 'acfc0e9232f54732a5d9ffe9071bf572', 'admin', '2022-03-31 00:00:00', '2022-04-01 00:00:00', '111', 2, '302514', NULL, NULL, NULL, NULL, NULL, NULL, '/leave/readOnlyLeave/9b691eafc3521b8a316815f7a3a98b8f', 1); -INSERT INTO `user_leave` VALUES ('be7055719798461d93c3aa635c309bdc', 'a4a743bffe9711e7b472201a068c6482', 'zxm', '2018-07-14 00:00:00', '2018-07-17 00:00:00', '111', 3, '277505', NULL, NULL, NULL, NULL, NULL, NULL, '/leave/readOnlyLeave/be7055719798461d93c3aa635c309bdc', 1); -INSERT INTO `user_leave` VALUES ('f77b8a76443318fa2a7b39f820bd56f9', 'acfc0e9232f54732a5d9ffe9071bf572', 'admin', '2022-03-31 00:00:00', '2022-04-01 00:00:00', '111', 2, '302501', NULL, NULL, NULL, NULL, NULL, NULL, '/leave/readOnlyLeave/f77b8a76443318fa2a7b39f820bd56f9', 1); - -SET FOREIGN_KEY_CHECKS = 1; +INSERT INTO `user_leave` +VALUES ('432070fc1f52c0cc177ad901a5aac8d1', '5946a985f733c57f1ab71689f7b6aeea', 'zhangsan', '2022-03-31 00:00:00', + '2022-04-02 00:00:00', '111', 3, '302556', NULL, NULL, NULL, NULL, NULL, NULL, + '/leave/readOnlyLeave/432070fc1f52c0cc177ad901a5aac8d1', 1); +INSERT INTO `user_leave` +VALUES ('7d5b418cc0b1cecdc7545261ba6b0b18', 'acfc0e9232f54732a5d9ffe9071bf572', 'admin', '2022-03-31 00:00:00', + '2022-04-01 00:00:00', '111', 2, '302527', NULL, NULL, NULL, NULL, NULL, NULL, + '/leave/readOnlyLeave/7d5b418cc0b1cecdc7545261ba6b0b18', 1); +INSERT INTO `user_leave` +VALUES ('7e804e7eb7ab8f354af131cbbc62c683', '5946a985f733c57f1ab71689f7b6aeea', 'zhangsan', '2022-03-31 00:00:00', + '2022-04-04 00:00:00', '222', 5, '302599', NULL, NULL, NULL, NULL, NULL, NULL, + '/leave/readOnlyLeave/7e804e7eb7ab8f354af131cbbc62c683', 1); +INSERT INTO `user_leave` +VALUES ('89f445cbe3334a458a412691170d1e11', 'a4a743bffe9711e7b472201a068c6482', 'zxm', '2018-07-19 00:00:00', + '2018-07-25 00:00:00', '2222', 3, '277535', NULL, NULL, NULL, NULL, NULL, NULL, + '/leave/readOnlyLeave/89f445cbe3334a458a412691170d1e11', 1); +INSERT INTO `user_leave` +VALUES ('9b691eafc3521b8a316815f7a3a98b8f', 'acfc0e9232f54732a5d9ffe9071bf572', 'admin', '2022-03-31 00:00:00', + '2022-04-01 00:00:00', '111', 2, '302514', NULL, NULL, NULL, NULL, NULL, NULL, + '/leave/readOnlyLeave/9b691eafc3521b8a316815f7a3a98b8f', 1); +INSERT INTO `user_leave` +VALUES ('be7055719798461d93c3aa635c309bdc', 'a4a743bffe9711e7b472201a068c6482', 'zxm', '2018-07-14 00:00:00', + '2018-07-17 00:00:00', '111', 3, '277505', NULL, NULL, NULL, NULL, NULL, NULL, + '/leave/readOnlyLeave/be7055719798461d93c3aa635c309bdc', 1); +INSERT INTO `user_leave` +VALUES ('f77b8a76443318fa2a7b39f820bd56f9', 'acfc0e9232f54732a5d9ffe9071bf572', 'admin', '2022-03-31 00:00:00', + '2022-04-01 00:00:00', '111', 2, '302501', NULL, NULL, NULL, NULL, NULL, NULL, + '/leave/readOnlyLeave/f77b8a76443318fa2a7b39f820bd56f9', 1); + +SET +FOREIGN_KEY_CHECKS = 1; diff --git a/db/lenos-oracle.sql b/db/lenos-oracle.sql index 3dd20bf..c569841 100644 --- a/db/lenos-oracle.sql +++ b/db/lenos-oracle.sql @@ -19,18 +19,17 @@ Date: 2019-02-27 22:47:09 -- Table structure for ACT_ASSIGNEE -- ---------------------------- DROP TABLE "LEN"."ACT_ASSIGNEE"; -CREATE TABLE "LEN"."ACT_ASSIGNEE" ( -"ID" NVARCHAR2(32) NOT NULL , -"SID" NVARCHAR2(32) NOT NULL , -"ASSIGNEE" NVARCHAR2(64) NULL , -"ROLE_ID" NVARCHAR2(32) NULL , -"ASSIGNEE_TYPE" NUMBER(11) NOT NULL , -"ACTIVTI_NAME" NVARCHAR2(128) NULL -) -LOGGING +CREATE TABLE "LEN"."ACT_ASSIGNEE" +( + "ID" NVARCHAR2(32) NOT NULL, + "SID" NVARCHAR2(32) NOT NULL, + "ASSIGNEE" NVARCHAR2(64) NULL, + "ROLE_ID" NVARCHAR2(32) NULL, + "ASSIGNEE_TYPE" NUMBER(11) NOT NULL, + "ACTIVTI_NAME" NVARCHAR2(128) NULL +) LOGGING NOCOMPRESS NOCACHE - ; -- ---------------------------- @@ -41,24 +40,23 @@ NOCACHE -- Table structure for ACT_EVT_LOG -- ---------------------------- DROP TABLE "LEN"."ACT_EVT_LOG"; -CREATE TABLE "LEN"."ACT_EVT_LOG" ( -"LOG_NR_" NUMBER(19) NOT NULL , -"TYPE_" NVARCHAR2(64) NULL , -"PROC_DEF_ID_" NVARCHAR2(64) NULL , -"PROC_INST_ID_" NVARCHAR2(64) NULL , -"EXECUTION_ID_" NVARCHAR2(64) NULL , -"TASK_ID_" NVARCHAR2(64) NULL , -"TIME_STAMP_" TIMESTAMP(6) NOT NULL , -"USER_ID_" NVARCHAR2(255) NULL , -"DATA_" BLOB NULL , -"LOCK_OWNER_" NVARCHAR2(255) NULL , -"LOCK_TIME_" TIMESTAMP(6) NULL , -"IS_PROCESSED_" NUMBER(3) DEFAULT 0 NULL -) -LOGGING +CREATE TABLE "LEN"."ACT_EVT_LOG" +( + "LOG_NR_" NUMBER(19) NOT NULL, + "TYPE_" NVARCHAR2(64) NULL, + "PROC_DEF_ID_" NVARCHAR2(64) NULL, + "PROC_INST_ID_" NVARCHAR2(64) NULL, + "EXECUTION_ID_" NVARCHAR2(64) NULL, + "TASK_ID_" NVARCHAR2(64) NULL, + "TIME_STAMP_" TIMESTAMP(6) NOT NULL, + "USER_ID_" NVARCHAR2(255) NULL, + "DATA_" BLOB NULL, + "LOCK_OWNER_" NVARCHAR2(255) NULL, + "LOCK_TIME_" TIMESTAMP(6) NULL, + "IS_PROCESSED_" NUMBER(3) DEFAULT 0 NULL +) LOGGING NOCOMPRESS NOCACHE - ; -- ---------------------------- @@ -69,18 +67,17 @@ NOCACHE -- Table structure for ACT_GE_BYTEARRAY -- ---------------------------- DROP TABLE "LEN"."ACT_GE_BYTEARRAY"; -CREATE TABLE "LEN"."ACT_GE_BYTEARRAY" ( -"ID_" NVARCHAR2(64) NOT NULL , -"REV_" NUMBER NULL , -"NAME_" NVARCHAR2(255) NULL , -"DEPLOYMENT_ID_" NVARCHAR2(64) NULL , -"BYTES_" BLOB NULL , -"GENERATED_" NUMBER(1) NULL -) -LOGGING +CREATE TABLE "LEN"."ACT_GE_BYTEARRAY" +( + "ID_" NVARCHAR2(64) NOT NULL, + "REV_" NUMBER NULL, + "NAME_" NVARCHAR2(255) NULL, + "DEPLOYMENT_ID_" NVARCHAR2(64) NULL, + "BYTES_" BLOB NULL, + "GENERATED_" NUMBER(1) NULL +) LOGGING NOCOMPRESS NOCACHE - ; -- ---------------------------- @@ -91,48 +88,49 @@ NOCACHE -- Table structure for ACT_GE_PROPERTY -- ---------------------------- DROP TABLE "LEN"."ACT_GE_PROPERTY"; -CREATE TABLE "LEN"."ACT_GE_PROPERTY" ( -"NAME_" NVARCHAR2(64) NOT NULL , -"VALUE_" NVARCHAR2(300) NULL , -"REV_" NUMBER NULL -) -LOGGING +CREATE TABLE "LEN"."ACT_GE_PROPERTY" +( + "NAME_" NVARCHAR2(64) NOT NULL, + "VALUE_" NVARCHAR2(300) NULL, + "REV_" NUMBER NULL +) LOGGING NOCOMPRESS NOCACHE - ; -- ---------------------------- -- Records of ACT_GE_PROPERTY -- ---------------------------- -INSERT INTO "LEN"."ACT_GE_PROPERTY" VALUES ('schema.version', '5.22.0.0', '1'); -INSERT INTO "LEN"."ACT_GE_PROPERTY" VALUES ('schema.history', 'create(5.22.0.0)', '1'); -INSERT INTO "LEN"."ACT_GE_PROPERTY" VALUES ('next.dbid', '1', '1'); +INSERT INTO "LEN"."ACT_GE_PROPERTY" +VALUES ('schema.version', '5.22.0.0', '1'); +INSERT INTO "LEN"."ACT_GE_PROPERTY" +VALUES ('schema.history', 'create(5.22.0.0)', '1'); +INSERT INTO "LEN"."ACT_GE_PROPERTY" +VALUES ('next.dbid', '1', '1'); -- ---------------------------- -- Table structure for ACT_HI_ACTINST -- ---------------------------- DROP TABLE "LEN"."ACT_HI_ACTINST"; -CREATE TABLE "LEN"."ACT_HI_ACTINST" ( -"ID_" NVARCHAR2(64) NOT NULL , -"PROC_DEF_ID_" NVARCHAR2(64) NOT NULL , -"PROC_INST_ID_" NVARCHAR2(64) NOT NULL , -"EXECUTION_ID_" NVARCHAR2(64) NOT NULL , -"ACT_ID_" NVARCHAR2(255) NOT NULL , -"TASK_ID_" NVARCHAR2(64) NULL , -"CALL_PROC_INST_ID_" NVARCHAR2(64) NULL , -"ACT_NAME_" NVARCHAR2(255) NULL , -"ACT_TYPE_" NVARCHAR2(255) NOT NULL , -"ASSIGNEE_" NVARCHAR2(255) NULL , -"START_TIME_" TIMESTAMP(6) NOT NULL , -"END_TIME_" TIMESTAMP(6) NULL , -"DURATION_" NUMBER(19) NULL , -"TENANT_ID_" NVARCHAR2(255) DEFAULT '' NULL -) -LOGGING +CREATE TABLE "LEN"."ACT_HI_ACTINST" +( + "ID_" NVARCHAR2(64) NOT NULL, + "PROC_DEF_ID_" NVARCHAR2(64) NOT NULL, + "PROC_INST_ID_" NVARCHAR2(64) NOT NULL, + "EXECUTION_ID_" NVARCHAR2(64) NOT NULL, + "ACT_ID_" NVARCHAR2(255) NOT NULL, + "TASK_ID_" NVARCHAR2(64) NULL, + "CALL_PROC_INST_ID_" NVARCHAR2(64) NULL, + "ACT_NAME_" NVARCHAR2(255) NULL, + "ACT_TYPE_" NVARCHAR2(255) NOT NULL, + "ASSIGNEE_" NVARCHAR2(255) NULL, + "START_TIME_" TIMESTAMP(6) NOT NULL, + "END_TIME_" TIMESTAMP(6) NULL, + "DURATION_" NUMBER(19) NULL, + "TENANT_ID_" NVARCHAR2(255) DEFAULT '' NULL +) LOGGING NOCOMPRESS NOCACHE - ; -- ---------------------------- @@ -143,23 +141,22 @@ NOCACHE -- Table structure for ACT_HI_ATTACHMENT -- ---------------------------- DROP TABLE "LEN"."ACT_HI_ATTACHMENT"; -CREATE TABLE "LEN"."ACT_HI_ATTACHMENT" ( -"ID_" NVARCHAR2(64) NOT NULL , -"REV_" NUMBER NULL , -"USER_ID_" NVARCHAR2(255) NULL , -"NAME_" NVARCHAR2(255) NULL , -"DESCRIPTION_" NVARCHAR2(2000) NULL , -"TYPE_" NVARCHAR2(255) NULL , -"TASK_ID_" NVARCHAR2(64) NULL , -"PROC_INST_ID_" NVARCHAR2(64) NULL , -"URL_" NVARCHAR2(2000) NULL , -"CONTENT_ID_" NVARCHAR2(64) NULL , -"TIME_" TIMESTAMP(6) NULL -) -LOGGING +CREATE TABLE "LEN"."ACT_HI_ATTACHMENT" +( + "ID_" NVARCHAR2(64) NOT NULL, + "REV_" NUMBER NULL, + "USER_ID_" NVARCHAR2(255) NULL, + "NAME_" NVARCHAR2(255) NULL, + "DESCRIPTION_" NVARCHAR2(2000) NULL, + "TYPE_" NVARCHAR2(255) NULL, + "TASK_ID_" NVARCHAR2(64) NULL, + "PROC_INST_ID_" NVARCHAR2(64) NULL, + "URL_" NVARCHAR2(2000) NULL, + "CONTENT_ID_" NVARCHAR2(64) NULL, + "TIME_" TIMESTAMP(6) NULL +) LOGGING NOCOMPRESS NOCACHE - ; -- ---------------------------- @@ -170,21 +167,20 @@ NOCACHE -- Table structure for ACT_HI_COMMENT -- ---------------------------- DROP TABLE "LEN"."ACT_HI_COMMENT"; -CREATE TABLE "LEN"."ACT_HI_COMMENT" ( -"ID_" NVARCHAR2(64) NOT NULL , -"TYPE_" NVARCHAR2(255) NULL , -"TIME_" TIMESTAMP(6) NOT NULL , -"USER_ID_" NVARCHAR2(255) NULL , -"TASK_ID_" NVARCHAR2(64) NULL , -"PROC_INST_ID_" NVARCHAR2(64) NULL , -"ACTION_" NVARCHAR2(255) NULL , -"MESSAGE_" NVARCHAR2(2000) NULL , -"FULL_MSG_" BLOB NULL -) -LOGGING +CREATE TABLE "LEN"."ACT_HI_COMMENT" +( + "ID_" NVARCHAR2(64) NOT NULL, + "TYPE_" NVARCHAR2(255) NULL, + "TIME_" TIMESTAMP(6) NOT NULL, + "USER_ID_" NVARCHAR2(255) NULL, + "TASK_ID_" NVARCHAR2(64) NULL, + "PROC_INST_ID_" NVARCHAR2(64) NULL, + "ACTION_" NVARCHAR2(255) NULL, + "MESSAGE_" NVARCHAR2(2000) NULL, + "FULL_MSG_" BLOB NULL +) LOGGING NOCOMPRESS NOCACHE - ; -- ---------------------------- @@ -195,27 +191,26 @@ NOCACHE -- Table structure for ACT_HI_DETAIL -- ---------------------------- DROP TABLE "LEN"."ACT_HI_DETAIL"; -CREATE TABLE "LEN"."ACT_HI_DETAIL" ( -"ID_" NVARCHAR2(64) NOT NULL , -"TYPE_" NVARCHAR2(255) NOT NULL , -"PROC_INST_ID_" NVARCHAR2(64) NULL , -"EXECUTION_ID_" NVARCHAR2(64) NULL , -"TASK_ID_" NVARCHAR2(64) NULL , -"ACT_INST_ID_" NVARCHAR2(64) NULL , -"NAME_" NVARCHAR2(255) NOT NULL , -"VAR_TYPE_" NVARCHAR2(64) NULL , -"REV_" NUMBER NULL , -"TIME_" TIMESTAMP(6) NOT NULL , -"BYTEARRAY_ID_" NVARCHAR2(64) NULL , -"DOUBLE_" NUMBER NULL , -"LONG_" NUMBER(19) NULL , -"TEXT_" NVARCHAR2(2000) NULL , -"TEXT2_" NVARCHAR2(2000) NULL -) -LOGGING +CREATE TABLE "LEN"."ACT_HI_DETAIL" +( + "ID_" NVARCHAR2(64) NOT NULL, + "TYPE_" NVARCHAR2(255) NOT NULL, + "PROC_INST_ID_" NVARCHAR2(64) NULL, + "EXECUTION_ID_" NVARCHAR2(64) NULL, + "TASK_ID_" NVARCHAR2(64) NULL, + "ACT_INST_ID_" NVARCHAR2(64) NULL, + "NAME_" NVARCHAR2(255) NOT NULL, + "VAR_TYPE_" NVARCHAR2(64) NULL, + "REV_" NUMBER NULL, + "TIME_" TIMESTAMP(6) NOT NULL, + "BYTEARRAY_ID_" NVARCHAR2(64) NULL, + "DOUBLE_" NUMBER NULL, + "LONG_" NUMBER(19) NULL, + "TEXT_" NVARCHAR2(2000) NULL, + "TEXT2_" NVARCHAR2(2000) NULL +) LOGGING NOCOMPRESS NOCACHE - ; -- ---------------------------- @@ -226,18 +221,17 @@ NOCACHE -- Table structure for ACT_HI_IDENTITYLINK -- ---------------------------- DROP TABLE "LEN"."ACT_HI_IDENTITYLINK"; -CREATE TABLE "LEN"."ACT_HI_IDENTITYLINK" ( -"ID_" NVARCHAR2(64) NOT NULL , -"GROUP_ID_" NVARCHAR2(255) NULL , -"TYPE_" NVARCHAR2(255) NULL , -"USER_ID_" NVARCHAR2(255) NULL , -"TASK_ID_" NVARCHAR2(64) NULL , -"PROC_INST_ID_" NVARCHAR2(64) NULL -) -LOGGING +CREATE TABLE "LEN"."ACT_HI_IDENTITYLINK" +( + "ID_" NVARCHAR2(64) NOT NULL, + "GROUP_ID_" NVARCHAR2(255) NULL, + "TYPE_" NVARCHAR2(255) NULL, + "USER_ID_" NVARCHAR2(255) NULL, + "TASK_ID_" NVARCHAR2(64) NULL, + "PROC_INST_ID_" NVARCHAR2(64) NULL +) LOGGING NOCOMPRESS NOCACHE - ; -- ---------------------------- @@ -248,26 +242,25 @@ NOCACHE -- Table structure for ACT_HI_PROCINST -- ---------------------------- DROP TABLE "LEN"."ACT_HI_PROCINST"; -CREATE TABLE "LEN"."ACT_HI_PROCINST" ( -"ID_" NVARCHAR2(64) NOT NULL , -"PROC_INST_ID_" NVARCHAR2(64) NOT NULL , -"BUSINESS_KEY_" NVARCHAR2(255) NULL , -"PROC_DEF_ID_" NVARCHAR2(64) NOT NULL , -"START_TIME_" TIMESTAMP(6) NOT NULL , -"END_TIME_" TIMESTAMP(6) NULL , -"DURATION_" NUMBER(19) NULL , -"START_USER_ID_" NVARCHAR2(255) NULL , -"START_ACT_ID_" NVARCHAR2(255) NULL , -"END_ACT_ID_" NVARCHAR2(255) NULL , -"SUPER_PROCESS_INSTANCE_ID_" NVARCHAR2(64) NULL , -"DELETE_REASON_" NVARCHAR2(2000) NULL , -"TENANT_ID_" NVARCHAR2(255) DEFAULT '' NULL , -"NAME_" NVARCHAR2(255) NULL -) -LOGGING +CREATE TABLE "LEN"."ACT_HI_PROCINST" +( + "ID_" NVARCHAR2(64) NOT NULL, + "PROC_INST_ID_" NVARCHAR2(64) NOT NULL, + "BUSINESS_KEY_" NVARCHAR2(255) NULL, + "PROC_DEF_ID_" NVARCHAR2(64) NOT NULL, + "START_TIME_" TIMESTAMP(6) NOT NULL, + "END_TIME_" TIMESTAMP(6) NULL, + "DURATION_" NUMBER(19) NULL, + "START_USER_ID_" NVARCHAR2(255) NULL, + "START_ACT_ID_" NVARCHAR2(255) NULL, + "END_ACT_ID_" NVARCHAR2(255) NULL, + "SUPER_PROCESS_INSTANCE_ID_" NVARCHAR2(64) NULL, + "DELETE_REASON_" NVARCHAR2(2000) NULL, + "TENANT_ID_" NVARCHAR2(255) DEFAULT '' NULL, + "NAME_" NVARCHAR2(255) NULL +) LOGGING NOCOMPRESS NOCACHE - ; -- ---------------------------- @@ -278,32 +271,31 @@ NOCACHE -- Table structure for ACT_HI_TASKINST -- ---------------------------- DROP TABLE "LEN"."ACT_HI_TASKINST"; -CREATE TABLE "LEN"."ACT_HI_TASKINST" ( -"ID_" NVARCHAR2(64) NOT NULL , -"PROC_DEF_ID_" NVARCHAR2(64) NULL , -"TASK_DEF_KEY_" NVARCHAR2(255) NULL , -"PROC_INST_ID_" NVARCHAR2(64) NULL , -"EXECUTION_ID_" NVARCHAR2(64) NULL , -"PARENT_TASK_ID_" NVARCHAR2(64) NULL , -"NAME_" NVARCHAR2(255) NULL , -"DESCRIPTION_" NVARCHAR2(2000) NULL , -"OWNER_" NVARCHAR2(255) NULL , -"ASSIGNEE_" NVARCHAR2(255) NULL , -"START_TIME_" TIMESTAMP(6) NOT NULL , -"CLAIM_TIME_" TIMESTAMP(6) NULL , -"END_TIME_" TIMESTAMP(6) NULL , -"DURATION_" NUMBER(19) NULL , -"DELETE_REASON_" NVARCHAR2(2000) NULL , -"PRIORITY_" NUMBER NULL , -"DUE_DATE_" TIMESTAMP(6) NULL , -"FORM_KEY_" NVARCHAR2(255) NULL , -"CATEGORY_" NVARCHAR2(255) NULL , -"TENANT_ID_" NVARCHAR2(255) DEFAULT '' NULL -) -LOGGING +CREATE TABLE "LEN"."ACT_HI_TASKINST" +( + "ID_" NVARCHAR2(64) NOT NULL, + "PROC_DEF_ID_" NVARCHAR2(64) NULL, + "TASK_DEF_KEY_" NVARCHAR2(255) NULL, + "PROC_INST_ID_" NVARCHAR2(64) NULL, + "EXECUTION_ID_" NVARCHAR2(64) NULL, + "PARENT_TASK_ID_" NVARCHAR2(64) NULL, + "NAME_" NVARCHAR2(255) NULL, + "DESCRIPTION_" NVARCHAR2(2000) NULL, + "OWNER_" NVARCHAR2(255) NULL, + "ASSIGNEE_" NVARCHAR2(255) NULL, + "START_TIME_" TIMESTAMP(6) NOT NULL, + "CLAIM_TIME_" TIMESTAMP(6) NULL, + "END_TIME_" TIMESTAMP(6) NULL, + "DURATION_" NUMBER(19) NULL, + "DELETE_REASON_" NVARCHAR2(2000) NULL, + "PRIORITY_" NUMBER NULL, + "DUE_DATE_" TIMESTAMP(6) NULL, + "FORM_KEY_" NVARCHAR2(255) NULL, + "CATEGORY_" NVARCHAR2(255) NULL, + "TENANT_ID_" NVARCHAR2(255) DEFAULT '' NULL +) LOGGING NOCOMPRESS NOCACHE - ; -- ---------------------------- @@ -314,26 +306,25 @@ NOCACHE -- Table structure for ACT_HI_VARINST -- ---------------------------- DROP TABLE "LEN"."ACT_HI_VARINST"; -CREATE TABLE "LEN"."ACT_HI_VARINST" ( -"ID_" NVARCHAR2(64) NOT NULL , -"PROC_INST_ID_" NVARCHAR2(64) NULL , -"EXECUTION_ID_" NVARCHAR2(64) NULL , -"TASK_ID_" NVARCHAR2(64) NULL , -"NAME_" NVARCHAR2(255) NOT NULL , -"VAR_TYPE_" NVARCHAR2(100) NULL , -"REV_" NUMBER NULL , -"BYTEARRAY_ID_" NVARCHAR2(64) NULL , -"DOUBLE_" NUMBER NULL , -"LONG_" NUMBER(19) NULL , -"TEXT_" NVARCHAR2(2000) NULL , -"TEXT2_" NVARCHAR2(2000) NULL , -"CREATE_TIME_" TIMESTAMP(6) NULL , -"LAST_UPDATED_TIME_" TIMESTAMP(6) NULL -) -LOGGING +CREATE TABLE "LEN"."ACT_HI_VARINST" +( + "ID_" NVARCHAR2(64) NOT NULL, + "PROC_INST_ID_" NVARCHAR2(64) NULL, + "EXECUTION_ID_" NVARCHAR2(64) NULL, + "TASK_ID_" NVARCHAR2(64) NULL, + "NAME_" NVARCHAR2(255) NOT NULL, + "VAR_TYPE_" NVARCHAR2(100) NULL, + "REV_" NUMBER NULL, + "BYTEARRAY_ID_" NVARCHAR2(64) NULL, + "DOUBLE_" NUMBER NULL, + "LONG_" NUMBER(19) NULL, + "TEXT_" NVARCHAR2(2000) NULL, + "TEXT2_" NVARCHAR2(2000) NULL, + "CREATE_TIME_" TIMESTAMP(6) NULL, + "LAST_UPDATED_TIME_" TIMESTAMP(6) NULL +) LOGGING NOCOMPRESS NOCACHE - ; -- ---------------------------- @@ -344,16 +335,15 @@ NOCACHE -- Table structure for ACT_ID_GROUP -- ---------------------------- DROP TABLE "LEN"."ACT_ID_GROUP"; -CREATE TABLE "LEN"."ACT_ID_GROUP" ( -"ID_" NVARCHAR2(64) NOT NULL , -"REV_" NUMBER NULL , -"NAME_" NVARCHAR2(255) NULL , -"TYPE_" NVARCHAR2(255) NULL -) -LOGGING +CREATE TABLE "LEN"."ACT_ID_GROUP" +( + "ID_" NVARCHAR2(64) NOT NULL, + "REV_" NUMBER NULL, + "NAME_" NVARCHAR2(255) NULL, + "TYPE_" NVARCHAR2(255) NULL +) LOGGING NOCOMPRESS NOCACHE - ; -- ---------------------------- @@ -364,20 +354,19 @@ NOCACHE -- Table structure for ACT_ID_INFO -- ---------------------------- DROP TABLE "LEN"."ACT_ID_INFO"; -CREATE TABLE "LEN"."ACT_ID_INFO" ( -"ID_" NVARCHAR2(64) NOT NULL , -"REV_" NUMBER NULL , -"USER_ID_" NVARCHAR2(64) NULL , -"TYPE_" NVARCHAR2(64) NULL , -"KEY_" NVARCHAR2(255) NULL , -"VALUE_" NVARCHAR2(255) NULL , -"PASSWORD_" BLOB NULL , -"PARENT_ID_" NVARCHAR2(255) NULL -) -LOGGING +CREATE TABLE "LEN"."ACT_ID_INFO" +( + "ID_" NVARCHAR2(64) NOT NULL, + "REV_" NUMBER NULL, + "USER_ID_" NVARCHAR2(64) NULL, + "TYPE_" NVARCHAR2(64) NULL, + "KEY_" NVARCHAR2(255) NULL, + "VALUE_" NVARCHAR2(255) NULL, + "PASSWORD_" BLOB NULL, + "PARENT_ID_" NVARCHAR2(255) NULL +) LOGGING NOCOMPRESS NOCACHE - ; -- ---------------------------- @@ -388,14 +377,13 @@ NOCACHE -- Table structure for ACT_ID_MEMBERSHIP -- ---------------------------- DROP TABLE "LEN"."ACT_ID_MEMBERSHIP"; -CREATE TABLE "LEN"."ACT_ID_MEMBERSHIP" ( -"USER_ID_" NVARCHAR2(64) NOT NULL , -"GROUP_ID_" NVARCHAR2(64) NOT NULL -) -LOGGING +CREATE TABLE "LEN"."ACT_ID_MEMBERSHIP" +( + "USER_ID_" NVARCHAR2(64) NOT NULL, + "GROUP_ID_" NVARCHAR2(64) NOT NULL +) LOGGING NOCOMPRESS NOCACHE - ; -- ---------------------------- @@ -406,19 +394,18 @@ NOCACHE -- Table structure for ACT_ID_USER -- ---------------------------- DROP TABLE "LEN"."ACT_ID_USER"; -CREATE TABLE "LEN"."ACT_ID_USER" ( -"ID_" NVARCHAR2(64) NOT NULL , -"REV_" NUMBER NULL , -"FIRST_" NVARCHAR2(255) NULL , -"LAST_" NVARCHAR2(255) NULL , -"EMAIL_" NVARCHAR2(255) NULL , -"PWD_" NVARCHAR2(255) NULL , -"PICTURE_ID_" NVARCHAR2(64) NULL -) -LOGGING +CREATE TABLE "LEN"."ACT_ID_USER" +( + "ID_" NVARCHAR2(64) NOT NULL, + "REV_" NUMBER NULL, + "FIRST_" NVARCHAR2(255) NULL, + "LAST_" NVARCHAR2(255) NULL, + "EMAIL_" NVARCHAR2(255) NULL, + "PWD_" NVARCHAR2(255) NULL, + "PICTURE_ID_" NVARCHAR2(64) NULL +) LOGGING NOCOMPRESS NOCACHE - ; -- ---------------------------- @@ -429,16 +416,15 @@ NOCACHE -- Table structure for ACT_PROCDEF_INFO -- ---------------------------- DROP TABLE "LEN"."ACT_PROCDEF_INFO"; -CREATE TABLE "LEN"."ACT_PROCDEF_INFO" ( -"ID_" NVARCHAR2(64) NOT NULL , -"PROC_DEF_ID_" NVARCHAR2(64) NOT NULL , -"REV_" NUMBER NULL , -"INFO_JSON_ID_" NVARCHAR2(64) NULL -) -LOGGING +CREATE TABLE "LEN"."ACT_PROCDEF_INFO" +( + "ID_" NVARCHAR2(64) NOT NULL, + "PROC_DEF_ID_" NVARCHAR2(64) NOT NULL, + "REV_" NUMBER NULL, + "INFO_JSON_ID_" NVARCHAR2(64) NULL +) LOGGING NOCOMPRESS NOCACHE - ; -- ---------------------------- @@ -449,17 +435,16 @@ NOCACHE -- Table structure for ACT_RE_DEPLOYMENT -- ---------------------------- DROP TABLE "LEN"."ACT_RE_DEPLOYMENT"; -CREATE TABLE "LEN"."ACT_RE_DEPLOYMENT" ( -"ID_" NVARCHAR2(64) NOT NULL , -"NAME_" NVARCHAR2(255) NULL , -"CATEGORY_" NVARCHAR2(255) NULL , -"TENANT_ID_" NVARCHAR2(255) DEFAULT '' NULL , -"DEPLOY_TIME_" TIMESTAMP(6) NULL -) -LOGGING +CREATE TABLE "LEN"."ACT_RE_DEPLOYMENT" +( + "ID_" NVARCHAR2(64) NOT NULL, + "NAME_" NVARCHAR2(255) NULL, + "CATEGORY_" NVARCHAR2(255) NULL, + "TENANT_ID_" NVARCHAR2(255) DEFAULT '' NULL, + "DEPLOY_TIME_" TIMESTAMP(6) NULL +) LOGGING NOCOMPRESS NOCACHE - ; -- ---------------------------- @@ -470,25 +455,24 @@ NOCACHE -- Table structure for ACT_RE_MODEL -- ---------------------------- DROP TABLE "LEN"."ACT_RE_MODEL"; -CREATE TABLE "LEN"."ACT_RE_MODEL" ( -"ID_" NVARCHAR2(64) NOT NULL , -"REV_" NUMBER NULL , -"NAME_" NVARCHAR2(255) NULL , -"KEY_" NVARCHAR2(255) NULL , -"CATEGORY_" NVARCHAR2(255) NULL , -"CREATE_TIME_" TIMESTAMP(6) NULL , -"LAST_UPDATE_TIME_" TIMESTAMP(6) NULL , -"VERSION_" NUMBER NULL , -"META_INFO_" NVARCHAR2(2000) NULL , -"DEPLOYMENT_ID_" NVARCHAR2(64) NULL , -"EDITOR_SOURCE_VALUE_ID_" NVARCHAR2(64) NULL , -"EDITOR_SOURCE_EXTRA_VALUE_ID_" NVARCHAR2(64) NULL , -"TENANT_ID_" NVARCHAR2(255) DEFAULT '' NULL -) -LOGGING +CREATE TABLE "LEN"."ACT_RE_MODEL" +( + "ID_" NVARCHAR2(64) NOT NULL, + "REV_" NUMBER NULL, + "NAME_" NVARCHAR2(255) NULL, + "KEY_" NVARCHAR2(255) NULL, + "CATEGORY_" NVARCHAR2(255) NULL, + "CREATE_TIME_" TIMESTAMP(6) NULL, + "LAST_UPDATE_TIME_" TIMESTAMP(6) NULL, + "VERSION_" NUMBER NULL, + "META_INFO_" NVARCHAR2(2000) NULL, + "DEPLOYMENT_ID_" NVARCHAR2(64) NULL, + "EDITOR_SOURCE_VALUE_ID_" NVARCHAR2(64) NULL, + "EDITOR_SOURCE_EXTRA_VALUE_ID_" NVARCHAR2(64) NULL, + "TENANT_ID_" NVARCHAR2(255) DEFAULT '' NULL +) LOGGING NOCOMPRESS NOCACHE - ; -- ---------------------------- @@ -499,26 +483,25 @@ NOCACHE -- Table structure for ACT_RE_PROCDEF -- ---------------------------- DROP TABLE "LEN"."ACT_RE_PROCDEF"; -CREATE TABLE "LEN"."ACT_RE_PROCDEF" ( -"ID_" NVARCHAR2(64) NOT NULL , -"REV_" NUMBER NULL , -"CATEGORY_" NVARCHAR2(255) NULL , -"NAME_" NVARCHAR2(255) NULL , -"KEY_" NVARCHAR2(255) NOT NULL , -"VERSION_" NUMBER NOT NULL , -"DEPLOYMENT_ID_" NVARCHAR2(64) NULL , -"RESOURCE_NAME_" NVARCHAR2(2000) NULL , -"DGRM_RESOURCE_NAME_" VARCHAR2(4000 BYTE) NULL , -"DESCRIPTION_" NVARCHAR2(2000) NULL , -"HAS_START_FORM_KEY_" NUMBER(1) NULL , -"HAS_GRAPHICAL_NOTATION_" NUMBER(1) NULL , -"SUSPENSION_STATE_" NUMBER NULL , -"TENANT_ID_" NVARCHAR2(255) DEFAULT '' NULL -) -LOGGING +CREATE TABLE "LEN"."ACT_RE_PROCDEF" +( + "ID_" NVARCHAR2(64) NOT NULL, + "REV_" NUMBER NULL, + "CATEGORY_" NVARCHAR2(255) NULL, + "NAME_" NVARCHAR2(255) NULL, + "KEY_" NVARCHAR2(255) NOT NULL, + "VERSION_" NUMBER NOT NULL, + "DEPLOYMENT_ID_" NVARCHAR2(64) NULL, + "RESOURCE_NAME_" NVARCHAR2(2000) NULL, + "DGRM_RESOURCE_NAME_" VARCHAR2(4000 BYTE) NULL, + "DESCRIPTION_" NVARCHAR2(2000) NULL, + "HAS_START_FORM_KEY_" NUMBER(1) NULL, + "HAS_GRAPHICAL_NOTATION_" NUMBER(1) NULL, + "SUSPENSION_STATE_" NUMBER NULL, + "TENANT_ID_" NVARCHAR2(255) DEFAULT '' NULL +) LOGGING NOCOMPRESS NOCACHE - ; -- ---------------------------- @@ -529,23 +512,22 @@ NOCACHE -- Table structure for ACT_RU_EVENT_SUBSCR -- ---------------------------- DROP TABLE "LEN"."ACT_RU_EVENT_SUBSCR"; -CREATE TABLE "LEN"."ACT_RU_EVENT_SUBSCR" ( -"ID_" NVARCHAR2(64) NOT NULL , -"REV_" NUMBER NULL , -"EVENT_TYPE_" NVARCHAR2(255) NOT NULL , -"EVENT_NAME_" NVARCHAR2(255) NULL , -"EXECUTION_ID_" NVARCHAR2(64) NULL , -"PROC_INST_ID_" NVARCHAR2(64) NULL , -"ACTIVITY_ID_" NVARCHAR2(64) NULL , -"CONFIGURATION_" NVARCHAR2(255) NULL , -"CREATED_" TIMESTAMP(6) NOT NULL , -"PROC_DEF_ID_" NVARCHAR2(64) NULL , -"TENANT_ID_" NVARCHAR2(255) DEFAULT '' NULL -) -LOGGING +CREATE TABLE "LEN"."ACT_RU_EVENT_SUBSCR" +( + "ID_" NVARCHAR2(64) NOT NULL, + "REV_" NUMBER NULL, + "EVENT_TYPE_" NVARCHAR2(255) NOT NULL, + "EVENT_NAME_" NVARCHAR2(255) NULL, + "EXECUTION_ID_" NVARCHAR2(64) NULL, + "PROC_INST_ID_" NVARCHAR2(64) NULL, + "ACTIVITY_ID_" NVARCHAR2(64) NULL, + "CONFIGURATION_" NVARCHAR2(255) NULL, + "CREATED_" TIMESTAMP(6) NOT NULL, + "PROC_DEF_ID_" NVARCHAR2(64) NULL, + "TENANT_ID_" NVARCHAR2(255) DEFAULT '' NULL +) LOGGING NOCOMPRESS NOCACHE - ; -- ---------------------------- @@ -556,29 +538,28 @@ NOCACHE -- Table structure for ACT_RU_EXECUTION -- ---------------------------- DROP TABLE "LEN"."ACT_RU_EXECUTION"; -CREATE TABLE "LEN"."ACT_RU_EXECUTION" ( -"ID_" NVARCHAR2(64) NOT NULL , -"REV_" NUMBER NULL , -"PROC_INST_ID_" NVARCHAR2(64) NULL , -"BUSINESS_KEY_" NVARCHAR2(255) NULL , -"PARENT_ID_" NVARCHAR2(64) NULL , -"PROC_DEF_ID_" NVARCHAR2(64) NULL , -"SUPER_EXEC_" NVARCHAR2(64) NULL , -"ACT_ID_" NVARCHAR2(255) NULL , -"IS_ACTIVE_" NUMBER(1) NULL , -"IS_CONCURRENT_" NUMBER(1) NULL , -"IS_SCOPE_" NUMBER(1) NULL , -"IS_EVENT_SCOPE_" NUMBER(1) NULL , -"SUSPENSION_STATE_" NUMBER NULL , -"CACHED_ENT_STATE_" NUMBER NULL , -"TENANT_ID_" NVARCHAR2(255) DEFAULT '' NULL , -"NAME_" NVARCHAR2(255) NULL , -"LOCK_TIME_" TIMESTAMP(6) NULL -) -LOGGING +CREATE TABLE "LEN"."ACT_RU_EXECUTION" +( + "ID_" NVARCHAR2(64) NOT NULL, + "REV_" NUMBER NULL, + "PROC_INST_ID_" NVARCHAR2(64) NULL, + "BUSINESS_KEY_" NVARCHAR2(255) NULL, + "PARENT_ID_" NVARCHAR2(64) NULL, + "PROC_DEF_ID_" NVARCHAR2(64) NULL, + "SUPER_EXEC_" NVARCHAR2(64) NULL, + "ACT_ID_" NVARCHAR2(255) NULL, + "IS_ACTIVE_" NUMBER(1) NULL, + "IS_CONCURRENT_" NUMBER(1) NULL, + "IS_SCOPE_" NUMBER(1) NULL, + "IS_EVENT_SCOPE_" NUMBER(1) NULL, + "SUSPENSION_STATE_" NUMBER NULL, + "CACHED_ENT_STATE_" NUMBER NULL, + "TENANT_ID_" NVARCHAR2(255) DEFAULT '' NULL, + "NAME_" NVARCHAR2(255) NULL, + "LOCK_TIME_" TIMESTAMP(6) NULL +) LOGGING NOCOMPRESS NOCACHE - ; -- ---------------------------- @@ -589,20 +570,19 @@ NOCACHE -- Table structure for ACT_RU_IDENTITYLINK -- ---------------------------- DROP TABLE "LEN"."ACT_RU_IDENTITYLINK"; -CREATE TABLE "LEN"."ACT_RU_IDENTITYLINK" ( -"ID_" NVARCHAR2(64) NOT NULL , -"REV_" NUMBER NULL , -"GROUP_ID_" NVARCHAR2(255) NULL , -"TYPE_" NVARCHAR2(255) NULL , -"USER_ID_" NVARCHAR2(255) NULL , -"TASK_ID_" NVARCHAR2(64) NULL , -"PROC_INST_ID_" NVARCHAR2(64) NULL , -"PROC_DEF_ID_" NVARCHAR2(64) NULL -) -LOGGING +CREATE TABLE "LEN"."ACT_RU_IDENTITYLINK" +( + "ID_" NVARCHAR2(64) NOT NULL, + "REV_" NUMBER NULL, + "GROUP_ID_" NVARCHAR2(255) NULL, + "TYPE_" NVARCHAR2(255) NULL, + "USER_ID_" NVARCHAR2(255) NULL, + "TASK_ID_" NVARCHAR2(64) NULL, + "PROC_INST_ID_" NVARCHAR2(64) NULL, + "PROC_DEF_ID_" NVARCHAR2(64) NULL +) LOGGING NOCOMPRESS NOCACHE - ; -- ---------------------------- @@ -613,29 +593,28 @@ NOCACHE -- Table structure for ACT_RU_JOB -- ---------------------------- DROP TABLE "LEN"."ACT_RU_JOB"; -CREATE TABLE "LEN"."ACT_RU_JOB" ( -"ID_" NVARCHAR2(64) NOT NULL , -"REV_" NUMBER NULL , -"TYPE_" NVARCHAR2(255) NOT NULL , -"LOCK_EXP_TIME_" TIMESTAMP(6) NULL , -"LOCK_OWNER_" NVARCHAR2(255) NULL , -"EXCLUSIVE_" NUMBER(1) NULL , -"EXECUTION_ID_" NVARCHAR2(64) NULL , -"PROCESS_INSTANCE_ID_" NVARCHAR2(64) NULL , -"PROC_DEF_ID_" NVARCHAR2(64) NULL , -"RETRIES_" NUMBER NULL , -"EXCEPTION_STACK_ID_" NVARCHAR2(64) NULL , -"EXCEPTION_MSG_" NVARCHAR2(2000) NULL , -"DUEDATE_" TIMESTAMP(6) NULL , -"REPEAT_" NVARCHAR2(255) NULL , -"HANDLER_TYPE_" NVARCHAR2(255) NULL , -"HANDLER_CFG_" NVARCHAR2(2000) NULL , -"TENANT_ID_" NVARCHAR2(255) DEFAULT '' NULL -) -LOGGING +CREATE TABLE "LEN"."ACT_RU_JOB" +( + "ID_" NVARCHAR2(64) NOT NULL, + "REV_" NUMBER NULL, + "TYPE_" NVARCHAR2(255) NOT NULL, + "LOCK_EXP_TIME_" TIMESTAMP(6) NULL, + "LOCK_OWNER_" NVARCHAR2(255) NULL, + "EXCLUSIVE_" NUMBER(1) NULL, + "EXECUTION_ID_" NVARCHAR2(64) NULL, + "PROCESS_INSTANCE_ID_" NVARCHAR2(64) NULL, + "PROC_DEF_ID_" NVARCHAR2(64) NULL, + "RETRIES_" NUMBER NULL, + "EXCEPTION_STACK_ID_" NVARCHAR2(64) NULL, + "EXCEPTION_MSG_" NVARCHAR2(2000) NULL, + "DUEDATE_" TIMESTAMP(6) NULL, + "REPEAT_" NVARCHAR2(255) NULL, + "HANDLER_TYPE_" NVARCHAR2(255) NULL, + "HANDLER_CFG_" NVARCHAR2(2000) NULL, + "TENANT_ID_" NVARCHAR2(255) DEFAULT '' NULL +) LOGGING NOCOMPRESS NOCACHE - ; -- ---------------------------- @@ -646,31 +625,30 @@ NOCACHE -- Table structure for ACT_RU_TASK -- ---------------------------- DROP TABLE "LEN"."ACT_RU_TASK"; -CREATE TABLE "LEN"."ACT_RU_TASK" ( -"ID_" NVARCHAR2(64) NOT NULL , -"REV_" NUMBER NULL , -"EXECUTION_ID_" NVARCHAR2(64) NULL , -"PROC_INST_ID_" NVARCHAR2(64) NULL , -"PROC_DEF_ID_" NVARCHAR2(64) NULL , -"NAME_" NVARCHAR2(255) NULL , -"PARENT_TASK_ID_" NVARCHAR2(64) NULL , -"DESCRIPTION_" NVARCHAR2(2000) NULL , -"TASK_DEF_KEY_" NVARCHAR2(255) NULL , -"OWNER_" NVARCHAR2(255) NULL , -"ASSIGNEE_" NVARCHAR2(255) NULL , -"DELEGATION_" NVARCHAR2(64) NULL , -"PRIORITY_" NUMBER NULL , -"CREATE_TIME_" TIMESTAMP(6) NULL , -"DUE_DATE_" TIMESTAMP(6) NULL , -"CATEGORY_" NVARCHAR2(255) NULL , -"SUSPENSION_STATE_" NUMBER NULL , -"TENANT_ID_" NVARCHAR2(255) DEFAULT '' NULL , -"FORM_KEY_" NVARCHAR2(255) NULL -) -LOGGING +CREATE TABLE "LEN"."ACT_RU_TASK" +( + "ID_" NVARCHAR2(64) NOT NULL, + "REV_" NUMBER NULL, + "EXECUTION_ID_" NVARCHAR2(64) NULL, + "PROC_INST_ID_" NVARCHAR2(64) NULL, + "PROC_DEF_ID_" NVARCHAR2(64) NULL, + "NAME_" NVARCHAR2(255) NULL, + "PARENT_TASK_ID_" NVARCHAR2(64) NULL, + "DESCRIPTION_" NVARCHAR2(2000) NULL, + "TASK_DEF_KEY_" NVARCHAR2(255) NULL, + "OWNER_" NVARCHAR2(255) NULL, + "ASSIGNEE_" NVARCHAR2(255) NULL, + "DELEGATION_" NVARCHAR2(64) NULL, + "PRIORITY_" NUMBER NULL, + "CREATE_TIME_" TIMESTAMP(6) NULL, + "DUE_DATE_" TIMESTAMP(6) NULL, + "CATEGORY_" NVARCHAR2(255) NULL, + "SUSPENSION_STATE_" NUMBER NULL, + "TENANT_ID_" NVARCHAR2(255) DEFAULT '' NULL, + "FORM_KEY_" NVARCHAR2(255) NULL +) LOGGING NOCOMPRESS NOCACHE - ; -- ---------------------------- @@ -681,24 +659,23 @@ NOCACHE -- Table structure for ACT_RU_VARIABLE -- ---------------------------- DROP TABLE "LEN"."ACT_RU_VARIABLE"; -CREATE TABLE "LEN"."ACT_RU_VARIABLE" ( -"ID_" NVARCHAR2(64) NOT NULL , -"REV_" NUMBER NULL , -"TYPE_" NVARCHAR2(255) NOT NULL , -"NAME_" NVARCHAR2(255) NOT NULL , -"EXECUTION_ID_" NVARCHAR2(64) NULL , -"PROC_INST_ID_" NVARCHAR2(64) NULL , -"TASK_ID_" NVARCHAR2(64) NULL , -"BYTEARRAY_ID_" NVARCHAR2(64) NULL , -"DOUBLE_" NUMBER NULL , -"LONG_" NUMBER(19) NULL , -"TEXT_" NVARCHAR2(2000) NULL , -"TEXT2_" NVARCHAR2(2000) NULL -) -LOGGING +CREATE TABLE "LEN"."ACT_RU_VARIABLE" +( + "ID_" NVARCHAR2(64) NOT NULL, + "REV_" NUMBER NULL, + "TYPE_" NVARCHAR2(255) NOT NULL, + "NAME_" NVARCHAR2(255) NOT NULL, + "EXECUTION_ID_" NVARCHAR2(64) NULL, + "PROC_INST_ID_" NVARCHAR2(64) NULL, + "TASK_ID_" NVARCHAR2(64) NULL, + "BYTEARRAY_ID_" NVARCHAR2(64) NULL, + "DOUBLE_" NUMBER NULL, + "LONG_" NUMBER(19) NULL, + "TEXT_" NVARCHAR2(2000) NULL, + "TEXT2_" NVARCHAR2(2000) NULL +) LOGGING NOCOMPRESS NOCACHE - ; -- ---------------------------- @@ -709,209 +686,287 @@ NOCACHE -- Table structure for BLOG_ARTICLE -- ---------------------------- DROP TABLE "LEN"."BLOG_ARTICLE"; -CREATE TABLE "LEN"."BLOG_ARTICLE" ( -"ID" NVARCHAR2(32) NOT NULL , -"CODE" NVARCHAR2(255) NOT NULL , -"TITLE" NVARCHAR2(255) NOT NULL , -"FIRST_IMG" NVARCHAR2(255) NULL , -"CONTENT" NCLOB NOT NULL , -"READ_NUMBER" NUMBER(11) NOT NULL , -"TOP_NUM" NUMBER(11) NULL , -"CREATE_BY" NVARCHAR2(32) NOT NULL , -"UPDATE_BY" NVARCHAR2(32) NULL , -"CREATE_DATE" DATE NULL , -"UPDATE_DATE" DATE NULL , -"DEL_FLAG" NUMBER(4) NOT NULL -) -LOGGING +CREATE TABLE "LEN"."BLOG_ARTICLE" +( + "ID" NVARCHAR2(32) NOT NULL, + "CODE" NVARCHAR2(255) NOT NULL, + "TITLE" NVARCHAR2(255) NOT NULL, + "FIRST_IMG" NVARCHAR2(255) NULL, + "CONTENT" NCLOB NOT NULL, + "READ_NUMBER" NUMBER(11) NOT NULL, + "TOP_NUM" NUMBER(11) NULL, + "CREATE_BY" NVARCHAR2(32) NOT NULL, + "UPDATE_BY" NVARCHAR2(32) NULL, + "CREATE_DATE" DATE NULL, + "UPDATE_DATE" DATE NULL, + "DEL_FLAG" NUMBER(4) NOT NULL +) LOGGING NOCOMPRESS NOCACHE - ; -COMMENT ON COLUMN "LEN"."BLOG_ARTICLE"."CODE" IS 'code'; -COMMENT ON COLUMN "LEN"."BLOG_ARTICLE"."TITLE" IS '标题'; -COMMENT ON COLUMN "LEN"."BLOG_ARTICLE"."FIRST_IMG" IS '列表缩略图'; -COMMENT ON COLUMN "LEN"."BLOG_ARTICLE"."CONTENT" IS '文章内容'; -COMMENT ON COLUMN "LEN"."BLOG_ARTICLE"."READ_NUMBER" IS '阅读次数'; -COMMENT ON COLUMN "LEN"."BLOG_ARTICLE"."TOP_NUM" IS '次序(置顶功能)'; -COMMENT ON COLUMN "LEN"."BLOG_ARTICLE"."DEL_FLAG" IS '0正常1删除'; +COMMENT +ON COLUMN "LEN"."BLOG_ARTICLE"."CODE" IS 'code'; +COMMENT +ON COLUMN "LEN"."BLOG_ARTICLE"."TITLE" IS '标题'; +COMMENT +ON COLUMN "LEN"."BLOG_ARTICLE"."FIRST_IMG" IS '列表缩略图'; +COMMENT +ON COLUMN "LEN"."BLOG_ARTICLE"."CONTENT" IS '文章内容'; +COMMENT +ON COLUMN "LEN"."BLOG_ARTICLE"."READ_NUMBER" IS '阅读次数'; +COMMENT +ON COLUMN "LEN"."BLOG_ARTICLE"."TOP_NUM" IS '次序(置顶功能)'; +COMMENT +ON COLUMN "LEN"."BLOG_ARTICLE"."DEL_FLAG" IS '0正常1删除'; -- ---------------------------- -- Records of BLOG_ARTICLE -- ---------------------------- -INSERT INTO "LEN"."BLOG_ARTICLE" VALUES ('3887934708c54f49bc5a566f77e2a759', '76249265', 'hello,world', 'http://localhost:8081/img/77e5338a-217c-4b07-a3fd-63f20411dfcb.png', '

你好,世界

<img src="http://localhost:8081/img/1b805822-4d00-4695-acdd-90f68af6150e.jpg">

+INSERT INTO "LEN"."BLOG_ARTICLE" +VALUES ('3887934708c54f49bc5a566f77e2a759', '76249265', 'hello,world', + 'http://localhost:8081/img/77e5338a-217c-4b07-a3fd-63f20411dfcb.png', '

你好,世界

<img src="http://localhost:8081/img/1b805822-4d00-4695-acdd-90f68af6150e.jpg">


<img src="http://localhost:8081/img/1b805822-4d00-4695-acdd-90f68af6150e.jpg">

JsonUtil json = new JsonUtil();
 List<BlogCategory> categories = categoryService.selectAll();
 categories.sort(Comparator.comparing(BlogCategory::getSequence));
 json.setData(categories);
 return json;
-
', '16', '0', 'acfc0e9232f54732a5d9ffe9071bf572', 'a4a743bffe9711e7b472201a068c6482', TO_DATE('2018-10-14 17:47:41', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2018-11-25 17:35:00', 'YYYY-MM-DD HH24:MI:SS'), '0'); -INSERT INTO "LEN"."BLOG_ARTICLE" VALUES ('3887934708c54f49bc5a566f77e2a759', '76249265', 'hello,world', 'http://localhost:8081/img/77e5338a-217c-4b07-a3fd-63f20411dfcb.png', '

你好,世界

<img src="http://localhost:8081/img/1b805822-4d00-4695-acdd-90f68af6150e.jpg">

+', '16', '0', 'acfc0e9232f54732a5d9ffe9071bf572', 'a4a743bffe9711e7b472201a068c6482', + TO_DATE('2018-10-14 17:47:41', 'YYYY-MM-DD HH24:MI:SS'), + TO_DATE('2018-11-25 17:35:00', 'YYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "LEN"."BLOG_ARTICLE" +VALUES ('3887934708c54f49bc5a566f77e2a759', '76249265', 'hello,world', + 'http://localhost:8081/img/77e5338a-217c-4b07-a3fd-63f20411dfcb.png', '

你好,世界

<img src="http://localhost:8081/img/1b805822-4d00-4695-acdd-90f68af6150e.jpg">


<img src="http://localhost:8081/img/1b805822-4d00-4695-acdd-90f68af6150e.jpg">

JsonUtil json = new JsonUtil();
 List<BlogCategory> categories = categoryService.selectAll();
 categories.sort(Comparator.comparing(BlogCategory::getSequence));
 json.setData(categories);
 return json;
-
', '16', '0', 'acfc0e9232f54732a5d9ffe9071bf572', 'a4a743bffe9711e7b472201a068c6482', TO_DATE('2018-10-14 17:47:41', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2018-11-25 17:35:00', 'YYYY-MM-DD HH24:MI:SS'), '0'); -INSERT INTO "LEN"."BLOG_ARTICLE" VALUES ('6e3fbd29b226452984428883d6e7a8a2', '53165934', '测试添加', 'http://localhost:8081/img/536ac5c8-ee9a-4826-9977-be8983622e00.png', '

内容啦啦啦啦啦


', '15', '0', 'acfc0e9232f54732a5d9ffe9071bf572', 'a4a743bffe9711e7b472201a068c6482', TO_DATE('2018-11-19 22:57:25', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2018-11-25 18:55:34', 'YYYY-MM-DD HH24:MI:SS'), '0'); -INSERT INTO "LEN"."BLOG_ARTICLE" VALUES ('89f445cbe3334a458a4126741170d1e1', 'ASDFG2', 'java基础1', null, 'Java基础知识', '130', '1', 'acfc0e9232f54732a5d9ffe9071bf572', null, TO_DATE('2018-10-01 11:24:59', 'YYYY-MM-DD HH24:MI:SS'), null, '0'); -INSERT INTO "LEN"."BLOG_ARTICLE" VALUES ('89f445cbe3334a458a4126751170d1e1', 'ASDFG1', 'java基础2', null, 'Java基础知识', '127', '1', 'acfc0e9232f54732a5d9ffe9071bf572', null, TO_DATE('2018-10-01 11:23:59', 'YYYY-MM-DD HH24:MI:SS'), null, '0'); -INSERT INTO "LEN"."BLOG_ARTICLE" VALUES ('89f445cbe3334a458a412691170d1e12', 'xcbbg', 'java基础3', null, '

Java基础知识

', '124', '0', 'acfc0e9232f54732a5d9ffe9071bf572', 'a4a743bffe9711e7b472201a068c6482', TO_DATE('2018-10-01 11:22:59', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2018-11-25 22:16:19', 'YYYY-MM-DD HH24:MI:SS'), '0'); -INSERT INTO "LEN"."BLOG_ARTICLE" VALUES ('89f445cbe3334a458a4126951170d1e1', 'ASDFGC', 'java基础4', null, 'Java基础知识', '124', '1', 'acfc0e9232f54732a5d9ffe9071bf572', null, TO_DATE('2018-10-01 11:21:59', 'YYYY-MM-DD HH24:MI:SS'), null, '0'); +', '16', '0', 'acfc0e9232f54732a5d9ffe9071bf572', 'a4a743bffe9711e7b472201a068c6482', + TO_DATE('2018-10-14 17:47:41', 'YYYY-MM-DD HH24:MI:SS'), + TO_DATE('2018-11-25 17:35:00', 'YYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "LEN"."BLOG_ARTICLE" +VALUES ('6e3fbd29b226452984428883d6e7a8a2', '53165934', '测试添加', + 'http://localhost:8081/img/536ac5c8-ee9a-4826-9977-be8983622e00.png', + '

内容啦啦啦啦啦


', + '15', '0', 'acfc0e9232f54732a5d9ffe9071bf572', 'a4a743bffe9711e7b472201a068c6482', + TO_DATE('2018-11-19 22:57:25', 'YYYY-MM-DD HH24:MI:SS'), + TO_DATE('2018-11-25 18:55:34', 'YYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "LEN"."BLOG_ARTICLE" +VALUES ('89f445cbe3334a458a4126741170d1e1', 'ASDFG2', 'java基础1', null, 'Java基础知识', '130', '1', + 'acfc0e9232f54732a5d9ffe9071bf572', null, TO_DATE('2018-10-01 11:24:59', 'YYYY-MM-DD HH24:MI:SS'), null, '0'); +INSERT INTO "LEN"."BLOG_ARTICLE" +VALUES ('89f445cbe3334a458a4126751170d1e1', 'ASDFG1', 'java基础2', null, 'Java基础知识', '127', '1', + 'acfc0e9232f54732a5d9ffe9071bf572', null, TO_DATE('2018-10-01 11:23:59', 'YYYY-MM-DD HH24:MI:SS'), null, '0'); +INSERT INTO "LEN"."BLOG_ARTICLE" +VALUES ('89f445cbe3334a458a412691170d1e12', 'xcbbg', 'java基础3', null, '

Java基础知识

', '124', '0', + 'acfc0e9232f54732a5d9ffe9071bf572', 'a4a743bffe9711e7b472201a068c6482', + TO_DATE('2018-10-01 11:22:59', 'YYYY-MM-DD HH24:MI:SS'), + TO_DATE('2018-11-25 22:16:19', 'YYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "LEN"."BLOG_ARTICLE" +VALUES ('89f445cbe3334a458a4126951170d1e1', 'ASDFGC', 'java基础4', null, 'Java基础知识', '124', '1', + 'acfc0e9232f54732a5d9ffe9071bf572', null, TO_DATE('2018-10-01 11:21:59', 'YYYY-MM-DD HH24:MI:SS'), null, '0'); -- ---------------------------- -- Table structure for BLOG_ARTICLE_CATEGORY -- ---------------------------- DROP TABLE "LEN"."BLOG_ARTICLE_CATEGORY"; -CREATE TABLE "LEN"."BLOG_ARTICLE_CATEGORY" ( -"ID" NVARCHAR2(32) NOT NULL , -"ARTICLE_ID" NVARCHAR2(32) NOT NULL , -"CATEGORY_ID" NVARCHAR2(32) NOT NULL -) -LOGGING +CREATE TABLE "LEN"."BLOG_ARTICLE_CATEGORY" +( + "ID" NVARCHAR2(32) NOT NULL, + "ARTICLE_ID" NVARCHAR2(32) NOT NULL, + "CATEGORY_ID" NVARCHAR2(32) NOT NULL +) LOGGING NOCOMPRESS NOCACHE - ; -COMMENT ON TABLE "LEN"."BLOG_ARTICLE_CATEGORY" IS '文章标签表'; -COMMENT ON COLUMN "LEN"."BLOG_ARTICLE_CATEGORY"."ARTICLE_ID" IS '文章id'; -COMMENT ON COLUMN "LEN"."BLOG_ARTICLE_CATEGORY"."CATEGORY_ID" IS '标签id'; +COMMENT +ON TABLE "LEN"."BLOG_ARTICLE_CATEGORY" IS '文章标签表'; +COMMENT +ON COLUMN "LEN"."BLOG_ARTICLE_CATEGORY"."ARTICLE_ID" IS '文章id'; +COMMENT +ON COLUMN "LEN"."BLOG_ARTICLE_CATEGORY"."CATEGORY_ID" IS '标签id'; -- ---------------------------- -- Records of BLOG_ARTICLE_CATEGORY -- ---------------------------- -INSERT INTO "LEN"."BLOG_ARTICLE_CATEGORY" VALUES ('0037884871fa483db71e4158a18b0af9', '3887934708c54f49bc5a566f77e2a759', '3d4da698fc914ed0b956e86b58f93166'); -INSERT INTO "LEN"."BLOG_ARTICLE_CATEGORY" VALUES ('2e2c8578a05b4048a9365e9a1b5ff726', '89f445cbe3334a458a412691170d1e12', '3956852574b6490ba6198f35b1c00aee'); -INSERT INTO "LEN"."BLOG_ARTICLE_CATEGORY" VALUES ('68eeaf5f10a24ed195c042dbc6e25df7', 'a9455e9f36bc4f33ba01412a64d87d6a', '3956852574b6490ba6198f35b1c00aee'); -INSERT INTO "LEN"."BLOG_ARTICLE_CATEGORY" VALUES ('7659e8a4b97144269775983f886ce25e', '3887934708c54f49bc5a566f77e2a759', '3956852574b6490ba6198f35b1c00aee'); -INSERT INTO "LEN"."BLOG_ARTICLE_CATEGORY" VALUES ('db7a1ca9b5d04a618f98e65c6c5555db', '6e3fbd29b226452984428883d6e7a8a2', '3956852574b6490ba6198f35b1c00aee'); -INSERT INTO "LEN"."BLOG_ARTICLE_CATEGORY" VALUES ('e6c27fd837244cefb43b2b2aca276f1f', '3887934708c54f49bc5a566f77e2a759', '2b7c729789de4c03a23fff8311b9eaf4'); -INSERT INTO "LEN"."BLOG_ARTICLE_CATEGORY" VALUES ('fe7c34ffcf8c4af9922b4438e695c742', 'fd27b3ed7d344395b7766f596bf6fd06', '3956852574b6490ba6198f35b1c00aee'); +INSERT INTO "LEN"."BLOG_ARTICLE_CATEGORY" +VALUES ('0037884871fa483db71e4158a18b0af9', '3887934708c54f49bc5a566f77e2a759', '3d4da698fc914ed0b956e86b58f93166'); +INSERT INTO "LEN"."BLOG_ARTICLE_CATEGORY" +VALUES ('2e2c8578a05b4048a9365e9a1b5ff726', '89f445cbe3334a458a412691170d1e12', '3956852574b6490ba6198f35b1c00aee'); +INSERT INTO "LEN"."BLOG_ARTICLE_CATEGORY" +VALUES ('68eeaf5f10a24ed195c042dbc6e25df7', 'a9455e9f36bc4f33ba01412a64d87d6a', '3956852574b6490ba6198f35b1c00aee'); +INSERT INTO "LEN"."BLOG_ARTICLE_CATEGORY" +VALUES ('7659e8a4b97144269775983f886ce25e', '3887934708c54f49bc5a566f77e2a759', '3956852574b6490ba6198f35b1c00aee'); +INSERT INTO "LEN"."BLOG_ARTICLE_CATEGORY" +VALUES ('db7a1ca9b5d04a618f98e65c6c5555db', '6e3fbd29b226452984428883d6e7a8a2', '3956852574b6490ba6198f35b1c00aee'); +INSERT INTO "LEN"."BLOG_ARTICLE_CATEGORY" +VALUES ('e6c27fd837244cefb43b2b2aca276f1f', '3887934708c54f49bc5a566f77e2a759', '2b7c729789de4c03a23fff8311b9eaf4'); +INSERT INTO "LEN"."BLOG_ARTICLE_CATEGORY" +VALUES ('fe7c34ffcf8c4af9922b4438e695c742', 'fd27b3ed7d344395b7766f596bf6fd06', '3956852574b6490ba6198f35b1c00aee'); -- ---------------------------- -- Table structure for BLOG_ARTICLE_TAG -- ---------------------------- DROP TABLE "LEN"."BLOG_ARTICLE_TAG"; -CREATE TABLE "LEN"."BLOG_ARTICLE_TAG" ( -"ARTICLE_ID" NVARCHAR2(32) NOT NULL , -"TAG_ID" NVARCHAR2(32) NOT NULL -) -LOGGING +CREATE TABLE "LEN"."BLOG_ARTICLE_TAG" +( + "ARTICLE_ID" NVARCHAR2(32) NOT NULL, + "TAG_ID" NVARCHAR2(32) NOT NULL +) LOGGING NOCOMPRESS NOCACHE - ; -- ---------------------------- -- Records of BLOG_ARTICLE_TAG -- ---------------------------- -INSERT INTO "LEN"."BLOG_ARTICLE_TAG" VALUES ('3887934708c54f49bc5a566f77e2a759', 'eeba8137d0cc42249a8c1db9b2830e8a'); -INSERT INTO "LEN"."BLOG_ARTICLE_TAG" VALUES ('6e3fbd29b226452984428883d6e7a8a2', '0596836fc90540d1a497cd7bfae306e4'); -INSERT INTO "LEN"."BLOG_ARTICLE_TAG" VALUES ('6e3fbd29b226452984428883d6e7a8a2', '1f44f472a64f4ebe9782b2b868e2caf2'); -INSERT INTO "LEN"."BLOG_ARTICLE_TAG" VALUES ('89f445cbe3334a458a412691170d1e12', 'eeba8137d0cc42249a8c1db9b2830e8a'); -INSERT INTO "LEN"."BLOG_ARTICLE_TAG" VALUES ('a9455e9f36bc4f33ba01412a64d87d6a', 'eba6d766a88b4a108d4189c08f86e7a6'); -INSERT INTO "LEN"."BLOG_ARTICLE_TAG" VALUES ('fd27b3ed7d344395b7766f596bf6fd06', '0596836fc90540d1a497cd7bfae306e4'); -INSERT INTO "LEN"."BLOG_ARTICLE_TAG" VALUES ('fd27b3ed7d344395b7766f596bf6fd06', 'eba6d766a88b4a108d4189c08f86e7a6'); +INSERT INTO "LEN"."BLOG_ARTICLE_TAG" +VALUES ('3887934708c54f49bc5a566f77e2a759', 'eeba8137d0cc42249a8c1db9b2830e8a'); +INSERT INTO "LEN"."BLOG_ARTICLE_TAG" +VALUES ('6e3fbd29b226452984428883d6e7a8a2', '0596836fc90540d1a497cd7bfae306e4'); +INSERT INTO "LEN"."BLOG_ARTICLE_TAG" +VALUES ('6e3fbd29b226452984428883d6e7a8a2', '1f44f472a64f4ebe9782b2b868e2caf2'); +INSERT INTO "LEN"."BLOG_ARTICLE_TAG" +VALUES ('89f445cbe3334a458a412691170d1e12', 'eeba8137d0cc42249a8c1db9b2830e8a'); +INSERT INTO "LEN"."BLOG_ARTICLE_TAG" +VALUES ('a9455e9f36bc4f33ba01412a64d87d6a', 'eba6d766a88b4a108d4189c08f86e7a6'); +INSERT INTO "LEN"."BLOG_ARTICLE_TAG" +VALUES ('fd27b3ed7d344395b7766f596bf6fd06', '0596836fc90540d1a497cd7bfae306e4'); +INSERT INTO "LEN"."BLOG_ARTICLE_TAG" +VALUES ('fd27b3ed7d344395b7766f596bf6fd06', 'eba6d766a88b4a108d4189c08f86e7a6'); -- ---------------------------- -- Table structure for BLOG_CATEGORY -- ---------------------------- DROP TABLE "LEN"."BLOG_CATEGORY"; -CREATE TABLE "LEN"."BLOG_CATEGORY" ( -"ID" NVARCHAR2(32) NOT NULL , -"SEQUENCE" NUMBER(4) NOT NULL , -"CODE" NVARCHAR2(16) NOT NULL , -"NAME" NVARCHAR2(64) NOT NULL , -"PARENT_ID" NVARCHAR2(32) NOT NULL , -"CREATE_BY" NVARCHAR2(32) NULL , -"UPDATE_BY" NVARCHAR2(32) NULL , -"CREATE_DATE" DATE NULL , -"UPDATE_DATE" DATE NULL -) -LOGGING +CREATE TABLE "LEN"."BLOG_CATEGORY" +( + "ID" NVARCHAR2(32) NOT NULL, + "SEQUENCE" NUMBER(4) NOT NULL, + "CODE" NVARCHAR2(16) NOT NULL, + "NAME" NVARCHAR2(64) NOT NULL, + "PARENT_ID" NVARCHAR2(32) NOT NULL, + "CREATE_BY" NVARCHAR2(32) NULL, + "UPDATE_BY" NVARCHAR2(32) NULL, + "CREATE_DATE" DATE NULL, + "UPDATE_DATE" DATE NULL +) LOGGING NOCOMPRESS NOCACHE - ; -COMMENT ON TABLE "LEN"."BLOG_CATEGORY" IS '类别表(顶部展示)'; -COMMENT ON COLUMN "LEN"."BLOG_CATEGORY"."CODE" IS '搜索code'; -COMMENT ON COLUMN "LEN"."BLOG_CATEGORY"."NAME" IS '类别名称'; -COMMENT ON COLUMN "LEN"."BLOG_CATEGORY"."PARENT_ID" IS '上层id(目前最多两次层)'; +COMMENT +ON TABLE "LEN"."BLOG_CATEGORY" IS '类别表(顶部展示)'; +COMMENT +ON COLUMN "LEN"."BLOG_CATEGORY"."CODE" IS '搜索code'; +COMMENT +ON COLUMN "LEN"."BLOG_CATEGORY"."NAME" IS '类别名称'; +COMMENT +ON COLUMN "LEN"."BLOG_CATEGORY"."PARENT_ID" IS '上层id(目前最多两次层)'; -- ---------------------------- -- Records of BLOG_CATEGORY -- ---------------------------- -INSERT INTO "LEN"."BLOG_CATEGORY" VALUES ('2b7c729789de4c03a23fff8311b9eaf4', '3', '架构', '架构', '0', 'zxm', null, TO_DATE('2018-10-12 22:30:18', 'YYYY-MM-DD HH24:MI:SS'), null); -INSERT INTO "LEN"."BLOG_CATEGORY" VALUES ('3956852574b6490ba6198f35b1c00aee', '1', 'Java', 'Java', '0', 'zxm', null, TO_DATE('2018-10-12 22:30:18', 'YYYY-MM-DD HH24:MI:SS'), null); -INSERT INTO "LEN"."BLOG_CATEGORY" VALUES ('3d4da698fc914ed0b956e86b58f93166', '2', 'Linux', 'Linux', '0', 'zxm', null, TO_DATE('2018-10-12 22:30:18', 'YYYY-MM-DD HH24:MI:SS'), null); -INSERT INTO "LEN"."BLOG_CATEGORY" VALUES ('7de23cc796ac4e6887ef1de6ca331bd8', '4', '其他', '其他', '0', 'zxm', null, TO_DATE('2018-10-12 22:30:18', 'YYYY-MM-DD HH24:MI:SS'), null); +INSERT INTO "LEN"."BLOG_CATEGORY" +VALUES ('2b7c729789de4c03a23fff8311b9eaf4', '3', '架构', '架构', '0', 'zxm', null, + TO_DATE('2018-10-12 22:30:18', 'YYYY-MM-DD HH24:MI:SS'), null); +INSERT INTO "LEN"."BLOG_CATEGORY" +VALUES ('3956852574b6490ba6198f35b1c00aee', '1', 'Java', 'Java', '0', 'zxm', null, + TO_DATE('2018-10-12 22:30:18', 'YYYY-MM-DD HH24:MI:SS'), null); +INSERT INTO "LEN"."BLOG_CATEGORY" +VALUES ('3d4da698fc914ed0b956e86b58f93166', '2', 'Linux', 'Linux', '0', 'zxm', null, + TO_DATE('2018-10-12 22:30:18', 'YYYY-MM-DD HH24:MI:SS'), null); +INSERT INTO "LEN"."BLOG_CATEGORY" +VALUES ('7de23cc796ac4e6887ef1de6ca331bd8', '4', '其他', '其他', '0', 'zxm', null, + TO_DATE('2018-10-12 22:30:18', 'YYYY-MM-DD HH24:MI:SS'), null); -- ---------------------------- -- Table structure for BLOG_TAG -- ---------------------------- DROP TABLE "LEN"."BLOG_TAG"; -CREATE TABLE "LEN"."BLOG_TAG" ( -"ID" NVARCHAR2(32) NOT NULL , -"TAG_CODE" NVARCHAR2(16) NOT NULL , -"TAG_NAME" NVARCHAR2(255) NOT NULL -) -LOGGING +CREATE TABLE "LEN"."BLOG_TAG" +( + "ID" NVARCHAR2(32) NOT NULL, + "TAG_CODE" NVARCHAR2(16) NOT NULL, + "TAG_NAME" NVARCHAR2(255) NOT NULL +) LOGGING NOCOMPRESS NOCACHE - ; -COMMENT ON COLUMN "LEN"."BLOG_TAG"."TAG_CODE" IS '标签code'; -COMMENT ON COLUMN "LEN"."BLOG_TAG"."TAG_NAME" IS '标签name'; +COMMENT +ON COLUMN "LEN"."BLOG_TAG"."TAG_CODE" IS '标签code'; +COMMENT +ON COLUMN "LEN"."BLOG_TAG"."TAG_NAME" IS '标签name'; -- ---------------------------- -- Records of BLOG_TAG -- ---------------------------- -INSERT INTO "LEN"."BLOG_TAG" VALUES ('0596836fc90540d1a497cd7bfae306e4', 'shiro', 'shiro'); -INSERT INTO "LEN"."BLOG_TAG" VALUES ('1f44f472a64f4ebe9782b2b868e2caf2', 'spring', 'spring'); -INSERT INTO "LEN"."BLOG_TAG" VALUES ('32297dbf97d44462bfa8b2f868704660', 'mybatis', 'mybatis'); -INSERT INTO "LEN"."BLOG_TAG" VALUES ('483af3b2db5743e99a9cde0f81559b43', 'spring cloud', 'spring cloud'); -INSERT INTO "LEN"."BLOG_TAG" VALUES ('4e4aa6cd7fea4a70a9e31083c1109090', 'sql', 'sql'); -INSERT INTO "LEN"."BLOG_TAG" VALUES ('56a9dc14db164453a0baa30d3193367c', '22', '22'); -INSERT INTO "LEN"."BLOG_TAG" VALUES ('75cae88b2f9f451392bfc06928a7c58d', 'centos7', 'centos7'); -INSERT INTO "LEN"."BLOG_TAG" VALUES ('7b470a9a121b42dc995e876fb532660e', 'linux', 'linux'); -INSERT INTO "LEN"."BLOG_TAG" VALUES ('7e467f2922a34a0b91afd908676f0ef5', 'spring security', 'spring security'); -INSERT INTO "LEN"."BLOG_TAG" VALUES ('8f41425ce8794fa8a0affa17beb13f11', 'redis', 'redis'); -INSERT INTO "LEN"."BLOG_TAG" VALUES ('d4e6b7774db343ff8575b1790a615aa2', 'git', 'git'); -INSERT INTO "LEN"."BLOG_TAG" VALUES ('da34c84e702341d68e6ea6d004508e67', 'vue', 'vue'); -INSERT INTO "LEN"."BLOG_TAG" VALUES ('e4ca0a14f2724de8bf71ad0ac8988c57', 'quartz', 'quartz'); -INSERT INTO "LEN"."BLOG_TAG" VALUES ('eba6d766a88b4a108d4189c08f86e7a6', 'spring boot', 'spring boot'); -INSERT INTO "LEN"."BLOG_TAG" VALUES ('eeba8137d0cc42249a8c1db9b2830e8a', 'java', 'java'); -INSERT INTO "LEN"."BLOG_TAG" VALUES ('f4ebc211eb3242739d6007e030c54ae5', 'oauth2.0', 'oauth2.0'); +INSERT INTO "LEN"."BLOG_TAG" +VALUES ('0596836fc90540d1a497cd7bfae306e4', 'shiro', 'shiro'); +INSERT INTO "LEN"."BLOG_TAG" +VALUES ('1f44f472a64f4ebe9782b2b868e2caf2', 'spring', 'spring'); +INSERT INTO "LEN"."BLOG_TAG" +VALUES ('32297dbf97d44462bfa8b2f868704660', 'mybatis', 'mybatis'); +INSERT INTO "LEN"."BLOG_TAG" +VALUES ('483af3b2db5743e99a9cde0f81559b43', 'spring cloud', 'spring cloud'); +INSERT INTO "LEN"."BLOG_TAG" +VALUES ('4e4aa6cd7fea4a70a9e31083c1109090', 'sql', 'sql'); +INSERT INTO "LEN"."BLOG_TAG" +VALUES ('56a9dc14db164453a0baa30d3193367c', '22', '22'); +INSERT INTO "LEN"."BLOG_TAG" +VALUES ('75cae88b2f9f451392bfc06928a7c58d', 'centos7', 'centos7'); +INSERT INTO "LEN"."BLOG_TAG" +VALUES ('7b470a9a121b42dc995e876fb532660e', 'linux', 'linux'); +INSERT INTO "LEN"."BLOG_TAG" +VALUES ('7e467f2922a34a0b91afd908676f0ef5', 'spring security', 'spring security'); +INSERT INTO "LEN"."BLOG_TAG" +VALUES ('8f41425ce8794fa8a0affa17beb13f11', 'redis', 'redis'); +INSERT INTO "LEN"."BLOG_TAG" +VALUES ('d4e6b7774db343ff8575b1790a615aa2', 'git', 'git'); +INSERT INTO "LEN"."BLOG_TAG" +VALUES ('da34c84e702341d68e6ea6d004508e67', 'vue', 'vue'); +INSERT INTO "LEN"."BLOG_TAG" +VALUES ('e4ca0a14f2724de8bf71ad0ac8988c57', 'quartz', 'quartz'); +INSERT INTO "LEN"."BLOG_TAG" +VALUES ('eba6d766a88b4a108d4189c08f86e7a6', 'spring boot', 'spring boot'); +INSERT INTO "LEN"."BLOG_TAG" +VALUES ('eeba8137d0cc42249a8c1db9b2830e8a', 'java', 'java'); +INSERT INTO "LEN"."BLOG_TAG" +VALUES ('f4ebc211eb3242739d6007e030c54ae5', 'oauth2.0', 'oauth2.0'); -- ---------------------------- -- Table structure for SYS_DICT_ITEM -- ---------------------------- DROP TABLE "LEN"."SYS_DICT_ITEM"; -CREATE TABLE "LEN"."SYS_DICT_ITEM" ( -"ID" NVARCHAR2(32) NOT NULL , -"SEQUENCE" NUMBER(11) NOT NULL , -"VALUE" NVARCHAR2(100) NOT NULL , -"DESCRIPTION" NVARCHAR2(100) NOT NULL , -"TYPE_ID" NVARCHAR2(32) NOT NULL , -"CREATE_BY" NVARCHAR2(32) NULL , -"CREATE_DATE" DATE NULL , -"UPDATE_BY" NVARCHAR2(32) NULL , -"UPDATE_DATE" DATE NULL , -"DEL_FLAG" NCHAR(1) NOT NULL -) -LOGGING +CREATE TABLE "LEN"."SYS_DICT_ITEM" +( + "ID" NVARCHAR2(32) NOT NULL, + "SEQUENCE" NUMBER(11) NOT NULL, + "VALUE" NVARCHAR2(100) NOT NULL, + "DESCRIPTION" NVARCHAR2(100) NOT NULL, + "TYPE_ID" NVARCHAR2(32) NOT NULL, + "CREATE_BY" NVARCHAR2(32) NULL, + "CREATE_DATE" DATE NULL, + "UPDATE_BY" NVARCHAR2(32) NULL, + "UPDATE_DATE" DATE NULL, + "DEL_FLAG" NCHAR(1) NOT NULL +) LOGGING NOCOMPRESS NOCACHE - ; -COMMENT ON TABLE "LEN"."SYS_DICT_ITEM" IS '字典子表'; -COMMENT ON COLUMN "LEN"."SYS_DICT_ITEM"."SEQUENCE" IS '序号'; -COMMENT ON COLUMN "LEN"."SYS_DICT_ITEM"."VALUE" IS '值'; -COMMENT ON COLUMN "LEN"."SYS_DICT_ITEM"."DESCRIPTION" IS '描述'; -COMMENT ON COLUMN "LEN"."SYS_DICT_ITEM"."TYPE_ID" IS '字典id外检'; -COMMENT ON COLUMN "LEN"."SYS_DICT_ITEM"."DEL_FLAG" IS '删除标识'; +COMMENT +ON TABLE "LEN"."SYS_DICT_ITEM" IS '字典子表'; +COMMENT +ON COLUMN "LEN"."SYS_DICT_ITEM"."SEQUENCE" IS '序号'; +COMMENT +ON COLUMN "LEN"."SYS_DICT_ITEM"."VALUE" IS '值'; +COMMENT +ON COLUMN "LEN"."SYS_DICT_ITEM"."DESCRIPTION" IS '描述'; +COMMENT +ON COLUMN "LEN"."SYS_DICT_ITEM"."TYPE_ID" IS '字典id外检'; +COMMENT +ON COLUMN "LEN"."SYS_DICT_ITEM"."DEL_FLAG" IS '删除标识'; -- ---------------------------- -- Records of SYS_DICT_ITEM @@ -921,25 +976,28 @@ COMMENT ON COLUMN "LEN"."SYS_DICT_ITEM"."DEL_FLAG" IS '删除标识'; -- Table structure for SYS_DICT_TYPE -- ---------------------------- DROP TABLE "LEN"."SYS_DICT_TYPE"; -CREATE TABLE "LEN"."SYS_DICT_TYPE" ( -"ID" NVARCHAR2(32) NOT NULL , -"CODE" NVARCHAR2(255) NOT NULL , -"DEL_FLAG" NCHAR(1) NOT NULL , -"TEXT" NVARCHAR2(255) NOT NULL , -"CREATE_BY" NVARCHAR2(32) NULL , -"CREATE_DATE" DATE NULL , -"UPDATE_BY" NVARCHAR2(32) NULL , -"UPDATE_DATE" DATE NULL -) -LOGGING +CREATE TABLE "LEN"."SYS_DICT_TYPE" +( + "ID" NVARCHAR2(32) NOT NULL, + "CODE" NVARCHAR2(255) NOT NULL, + "DEL_FLAG" NCHAR(1) NOT NULL, + "TEXT" NVARCHAR2(255) NOT NULL, + "CREATE_BY" NVARCHAR2(32) NULL, + "CREATE_DATE" DATE NULL, + "UPDATE_BY" NVARCHAR2(32) NULL, + "UPDATE_DATE" DATE NULL +) LOGGING NOCOMPRESS NOCACHE - ; -COMMENT ON TABLE "LEN"."SYS_DICT_TYPE" IS '字典主表'; -COMMENT ON COLUMN "LEN"."SYS_DICT_TYPE"."CODE" IS '编码'; -COMMENT ON COLUMN "LEN"."SYS_DICT_TYPE"."DEL_FLAG" IS '删除标识'; -COMMENT ON COLUMN "LEN"."SYS_DICT_TYPE"."TEXT" IS '字典名称'; +COMMENT +ON TABLE "LEN"."SYS_DICT_TYPE" IS '字典主表'; +COMMENT +ON COLUMN "LEN"."SYS_DICT_TYPE"."CODE" IS '编码'; +COMMENT +ON COLUMN "LEN"."SYS_DICT_TYPE"."DEL_FLAG" IS '删除标识'; +COMMENT +ON COLUMN "LEN"."SYS_DICT_TYPE"."TEXT" IS '字典名称'; -- ---------------------------- -- Records of SYS_DICT_TYPE @@ -949,52 +1007,63 @@ COMMENT ON COLUMN "LEN"."SYS_DICT_TYPE"."TEXT" IS '字典名称'; -- Table structure for SYS_JOB -- ---------------------------- DROP TABLE "LEN"."SYS_JOB"; -CREATE TABLE "LEN"."SYS_JOB" ( -"ID" NVARCHAR2(32) NOT NULL , -"JOB_NAME" NVARCHAR2(255) NOT NULL , -"CRON" NVARCHAR2(255) NOT NULL , -"STATUS" NUMBER(4) NOT NULL , -"CLAZZ_PATH" NVARCHAR2(255) NOT NULL , -"JOB_DESC" NVARCHAR2(255) NULL , -"CREATE_BY" NVARCHAR2(255) NULL , -"CREATE_DATE" DATE NULL , -"UPDATE_BY" NVARCHAR2(255) NULL , -"UPDATE_DATE" DATE NULL -) -LOGGING +CREATE TABLE "LEN"."SYS_JOB" +( + "ID" NVARCHAR2(32) NOT NULL, + "JOB_NAME" NVARCHAR2(255) NOT NULL, + "CRON" NVARCHAR2(255) NOT NULL, + "STATUS" NUMBER(4) NOT NULL, + "CLAZZ_PATH" NVARCHAR2(255) NOT NULL, + "JOB_DESC" NVARCHAR2(255) NULL, + "CREATE_BY" NVARCHAR2(255) NULL, + "CREATE_DATE" DATE NULL, + "UPDATE_BY" NVARCHAR2(255) NULL, + "UPDATE_DATE" DATE NULL +) LOGGING NOCOMPRESS NOCACHE - ; -COMMENT ON COLUMN "LEN"."SYS_JOB"."JOB_NAME" IS '描述任务'; -COMMENT ON COLUMN "LEN"."SYS_JOB"."CRON" IS '任务表达式'; -COMMENT ON COLUMN "LEN"."SYS_JOB"."STATUS" IS '状态:0未启动false/1启动true'; -COMMENT ON COLUMN "LEN"."SYS_JOB"."CLAZZ_PATH" IS '任务执行方法'; -COMMENT ON COLUMN "LEN"."SYS_JOB"."JOB_DESC" IS '其他描述'; +COMMENT +ON COLUMN "LEN"."SYS_JOB"."JOB_NAME" IS '描述任务'; +COMMENT +ON COLUMN "LEN"."SYS_JOB"."CRON" IS '任务表达式'; +COMMENT +ON COLUMN "LEN"."SYS_JOB"."STATUS" IS '状态:0未启动false/1启动true'; +COMMENT +ON COLUMN "LEN"."SYS_JOB"."CLAZZ_PATH" IS '任务执行方法'; +COMMENT +ON COLUMN "LEN"."SYS_JOB"."JOB_DESC" IS '其他描述'; -- ---------------------------- -- Records of SYS_JOB -- ---------------------------- -INSERT INTO "LEN"."SYS_JOB" VALUES ('55147ebdf2f611e7a4fe201a068c6482', '测试定时demo1', '0/5 * * * * ?', '0', 'com.len.core.quartz.CustomQuartz.JobDemo1', '测试定时demo1', 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-01-07 12:30:00', 'YYYY-MM-DD HH24:MI:SS'), 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-07-14 13:29:55', 'YYYY-MM-DD HH24:MI:SS')); -INSERT INTO "LEN"."SYS_JOB" VALUES ('ab648a22f38d11e7aca0201a068c6482', '任务demo2', '0 0/1 * * * ?', '0', 'com.len.core.quartz.CustomQuartz.JobDemo2', '任务demo2', 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-01-07 17:32:36', 'YYYY-MM-DD HH24:MI:SS'), 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-07-07 17:07:45', 'YYYY-MM-DD HH24:MI:SS')); +INSERT INTO "LEN"."SYS_JOB" +VALUES ('55147ebdf2f611e7a4fe201a068c6482', '测试定时demo1', '0/5 * * * * ?', '0', + 'com.len.core.quartz.CustomQuartz.JobDemo1', '测试定时demo1', 'acfc0e9232f54732a5d9ffe9071bf572', + TO_DATE('2018-01-07 12:30:00', 'YYYY-MM-DD HH24:MI:SS'), 'acfc0e9232f54732a5d9ffe9071bf572', + TO_DATE('2018-07-14 13:29:55', 'YYYY-MM-DD HH24:MI:SS')); +INSERT INTO "LEN"."SYS_JOB" +VALUES ('ab648a22f38d11e7aca0201a068c6482', '任务demo2', '0 0/1 * * * ?', '0', + 'com.len.core.quartz.CustomQuartz.JobDemo2', '任务demo2', 'acfc0e9232f54732a5d9ffe9071bf572', + TO_DATE('2018-01-07 17:32:36', 'YYYY-MM-DD HH24:MI:SS'), 'acfc0e9232f54732a5d9ffe9071bf572', + TO_DATE('2018-07-07 17:07:45', 'YYYY-MM-DD HH24:MI:SS')); -- ---------------------------- -- Table structure for SYS_LOG -- ---------------------------- DROP TABLE "LEN"."SYS_LOG"; -CREATE TABLE "LEN"."SYS_LOG" ( -"ID" NUMBER(11) NOT NULL , -"USER_NAME" NVARCHAR2(32) NULL , -"IP" NVARCHAR2(255) NULL , -"TYPE" NVARCHAR2(255) NULL , -"TEXT" NVARCHAR2(255) NULL , -"PARAM" NCLOB NULL , -"CREATE_TIME" DATE NULL -) -LOGGING +CREATE TABLE "LEN"."SYS_LOG" +( + "ID" NUMBER(11) NOT NULL, + "USER_NAME" NVARCHAR2(32) NULL, + "IP" NVARCHAR2(255) NULL, + "TYPE" NVARCHAR2(255) NULL, + "TEXT" NVARCHAR2(255) NULL, + "PARAM" NCLOB NULL, + "CREATE_TIME" DATE NULL +) LOGGING NOCOMPRESS NOCACHE - ; -- ---------------------------- @@ -1005,299 +1074,553 @@ NOCACHE -- Table structure for SYS_MENU -- ---------------------------- DROP TABLE "LEN"."SYS_MENU"; -CREATE TABLE "LEN"."SYS_MENU" ( -"ID" NVARCHAR2(36) NOT NULL , -"NAME" NVARCHAR2(255) NOT NULL , -"P_ID" NVARCHAR2(36) NULL , -"URL" NVARCHAR2(255) NULL , -"ORDER_NUM" NUMBER(11) NULL , -"ICON" NVARCHAR2(255) NULL , -"CREATE_BY" NVARCHAR2(32) NULL , -"CREATE_DATE" DATE NULL , -"UPDATE_BY" NVARCHAR2(32) NULL , -"UPDATE_DATE" DATE NULL , -"PERMISSION" NVARCHAR2(255) NULL , -"MENU_TYPE" NUMBER(4) NOT NULL -) -LOGGING +CREATE TABLE "LEN"."SYS_MENU" +( + "ID" NVARCHAR2(36) NOT NULL, + "NAME" NVARCHAR2(255) NOT NULL, + "P_ID" NVARCHAR2(36) NULL, + "URL" NVARCHAR2(255) NULL, + "ORDER_NUM" NUMBER(11) NULL, + "ICON" NVARCHAR2(255) NULL, + "CREATE_BY" NVARCHAR2(32) NULL, + "CREATE_DATE" DATE NULL, + "UPDATE_BY" NVARCHAR2(32) NULL, + "UPDATE_DATE" DATE NULL, + "PERMISSION" NVARCHAR2(255) NULL, + "MENU_TYPE" NUMBER(4) NOT NULL +) LOGGING NOCOMPRESS NOCACHE - ; -COMMENT ON COLUMN "LEN"."SYS_MENU"."ORDER_NUM" IS '排序字段'; -COMMENT ON COLUMN "LEN"."SYS_MENU"."ICON" IS '图标'; -COMMENT ON COLUMN "LEN"."SYS_MENU"."PERMISSION" IS '权限'; -COMMENT ON COLUMN "LEN"."SYS_MENU"."MENU_TYPE" IS '1栏目2菜单'; +COMMENT +ON COLUMN "LEN"."SYS_MENU"."ORDER_NUM" IS '排序字段'; +COMMENT +ON COLUMN "LEN"."SYS_MENU"."ICON" IS '图标'; +COMMENT +ON COLUMN "LEN"."SYS_MENU"."PERMISSION" IS '权限'; +COMMENT +ON COLUMN "LEN"."SYS_MENU"."MENU_TYPE" IS '1栏目2菜单'; -- ---------------------------- -- Records of SYS_MENU -- ---------------------------- -INSERT INTO "LEN"."SYS_MENU" VALUES ('0e6c8d4cf09511e78a57201a068c6482', '删除', 'cff61424dfb311e7b555201a068c6482', null, '3', null, 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-01-03 22:47:44', 'YYYY-MM-DD HH24:MI:SS'), null, null, 'role:del', '1'); -INSERT INTO "LEN"."SYS_MENU" VALUES ('18bf8d5df09511e78a57201a068c6482', '新增', '3873ccc2dfda11e7b555201a068c6482', null, '1', null, 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-01-03 22:48:01', 'YYYY-MM-DD HH24:MI:SS'), null, null, 'nemu:add', '1'); -INSERT INTO "LEN"."SYS_MENU" VALUES ('28661300f9d411e7a009201a068c6482', '流程管理', 'e06da471f90311e780aa201a068c6482', '/act/goAct', '2', '', 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-01-15 17:12:06', 'YYYY-MM-DD HH24:MI:SS'), null, null, 'act:deployment', '0'); -INSERT INTO "LEN"."SYS_MENU" VALUES ('2b56410cf09411e78a57201a068c6482', '新增', 'cff61424dfb311e7b555201a068c6482', null, '1', null, 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-01-03 22:41:23', 'YYYY-MM-DD HH24:MI:SS'), null, null, 'role:add', '1'); -INSERT INTO "LEN"."SYS_MENU" VALUES ('3873ccc2dfda11e7b555201a068c6482', '菜单管理', 'cfda8029dfb311e7b555201a068c6482', 'menu/showMenu', '1', '', null, TO_DATE('2017-12-14 14:02:50', 'YYYY-MM-DD HH24:MI:SS'), 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-04-23 19:43:54', 'YYYY-MM-DD HH24:MI:SS'), 'menu:show', '0'); -INSERT INTO "LEN"."SYS_MENU" VALUES ('433089a6eb0111e782d5201a068c6482', '编辑', 'cfe54921dfb311e7b555201a068c6482', null, null, '1', 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2017-12-27 20:27:11', 'YYYY-MM-DD HH24:MI:SS'), null, null, 'user:update', '1'); -INSERT INTO "LEN"."SYS_MENU" VALUES ('4d603831fe9b11e7b472201a068c6482', '待办任务', 'e06da471f90311e780aa201a068c6482', '/leave/showTask', '5', '', 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-01-21 19:07:43', 'YYYY-MM-DD HH24:MI:SS'), null, null, 'task:show', '0'); -INSERT INTO "LEN"."SYS_MENU" VALUES ('5ae3d4e9f38e11e7aca0201a068c6482', '新增', 'e9a13e55f35911e7aca0201a068c6482', null, '1', null, 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-01-07 17:37:30', 'YYYY-MM-DD HH24:MI:SS'), null, null, 'job:add', '1'); -INSERT INTO "LEN"."SYS_MENU" VALUES ('6315968bf37111e7aca0201a068c6482', '停止', 'e9a13e55f35911e7aca0201a068c6482', null, '4', null, 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-01-07 14:10:09', 'YYYY-MM-DD HH24:MI:SS'), null, null, 'job:end', '1'); -INSERT INTO "LEN"."SYS_MENU" VALUES ('63da4415fc6211e7a781201a068c6482', '模型列表', 'e06da471f90311e780aa201a068c6482', '/act/goActModel', '3', '', 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-01-18 23:15:17', 'YYYY-MM-DD HH24:MI:SS'), null, null, 'act', '0'); -INSERT INTO "LEN"."SYS_MENU" VALUES ('6931fd22f09611e78a57201a068c6482', '删除', 'b441914cee0811e7a60d201a068c6482', null, '1', null, 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-01-03 22:57:26', 'YYYY-MM-DD HH24:MI:SS'), null, null, 'control:del', '1'); -INSERT INTO "LEN"."SYS_MENU" VALUES ('69f3f59cf38e11e7aca0201a068c6482', '编辑', 'e9a13e55f35911e7aca0201a068c6482', null, '2', null, 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-01-07 17:37:56', 'YYYY-MM-DD HH24:MI:SS'), null, null, 'job:update', '1'); -INSERT INTO "LEN"."SYS_MENU" VALUES ('6dc13c6eec5f11e7a472201a068c6482', '系统日志', 'a1ca6642ec5e11e7a472201a068c6482', 'log/showLog', '1', '', 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2017-12-29 14:43:46', 'YYYY-MM-DD HH24:MI:SS'), null, TO_DATE('2017-12-29 14:43:46', 'YYYY-MM-DD HH24:MI:SS'), 'log:show', '0'); -INSERT INTO "LEN"."SYS_MENU" VALUES ('788d8e34f38e11e7aca0201a068c6482', '删除', 'e9a13e55f35911e7aca0201a068c6482', null, '5', null, 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-01-07 17:38:20', 'YYYY-MM-DD HH24:MI:SS'), null, null, 'job:del', '1'); -INSERT INTO "LEN"."SYS_MENU" VALUES ('7967e098ee0611e7a60d201a068c6482', '接口api', 'a1ca6642ec5e11e7a472201a068c6482', 'swagger-ui.html', '2', '', 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2017-12-31 16:42:04', 'YYYY-MM-DD HH24:MI:SS'), null, null, null, '0'); -INSERT INTO "LEN"."SYS_MENU" VALUES ('873f30b0f38e11e7aca0201a068c6482', '查看', 'e9a13e55f35911e7aca0201a068c6482', null, '6', null, 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-01-07 17:38:45', 'YYYY-MM-DD HH24:MI:SS'), null, null, 'job:select', '1'); -INSERT INTO "LEN"."SYS_MENU" VALUES ('88b8e5d1f38911e7aca0201a068c6482', '查看', 'cff61424dfb311e7b555201a068c6482', null, '4', null, 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-01-07 17:03:00', 'YYYY-MM-DD HH24:MI:SS'), null, null, 'role:select', '1'); -INSERT INTO "LEN"."SYS_MENU" VALUES ('8a6c8bfa7f804eac810c5790cad9a62a', '删除', '3873ccc2dfda11e7b555201a068c6482', null, '2', null, 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-06-20 21:55:55', 'YYYY-MM-DD HH24:MI:SS'), null, null, 'menu:del', '1'); -INSERT INTO "LEN"."SYS_MENU" VALUES ('a1ca6642ec5e11e7a472201a068c6482', '系统监控', null, null, '2', '', 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-01-03 10:56:14', 'YYYY-MM-DD HH24:MI:SS'), null, TO_DATE('2018-01-03 10:56:14', 'YYYY-MM-DD HH24:MI:SS'), null, '0'); -INSERT INTO "LEN"."SYS_MENU" VALUES ('b441914cee0811e7a60d201a068c6482', '系统监控', 'a1ca6642ec5e11e7a472201a068c6482', 'druid/index.html', '3', '', 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2017-12-31 16:58:01', 'YYYY-MM-DD HH24:MI:SS'), null, null, null, '0'); -INSERT INTO "LEN"."SYS_MENU" VALUES ('b7839f59fe8811e7b472201a068c6482', '请假流程', 'e06da471f90311e780aa201a068c6482', '/leave/showLeave', '4', '', 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-01-21 16:54:40', 'YYYY-MM-DD HH24:MI:SS'), null, null, 'leave:show', '0'); -INSERT INTO "LEN"."SYS_MENU" VALUES ('cfda8029dfb311e7b555201a068c6482', '系统管理', null, null, '1', '', null, TO_DATE('2018-01-03 10:56:13', 'YYYY-MM-DD HH24:MI:SS'), null, TO_DATE('2018-01-03 10:56:13', 'YYYY-MM-DD HH24:MI:SS'), null, '0'); -INSERT INTO "LEN"."SYS_MENU" VALUES ('cfe54921dfb311e7b555201a068c6482', '用户管理', 'cfda8029dfb311e7b555201a068c6482', '/user/showUser', '2', '', null, TO_DATE('2017-12-29 14:40:34', 'YYYY-MM-DD HH24:MI:SS'), null, TO_DATE('2017-12-29 14:40:34', 'YYYY-MM-DD HH24:MI:SS'), 'user:show', '0'); -INSERT INTO "LEN"."SYS_MENU" VALUES ('cfe54921dfb311e7b555201a068c6483', '增加', 'cfe54921dfb311e7b555201a068c6482', null, '1', null, null, null, null, null, 'user:select', '1'); -INSERT INTO "LEN"."SYS_MENU" VALUES ('cff61424dfb311e7b555201a068c6482', '角色管理', 'cfda8029dfb311e7b555201a068c6482', '/role/showRole', '3', '', null, TO_DATE('2017-12-29 14:40:36', 'YYYY-MM-DD HH24:MI:SS'), null, TO_DATE('2017-12-29 14:40:36', 'YYYY-MM-DD HH24:MI:SS'), 'role:show', '0'); -INSERT INTO "LEN"."SYS_MENU" VALUES ('e06da471f90311e780aa201a068c6482', '工作流程管理', null, null, '3', '', 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-01-14 16:21:10', 'YYYY-MM-DD HH24:MI:SS'), null, null, null, '0'); -INSERT INTO "LEN"."SYS_MENU" VALUES ('e3b11497eb9e11e7928d201a068c6482', '删除', 'cfe54921dfb311e7b555201a068c6482', null, null, null, 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2017-12-28 15:17:07', 'YYYY-MM-DD HH24:MI:SS'), null, TO_DATE('2017-12-28 15:17:07', 'YYYY-MM-DD HH24:MI:SS'), 'user:del', '1'); -INSERT INTO "LEN"."SYS_MENU" VALUES ('e9a13e55f35911e7aca0201a068c6482', '定时任务', 'a1ca6642ec5e11e7a472201a068c6482', '/job/showJob', '3', '', 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-01-07 11:22:06', 'YYYY-MM-DD HH24:MI:SS'), null, null, 'job:show', '0'); -INSERT INTO "LEN"."SYS_MENU" VALUES ('ecda560cf36f11e7aca0201a068c6482', '启动', 'e9a13e55f35911e7aca0201a068c6482', null, '3', null, 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-01-07 13:59:41', 'YYYY-MM-DD HH24:MI:SS'), null, null, 'job:start', '1'); -INSERT INTO "LEN"."SYS_MENU" VALUES ('f23f6a6bf09511e78a57201a068c6482', '修改密码', 'cfe54921dfb311e7b555201a068c6482', null, '4', null, 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-01-03 22:54:06', 'YYYY-MM-DD HH24:MI:SS'), null, null, 'user:repass', '1'); -INSERT INTO "LEN"."SYS_MENU" VALUES ('ff015ea5f09411e78a57201a068c6482', '编辑', 'cff61424dfb311e7b555201a068c6482', null, '2', null, 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-01-03 22:47:18', 'YYYY-MM-DD HH24:MI:SS'), null, null, 'role:update', '1'); +INSERT INTO "LEN"."SYS_MENU" +VALUES ('0e6c8d4cf09511e78a57201a068c6482', '删除', 'cff61424dfb311e7b555201a068c6482', null, '3', null, + 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-01-03 22:47:44', 'YYYY-MM-DD HH24:MI:SS'), null, null, + 'role:del', '1'); +INSERT INTO "LEN"."SYS_MENU" +VALUES ('18bf8d5df09511e78a57201a068c6482', '新增', '3873ccc2dfda11e7b555201a068c6482', null, '1', null, + 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-01-03 22:48:01', 'YYYY-MM-DD HH24:MI:SS'), null, null, + 'nemu:add', '1'); +INSERT INTO "LEN"."SYS_MENU" +VALUES ('28661300f9d411e7a009201a068c6482', '流程管理', 'e06da471f90311e780aa201a068c6482', '/act/goAct', '2', + '', 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-01-15 17:12:06', 'YYYY-MM-DD HH24:MI:SS'), null, + null, 'act:deployment', '0'); +INSERT INTO "LEN"."SYS_MENU" +VALUES ('2b56410cf09411e78a57201a068c6482', '新增', 'cff61424dfb311e7b555201a068c6482', null, '1', null, + 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-01-03 22:41:23', 'YYYY-MM-DD HH24:MI:SS'), null, null, + 'role:add', '1'); +INSERT INTO "LEN"."SYS_MENU" +VALUES ('3873ccc2dfda11e7b555201a068c6482', '菜单管理', 'cfda8029dfb311e7b555201a068c6482', 'menu/showMenu', '1', '', + null, TO_DATE('2017-12-14 14:02:50', 'YYYY-MM-DD HH24:MI:SS'), 'acfc0e9232f54732a5d9ffe9071bf572', + TO_DATE('2018-04-23 19:43:54', 'YYYY-MM-DD HH24:MI:SS'), 'menu:show', '0'); +INSERT INTO "LEN"."SYS_MENU" +VALUES ('433089a6eb0111e782d5201a068c6482', '编辑', 'cfe54921dfb311e7b555201a068c6482', null, null, '1', + 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2017-12-27 20:27:11', 'YYYY-MM-DD HH24:MI:SS'), null, null, + 'user:update', '1'); +INSERT INTO "LEN"."SYS_MENU" +VALUES ('4d603831fe9b11e7b472201a068c6482', '待办任务', 'e06da471f90311e780aa201a068c6482', '/leave/showTask', '5', + '', 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-01-21 19:07:43', 'YYYY-MM-DD HH24:MI:SS'), null, + null, 'task:show', '0'); +INSERT INTO "LEN"."SYS_MENU" +VALUES ('5ae3d4e9f38e11e7aca0201a068c6482', '新增', 'e9a13e55f35911e7aca0201a068c6482', null, '1', null, + 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-01-07 17:37:30', 'YYYY-MM-DD HH24:MI:SS'), null, null, + 'job:add', '1'); +INSERT INTO "LEN"."SYS_MENU" +VALUES ('6315968bf37111e7aca0201a068c6482', '停止', 'e9a13e55f35911e7aca0201a068c6482', null, '4', null, + 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-01-07 14:10:09', 'YYYY-MM-DD HH24:MI:SS'), null, null, + 'job:end', '1'); +INSERT INTO "LEN"."SYS_MENU" +VALUES ('63da4415fc6211e7a781201a068c6482', '模型列表', 'e06da471f90311e780aa201a068c6482', '/act/goActModel', '3', + '', 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-01-18 23:15:17', 'YYYY-MM-DD HH24:MI:SS'), null, + null, 'act', '0'); +INSERT INTO "LEN"."SYS_MENU" +VALUES ('6931fd22f09611e78a57201a068c6482', '删除', 'b441914cee0811e7a60d201a068c6482', null, '1', null, + 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-01-03 22:57:26', 'YYYY-MM-DD HH24:MI:SS'), null, null, + 'control:del', '1'); +INSERT INTO "LEN"."SYS_MENU" +VALUES ('69f3f59cf38e11e7aca0201a068c6482', '编辑', 'e9a13e55f35911e7aca0201a068c6482', null, '2', null, + 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-01-07 17:37:56', 'YYYY-MM-DD HH24:MI:SS'), null, null, + 'job:update', '1'); +INSERT INTO "LEN"."SYS_MENU" +VALUES ('6dc13c6eec5f11e7a472201a068c6482', '系统日志', 'a1ca6642ec5e11e7a472201a068c6482', 'log/showLog', '1', + '', 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2017-12-29 14:43:46', 'YYYY-MM-DD HH24:MI:SS'), null, + TO_DATE('2017-12-29 14:43:46', 'YYYY-MM-DD HH24:MI:SS'), 'log:show', '0'); +INSERT INTO "LEN"."SYS_MENU" +VALUES ('788d8e34f38e11e7aca0201a068c6482', '删除', 'e9a13e55f35911e7aca0201a068c6482', null, '5', null, + 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-01-07 17:38:20', 'YYYY-MM-DD HH24:MI:SS'), null, null, + 'job:del', '1'); +INSERT INTO "LEN"."SYS_MENU" +VALUES ('7967e098ee0611e7a60d201a068c6482', '接口api', 'a1ca6642ec5e11e7a472201a068c6482', 'swagger-ui.html', '2', + '', 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2017-12-31 16:42:04', 'YYYY-MM-DD HH24:MI:SS'), null, + null, null, '0'); +INSERT INTO "LEN"."SYS_MENU" +VALUES ('873f30b0f38e11e7aca0201a068c6482', '查看', 'e9a13e55f35911e7aca0201a068c6482', null, '6', null, + 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-01-07 17:38:45', 'YYYY-MM-DD HH24:MI:SS'), null, null, + 'job:select', '1'); +INSERT INTO "LEN"."SYS_MENU" +VALUES ('88b8e5d1f38911e7aca0201a068c6482', '查看', 'cff61424dfb311e7b555201a068c6482', null, '4', null, + 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-01-07 17:03:00', 'YYYY-MM-DD HH24:MI:SS'), null, null, + 'role:select', '1'); +INSERT INTO "LEN"."SYS_MENU" +VALUES ('8a6c8bfa7f804eac810c5790cad9a62a', '删除', '3873ccc2dfda11e7b555201a068c6482', null, '2', null, + 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-06-20 21:55:55', 'YYYY-MM-DD HH24:MI:SS'), null, null, + 'menu:del', '1'); +INSERT INTO "LEN"."SYS_MENU" +VALUES ('a1ca6642ec5e11e7a472201a068c6482', '系统监控', null, null, '2', '', 'acfc0e9232f54732a5d9ffe9071bf572', + TO_DATE('2018-01-03 10:56:14', 'YYYY-MM-DD HH24:MI:SS'), null, + TO_DATE('2018-01-03 10:56:14', 'YYYY-MM-DD HH24:MI:SS'), null, '0'); +INSERT INTO "LEN"."SYS_MENU" +VALUES ('b441914cee0811e7a60d201a068c6482', '系统监控', 'a1ca6642ec5e11e7a472201a068c6482', 'druid/index.html', '3', + '', 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2017-12-31 16:58:01', 'YYYY-MM-DD HH24:MI:SS'), null, + null, null, '0'); +INSERT INTO "LEN"."SYS_MENU" +VALUES ('b7839f59fe8811e7b472201a068c6482', '请假流程', 'e06da471f90311e780aa201a068c6482', '/leave/showLeave', '4', + '', 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-01-21 16:54:40', 'YYYY-MM-DD HH24:MI:SS'), null, + null, 'leave:show', '0'); +INSERT INTO "LEN"."SYS_MENU" +VALUES ('cfda8029dfb311e7b555201a068c6482', '系统管理', null, null, '1', '', null, + TO_DATE('2018-01-03 10:56:13', 'YYYY-MM-DD HH24:MI:SS'), null, + TO_DATE('2018-01-03 10:56:13', 'YYYY-MM-DD HH24:MI:SS'), null, '0'); +INSERT INTO "LEN"."SYS_MENU" +VALUES ('cfe54921dfb311e7b555201a068c6482', '用户管理', 'cfda8029dfb311e7b555201a068c6482', '/user/showUser', '2', + '', null, TO_DATE('2017-12-29 14:40:34', 'YYYY-MM-DD HH24:MI:SS'), null, + TO_DATE('2017-12-29 14:40:34', 'YYYY-MM-DD HH24:MI:SS'), 'user:show', '0'); +INSERT INTO "LEN"."SYS_MENU" +VALUES ('cfe54921dfb311e7b555201a068c6483', '增加', 'cfe54921dfb311e7b555201a068c6482', null, '1', null, null, null, + null, null, 'user:select', '1'); +INSERT INTO "LEN"."SYS_MENU" +VALUES ('cff61424dfb311e7b555201a068c6482', '角色管理', 'cfda8029dfb311e7b555201a068c6482', '/role/showRole', '3', + '', null, TO_DATE('2017-12-29 14:40:36', 'YYYY-MM-DD HH24:MI:SS'), null, + TO_DATE('2017-12-29 14:40:36', 'YYYY-MM-DD HH24:MI:SS'), 'role:show', '0'); +INSERT INTO "LEN"."SYS_MENU" +VALUES ('e06da471f90311e780aa201a068c6482', '工作流程管理', null, null, '3', '', + 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-01-14 16:21:10', 'YYYY-MM-DD HH24:MI:SS'), null, null, null, + '0'); +INSERT INTO "LEN"."SYS_MENU" +VALUES ('e3b11497eb9e11e7928d201a068c6482', '删除', 'cfe54921dfb311e7b555201a068c6482', null, null, null, + 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2017-12-28 15:17:07', 'YYYY-MM-DD HH24:MI:SS'), null, + TO_DATE('2017-12-28 15:17:07', 'YYYY-MM-DD HH24:MI:SS'), 'user:del', '1'); +INSERT INTO "LEN"."SYS_MENU" +VALUES ('e9a13e55f35911e7aca0201a068c6482', '定时任务', 'a1ca6642ec5e11e7a472201a068c6482', '/job/showJob', '3', + '', 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-01-07 11:22:06', 'YYYY-MM-DD HH24:MI:SS'), null, + null, 'job:show', '0'); +INSERT INTO "LEN"."SYS_MENU" +VALUES ('ecda560cf36f11e7aca0201a068c6482', '启动', 'e9a13e55f35911e7aca0201a068c6482', null, '3', null, + 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-01-07 13:59:41', 'YYYY-MM-DD HH24:MI:SS'), null, null, + 'job:start', '1'); +INSERT INTO "LEN"."SYS_MENU" +VALUES ('f23f6a6bf09511e78a57201a068c6482', '修改密码', 'cfe54921dfb311e7b555201a068c6482', null, '4', null, + 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-01-03 22:54:06', 'YYYY-MM-DD HH24:MI:SS'), null, null, + 'user:repass', '1'); +INSERT INTO "LEN"."SYS_MENU" +VALUES ('ff015ea5f09411e78a57201a068c6482', '编辑', 'cff61424dfb311e7b555201a068c6482', null, '2', null, + 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-01-03 22:47:18', 'YYYY-MM-DD HH24:MI:SS'), null, null, + 'role:update', '1'); -- ---------------------------- -- Table structure for SYS_ROLE -- ---------------------------- DROP TABLE "LEN"."SYS_ROLE"; -CREATE TABLE "LEN"."SYS_ROLE" ( -"ID" NVARCHAR2(32) NOT NULL , -"ROLE_NAME" NVARCHAR2(128) NULL , -"REMARK" NVARCHAR2(255) NULL , -"CREATE_BY" NVARCHAR2(32) NULL , -"CREATE_DATE" DATE NULL , -"UPDATE_BY" NVARCHAR2(32) NULL , -"UPDATE_DATE" DATE NULL -) -LOGGING +CREATE TABLE "LEN"."SYS_ROLE" +( + "ID" NVARCHAR2(32) NOT NULL, + "ROLE_NAME" NVARCHAR2(128) NULL, + "REMARK" NVARCHAR2(255) NULL, + "CREATE_BY" NVARCHAR2(32) NULL, + "CREATE_DATE" DATE NULL, + "UPDATE_BY" NVARCHAR2(32) NULL, + "UPDATE_DATE" DATE NULL +) LOGGING NOCOMPRESS NOCACHE - ; -- ---------------------------- -- Records of SYS_ROLE -- ---------------------------- -INSERT INTO "LEN"."SYS_ROLE" VALUES ('023366f3457511e8bcf1309c2315f9aa', 'hr', '人事', 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-04-21 23:02:16', 'YYYY-MM-DD HH24:MI:SS'), null, null); -INSERT INTO "LEN"."SYS_ROLE" VALUES ('0ea934e5e55411e7b983201a068c6482', 'manage', '经理', 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2017-12-20 15:04:44', 'YYYY-MM-DD HH24:MI:SS'), null, TO_DATE('2018-01-02 11:41:43', 'YYYY-MM-DD HH24:MI:SS')); -INSERT INTO "LEN"."SYS_ROLE" VALUES ('2619a672e53811e7b983201a068c6482', 'admin', '管理员', 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2017-12-20 11:44:57', 'YYYY-MM-DD HH24:MI:SS'), null, TO_DATE('2018-01-02 11:38:37', 'YYYY-MM-DD HH24:MI:SS')); -INSERT INTO "LEN"."SYS_ROLE" VALUES ('4bb891d8caf84cc6ba27e515e80ac40d', 'blogAdmin', '博客管理员', 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-10-01 10:21:10', 'YYYY-MM-DD HH24:MI:SS'), null, null); -INSERT INTO "LEN"."SYS_ROLE" VALUES ('dcb0f642fe9611e7b472201a068c6482', 'dev', '开发', 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-01-21 18:35:56', 'YYYY-MM-DD HH24:MI:SS'), null, null); -INSERT INTO "LEN"."SYS_ROLE" VALUES ('e346e96368484c8fa7f217ce550a0186', 'DeputyManager', '副经理', 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-06-14 23:21:36', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "LEN"."SYS_ROLE" +VALUES ('023366f3457511e8bcf1309c2315f9aa', 'hr', '人事', 'acfc0e9232f54732a5d9ffe9071bf572', + TO_DATE('2018-04-21 23:02:16', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "LEN"."SYS_ROLE" +VALUES ('0ea934e5e55411e7b983201a068c6482', 'manage', '经理', 'acfc0e9232f54732a5d9ffe9071bf572', + TO_DATE('2017-12-20 15:04:44', 'YYYY-MM-DD HH24:MI:SS'), null, + TO_DATE('2018-01-02 11:41:43', 'YYYY-MM-DD HH24:MI:SS')); +INSERT INTO "LEN"."SYS_ROLE" +VALUES ('2619a672e53811e7b983201a068c6482', 'admin', '管理员', 'acfc0e9232f54732a5d9ffe9071bf572', + TO_DATE('2017-12-20 11:44:57', 'YYYY-MM-DD HH24:MI:SS'), null, + TO_DATE('2018-01-02 11:38:37', 'YYYY-MM-DD HH24:MI:SS')); +INSERT INTO "LEN"."SYS_ROLE" +VALUES ('4bb891d8caf84cc6ba27e515e80ac40d', 'blogAdmin', '博客管理员', 'acfc0e9232f54732a5d9ffe9071bf572', + TO_DATE('2018-10-01 10:21:10', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "LEN"."SYS_ROLE" +VALUES ('dcb0f642fe9611e7b472201a068c6482', 'dev', '开发', 'acfc0e9232f54732a5d9ffe9071bf572', + TO_DATE('2018-01-21 18:35:56', 'YYYY-MM-DD HH24:MI:SS'), null, null); +INSERT INTO "LEN"."SYS_ROLE" +VALUES ('e346e96368484c8fa7f217ce550a0186', 'DeputyManager', '副经理', 'acfc0e9232f54732a5d9ffe9071bf572', + TO_DATE('2018-06-14 23:21:36', 'YYYY-MM-DD HH24:MI:SS'), null, null); -- ---------------------------- -- Table structure for SYS_ROLE_MENU -- ---------------------------- DROP TABLE "LEN"."SYS_ROLE_MENU"; -CREATE TABLE "LEN"."SYS_ROLE_MENU" ( -"ROLE_ID" NVARCHAR2(32) NOT NULL , -"MENU_ID" NVARCHAR2(32) NOT NULL -) -LOGGING +CREATE TABLE "LEN"."SYS_ROLE_MENU" +( + "ROLE_ID" NVARCHAR2(32) NOT NULL, + "MENU_ID" NVARCHAR2(32) NOT NULL +) LOGGING NOCOMPRESS NOCACHE - ; -- ---------------------------- -- Records of SYS_ROLE_MENU -- ---------------------------- -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('023366f3457511e8bcf1309c2315f9aa', '433089a6eb0111e782d5201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('023366f3457511e8bcf1309c2315f9aa', '4d603831fe9b11e7b472201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('023366f3457511e8bcf1309c2315f9aa', 'b7839f59fe8811e7b472201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('023366f3457511e8bcf1309c2315f9aa', 'cfda8029dfb311e7b555201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('023366f3457511e8bcf1309c2315f9aa', 'cfe54921dfb311e7b555201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('023366f3457511e8bcf1309c2315f9aa', 'cfe54921dfb311e7b555201a068c6483'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('023366f3457511e8bcf1309c2315f9aa', 'e06da471f90311e780aa201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('023366f3457511e8bcf1309c2315f9aa', 'e3b11497eb9e11e7928d201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('023366f3457511e8bcf1309c2315f9aa', 'f23f6a6bf09511e78a57201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('0ea934e5e55411e7b983201a068c6482', '433089a6eb0111e782d5201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('0ea934e5e55411e7b983201a068c6482', '4d603831fe9b11e7b472201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('0ea934e5e55411e7b983201a068c6482', '6931fd22f09611e78a57201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('0ea934e5e55411e7b983201a068c6482', '6dc13c6eec5f11e7a472201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('0ea934e5e55411e7b983201a068c6482', 'a1ca6642ec5e11e7a472201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('0ea934e5e55411e7b983201a068c6482', 'b7839f59fe8811e7b472201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('0ea934e5e55411e7b983201a068c6482', 'cfda8029dfb311e7b555201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('0ea934e5e55411e7b983201a068c6482', 'cfe54921dfb311e7b555201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('0ea934e5e55411e7b983201a068c6482', 'e06da471f90311e780aa201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('2619a672e53811e7b983201a068c6482', '0e6c8d4cf09511e78a57201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('2619a672e53811e7b983201a068c6482', '18bf8d5df09511e78a57201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('2619a672e53811e7b983201a068c6482', '28661300f9d411e7a009201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('2619a672e53811e7b983201a068c6482', '2b56410cf09411e78a57201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('2619a672e53811e7b983201a068c6482', '3873ccc2dfda11e7b555201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('2619a672e53811e7b983201a068c6482', '433089a6eb0111e782d5201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('2619a672e53811e7b983201a068c6482', '4d603831fe9b11e7b472201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('2619a672e53811e7b983201a068c6482', '5ae3d4e9f38e11e7aca0201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('2619a672e53811e7b983201a068c6482', '6315968bf37111e7aca0201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('2619a672e53811e7b983201a068c6482', '63da4415fc6211e7a781201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('2619a672e53811e7b983201a068c6482', '6931fd22f09611e78a57201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('2619a672e53811e7b983201a068c6482', '69f3f59cf38e11e7aca0201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('2619a672e53811e7b983201a068c6482', '6dc13c6eec5f11e7a472201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('2619a672e53811e7b983201a068c6482', '788d8e34f38e11e7aca0201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('2619a672e53811e7b983201a068c6482', '7967e098ee0611e7a60d201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('2619a672e53811e7b983201a068c6482', '873f30b0f38e11e7aca0201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('2619a672e53811e7b983201a068c6482', '88b8e5d1f38911e7aca0201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('2619a672e53811e7b983201a068c6482', 'a1ca6642ec5e11e7a472201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('2619a672e53811e7b983201a068c6482', 'b441914cee0811e7a60d201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('2619a672e53811e7b983201a068c6482', 'b7839f59fe8811e7b472201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('2619a672e53811e7b983201a068c6482', 'cfda8029dfb311e7b555201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('2619a672e53811e7b983201a068c6482', 'cfe54921dfb311e7b555201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('2619a672e53811e7b983201a068c6482', 'cfe54921dfb311e7b555201a068c6483'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('2619a672e53811e7b983201a068c6482', 'cff61424dfb311e7b555201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('2619a672e53811e7b983201a068c6482', 'e06da471f90311e780aa201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('2619a672e53811e7b983201a068c6482', 'e3b11497eb9e11e7928d201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('2619a672e53811e7b983201a068c6482', 'e9a13e55f35911e7aca0201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('2619a672e53811e7b983201a068c6482', 'ecda560cf36f11e7aca0201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('2619a672e53811e7b983201a068c6482', 'f23f6a6bf09511e78a57201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('2619a672e53811e7b983201a068c6482', 'ff015ea5f09411e78a57201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('35f7934d335e4641b7887e4b3b1885a5', '18bf8d5df09511e78a57201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('35f7934d335e4641b7887e4b3b1885a5', '3873ccc2dfda11e7b555201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('35f7934d335e4641b7887e4b3b1885a5', 'cfda8029dfb311e7b555201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('a56219ffeb7d11e7928d201a068c6482', '433089a6eb0111e782d5201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('a56219ffeb7d11e7928d201a068c6482', 'cfda8029dfb311e7b555201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('a56219ffeb7d11e7928d201a068c6482', 'cfe54921dfb311e7b555201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('dcb0f642fe9611e7b472201a068c6482', '4d603831fe9b11e7b472201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('dcb0f642fe9611e7b472201a068c6482', '5ae3d4e9f38e11e7aca0201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('dcb0f642fe9611e7b472201a068c6482', '6315968bf37111e7aca0201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('dcb0f642fe9611e7b472201a068c6482', '69f3f59cf38e11e7aca0201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('dcb0f642fe9611e7b472201a068c6482', '788d8e34f38e11e7aca0201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('dcb0f642fe9611e7b472201a068c6482', '873f30b0f38e11e7aca0201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('dcb0f642fe9611e7b472201a068c6482', 'a1ca6642ec5e11e7a472201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('dcb0f642fe9611e7b472201a068c6482', 'b7839f59fe8811e7b472201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('dcb0f642fe9611e7b472201a068c6482', 'e06da471f90311e780aa201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('dcb0f642fe9611e7b472201a068c6482', 'e9a13e55f35911e7aca0201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('dcb0f642fe9611e7b472201a068c6482', 'ecda560cf36f11e7aca0201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('e346e96368484c8fa7f217ce550a0186', '4d603831fe9b11e7b472201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('e346e96368484c8fa7f217ce550a0186', 'b7839f59fe8811e7b472201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_MENU" VALUES ('e346e96368484c8fa7f217ce550a0186', 'e06da471f90311e780aa201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('023366f3457511e8bcf1309c2315f9aa', '433089a6eb0111e782d5201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('023366f3457511e8bcf1309c2315f9aa', '4d603831fe9b11e7b472201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('023366f3457511e8bcf1309c2315f9aa', 'b7839f59fe8811e7b472201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('023366f3457511e8bcf1309c2315f9aa', 'cfda8029dfb311e7b555201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('023366f3457511e8bcf1309c2315f9aa', 'cfe54921dfb311e7b555201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('023366f3457511e8bcf1309c2315f9aa', 'cfe54921dfb311e7b555201a068c6483'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('023366f3457511e8bcf1309c2315f9aa', 'e06da471f90311e780aa201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('023366f3457511e8bcf1309c2315f9aa', 'e3b11497eb9e11e7928d201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('023366f3457511e8bcf1309c2315f9aa', 'f23f6a6bf09511e78a57201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('0ea934e5e55411e7b983201a068c6482', '433089a6eb0111e782d5201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('0ea934e5e55411e7b983201a068c6482', '4d603831fe9b11e7b472201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('0ea934e5e55411e7b983201a068c6482', '6931fd22f09611e78a57201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('0ea934e5e55411e7b983201a068c6482', '6dc13c6eec5f11e7a472201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('0ea934e5e55411e7b983201a068c6482', 'a1ca6642ec5e11e7a472201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('0ea934e5e55411e7b983201a068c6482', 'b7839f59fe8811e7b472201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('0ea934e5e55411e7b983201a068c6482', 'cfda8029dfb311e7b555201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('0ea934e5e55411e7b983201a068c6482', 'cfe54921dfb311e7b555201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('0ea934e5e55411e7b983201a068c6482', 'e06da471f90311e780aa201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('2619a672e53811e7b983201a068c6482', '0e6c8d4cf09511e78a57201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('2619a672e53811e7b983201a068c6482', '18bf8d5df09511e78a57201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('2619a672e53811e7b983201a068c6482', '28661300f9d411e7a009201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('2619a672e53811e7b983201a068c6482', '2b56410cf09411e78a57201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('2619a672e53811e7b983201a068c6482', '3873ccc2dfda11e7b555201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('2619a672e53811e7b983201a068c6482', '433089a6eb0111e782d5201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('2619a672e53811e7b983201a068c6482', '4d603831fe9b11e7b472201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('2619a672e53811e7b983201a068c6482', '5ae3d4e9f38e11e7aca0201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('2619a672e53811e7b983201a068c6482', '6315968bf37111e7aca0201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('2619a672e53811e7b983201a068c6482', '63da4415fc6211e7a781201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('2619a672e53811e7b983201a068c6482', '6931fd22f09611e78a57201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('2619a672e53811e7b983201a068c6482', '69f3f59cf38e11e7aca0201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('2619a672e53811e7b983201a068c6482', '6dc13c6eec5f11e7a472201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('2619a672e53811e7b983201a068c6482', '788d8e34f38e11e7aca0201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('2619a672e53811e7b983201a068c6482', '7967e098ee0611e7a60d201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('2619a672e53811e7b983201a068c6482', '873f30b0f38e11e7aca0201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('2619a672e53811e7b983201a068c6482', '88b8e5d1f38911e7aca0201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('2619a672e53811e7b983201a068c6482', 'a1ca6642ec5e11e7a472201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('2619a672e53811e7b983201a068c6482', 'b441914cee0811e7a60d201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('2619a672e53811e7b983201a068c6482', 'b7839f59fe8811e7b472201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('2619a672e53811e7b983201a068c6482', 'cfda8029dfb311e7b555201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('2619a672e53811e7b983201a068c6482', 'cfe54921dfb311e7b555201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('2619a672e53811e7b983201a068c6482', 'cfe54921dfb311e7b555201a068c6483'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('2619a672e53811e7b983201a068c6482', 'cff61424dfb311e7b555201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('2619a672e53811e7b983201a068c6482', 'e06da471f90311e780aa201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('2619a672e53811e7b983201a068c6482', 'e3b11497eb9e11e7928d201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('2619a672e53811e7b983201a068c6482', 'e9a13e55f35911e7aca0201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('2619a672e53811e7b983201a068c6482', 'ecda560cf36f11e7aca0201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('2619a672e53811e7b983201a068c6482', 'f23f6a6bf09511e78a57201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('2619a672e53811e7b983201a068c6482', 'ff015ea5f09411e78a57201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('35f7934d335e4641b7887e4b3b1885a5', '18bf8d5df09511e78a57201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('35f7934d335e4641b7887e4b3b1885a5', '3873ccc2dfda11e7b555201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('35f7934d335e4641b7887e4b3b1885a5', 'cfda8029dfb311e7b555201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('a56219ffeb7d11e7928d201a068c6482', '433089a6eb0111e782d5201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('a56219ffeb7d11e7928d201a068c6482', 'cfda8029dfb311e7b555201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('a56219ffeb7d11e7928d201a068c6482', 'cfe54921dfb311e7b555201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('dcb0f642fe9611e7b472201a068c6482', '4d603831fe9b11e7b472201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('dcb0f642fe9611e7b472201a068c6482', '5ae3d4e9f38e11e7aca0201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('dcb0f642fe9611e7b472201a068c6482', '6315968bf37111e7aca0201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('dcb0f642fe9611e7b472201a068c6482', '69f3f59cf38e11e7aca0201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('dcb0f642fe9611e7b472201a068c6482', '788d8e34f38e11e7aca0201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('dcb0f642fe9611e7b472201a068c6482', '873f30b0f38e11e7aca0201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('dcb0f642fe9611e7b472201a068c6482', 'a1ca6642ec5e11e7a472201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('dcb0f642fe9611e7b472201a068c6482', 'b7839f59fe8811e7b472201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('dcb0f642fe9611e7b472201a068c6482', 'e06da471f90311e780aa201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('dcb0f642fe9611e7b472201a068c6482', 'e9a13e55f35911e7aca0201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('dcb0f642fe9611e7b472201a068c6482', 'ecda560cf36f11e7aca0201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('e346e96368484c8fa7f217ce550a0186', '4d603831fe9b11e7b472201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('e346e96368484c8fa7f217ce550a0186', 'b7839f59fe8811e7b472201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_MENU" +VALUES ('e346e96368484c8fa7f217ce550a0186', 'e06da471f90311e780aa201a068c6482'); -- ---------------------------- -- Table structure for SYS_ROLE_USER -- ---------------------------- DROP TABLE "LEN"."SYS_ROLE_USER"; -CREATE TABLE "LEN"."SYS_ROLE_USER" ( -"USER_ID" NVARCHAR2(32) NOT NULL , -"ROLE_ID" NVARCHAR2(32) NOT NULL -) -LOGGING +CREATE TABLE "LEN"."SYS_ROLE_USER" +( + "USER_ID" NVARCHAR2(32) NOT NULL, + "ROLE_ID" NVARCHAR2(32) NOT NULL +) LOGGING NOCOMPRESS NOCACHE - ; -- ---------------------------- -- Records of SYS_ROLE_USER -- ---------------------------- -INSERT INTO "LEN"."SYS_ROLE_USER" VALUES ('1ec421975ffe45229b48d4b9d712ff4f', 'dcb0f642fe9611e7b472201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_USER" VALUES ('2211fec3e17c11e795ed201a068c6482', '0ea934e5e55411e7b983201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_USER" VALUES ('3c14c2f8316741e9aaeb29d78d03e958', 'dcb0f642fe9611e7b472201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_USER" VALUES ('a4a743bffe9711e7b472201a068c6482', '4bb891d8caf84cc6ba27e515e80ac40d'); -INSERT INTO "LEN"."SYS_ROLE_USER" VALUES ('a4a743bffe9711e7b472201a068c6482', 'dcb0f642fe9611e7b472201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_USER" VALUES ('acfc0e9232f54732a5d9ffe9071bf572', '2619a672e53811e7b983201a068c6482'); -INSERT INTO "LEN"."SYS_ROLE_USER" VALUES ('acfc0e9232f54732a5d9ffe9071bf572', '4bb891d8caf84cc6ba27e515e80ac40d'); -INSERT INTO "LEN"."SYS_ROLE_USER" VALUES ('d555ffd6b51f4df7a18e2ef4eece1bed', 'e346e96368484c8fa7f217ce550a0186'); -INSERT INTO "LEN"."SYS_ROLE_USER" VALUES ('fb483b76457811e8bcf1309c2315f9aa', '023366f3457511e8bcf1309c2315f9aa'); +INSERT INTO "LEN"."SYS_ROLE_USER" +VALUES ('1ec421975ffe45229b48d4b9d712ff4f', 'dcb0f642fe9611e7b472201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_USER" +VALUES ('2211fec3e17c11e795ed201a068c6482', '0ea934e5e55411e7b983201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_USER" +VALUES ('3c14c2f8316741e9aaeb29d78d03e958', 'dcb0f642fe9611e7b472201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_USER" +VALUES ('a4a743bffe9711e7b472201a068c6482', '4bb891d8caf84cc6ba27e515e80ac40d'); +INSERT INTO "LEN"."SYS_ROLE_USER" +VALUES ('a4a743bffe9711e7b472201a068c6482', 'dcb0f642fe9611e7b472201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_USER" +VALUES ('acfc0e9232f54732a5d9ffe9071bf572', '2619a672e53811e7b983201a068c6482'); +INSERT INTO "LEN"."SYS_ROLE_USER" +VALUES ('acfc0e9232f54732a5d9ffe9071bf572', '4bb891d8caf84cc6ba27e515e80ac40d'); +INSERT INTO "LEN"."SYS_ROLE_USER" +VALUES ('d555ffd6b51f4df7a18e2ef4eece1bed', 'e346e96368484c8fa7f217ce550a0186'); +INSERT INTO "LEN"."SYS_ROLE_USER" +VALUES ('fb483b76457811e8bcf1309c2315f9aa', '023366f3457511e8bcf1309c2315f9aa'); -- ---------------------------- -- Table structure for SYS_USER -- ---------------------------- DROP TABLE "LEN"."SYS_USER"; -CREATE TABLE "LEN"."SYS_USER" ( -"ID" NVARCHAR2(36) NOT NULL , -"USERNAME" NVARCHAR2(64) NOT NULL , -"PASSWORD" NVARCHAR2(128) NOT NULL , -"AGE" NUMBER(11) NULL , -"EMAIL" NVARCHAR2(128) NULL , -"PHOTO" NVARCHAR2(255) NULL , -"REAL_NAME" NVARCHAR2(18) NULL , -"CREATE_BY" NVARCHAR2(32) NULL , -"UPDATE_BY" NVARCHAR2(32) NULL , -"CREATE_DATE" DATE NULL , -"UPDATE_DATE" DATE NULL , -"DEL_FLAG" NUMBER(4) NOT NULL -) -LOGGING +CREATE TABLE "LEN"."SYS_USER" +( + "ID" NVARCHAR2(36) NOT NULL, + "USERNAME" NVARCHAR2(64) NOT NULL, + "PASSWORD" NVARCHAR2(128) NOT NULL, + "AGE" NUMBER(11) NULL, + "EMAIL" NVARCHAR2(128) NULL, + "PHOTO" NVARCHAR2(255) NULL, + "REAL_NAME" NVARCHAR2(18) NULL, + "CREATE_BY" NVARCHAR2(32) NULL, + "UPDATE_BY" NVARCHAR2(32) NULL, + "CREATE_DATE" DATE NULL, + "UPDATE_DATE" DATE NULL, + "DEL_FLAG" NUMBER(4) NOT NULL +) LOGGING NOCOMPRESS NOCACHE - ; -COMMENT ON COLUMN "LEN"."SYS_USER"."DEL_FLAG" IS '0可用1封禁'; +COMMENT +ON COLUMN "LEN"."SYS_USER"."DEL_FLAG" IS '0可用1封禁'; -- ---------------------------- -- Records of SYS_USER -- ---------------------------- -INSERT INTO "LEN"."SYS_USER" VALUES ('1ec421975ffe45229b48d4b9d712ff4f', '33333', '533add1dc96c02469d50ca0ffdcb493a', '26', null, null, '33', 'acfc0e9232f54732a5d9ffe9071bf572', 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-08-20 23:52:47', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2018-12-11 22:57:16', 'YYYY-MM-DD HH24:MI:SS'), '0'); -INSERT INTO "LEN"."SYS_USER" VALUES ('2211fec3e17c11e795ed201a068c6482', 'tom', '11ac200620f90acd1fdae53716fd3de2', '41', 'lenospmiller@gmail.com', 'bd214483-7c5e-49d6-862d-de97e9de50b5.jpeg', 'Tom Curise', null, 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-01-03 15:49:48', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2018-06-19 21:15:49', 'YYYY-MM-DD HH24:MI:SS'), '0'); -INSERT INTO "LEN"."SYS_USER" VALUES ('2bf2d2db774247b99f27efb1dda29c34', '12', '123456', '10', '2345', null, '123', null, null, null, null, '0'); -INSERT INTO "LEN"."SYS_USER" VALUES ('3c14c2f8316741e9aaeb29d78d03e958', '22222', '2b8aae82f069cc838dfe8afc945f8045', '222', null, null, '222', 'acfc0e9232f54732a5d9ffe9071bf572', null, TO_DATE('2018-08-19 22:00:27', 'YYYY-MM-DD HH24:MI:SS'), null, '0'); -INSERT INTO "LEN"."SYS_USER" VALUES ('a4a743bffe9711e7b472201a068c6482', 'zxm', 'f8880ebbdbc37a936245657fa9084198', '25', '1544040976@qq.com', '662d5a3b-56aa-4bbb-bd47-194e24db1d60.jpeg', 'zxm', 'acfc0e9232f54732a5d9ffe9071bf572', 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-01-21 18:41:32', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2019-02-17 15:09:41', 'YYYY-MM-DD HH24:MI:SS'), '0'); -INSERT INTO "LEN"."SYS_USER" VALUES ('acfc0e9232f54732a5d9ffe9071bf572', 'admin', 'e0b141de1c8091be350d3fc80de66528', '24', null, '2d4c37c3-c106-4288-9c0d-e7fe1b8adc72.jpeg', '管理员', null, 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2017-12-20 16:34:06', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2018-10-01 10:21:19', 'YYYY-MM-DD HH24:MI:SS'), '0'); -INSERT INTO "LEN"."SYS_USER" VALUES ('b50d049022124b04b73605caae5ecb3b', '12', '123456', '10', '2345', null, '123', null, null, null, null, '0'); -INSERT INTO "LEN"."SYS_USER" VALUES ('c7f1a7d7018311e8a1a2201a068c6482', '666', 'c6953f608430df414ea52e8c01b81a45', '24', null, null, '666', 'acfc0e9232f54732a5d9ffe9071bf572', 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-01-25 11:56:54', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2018-06-14 23:18:51', 'YYYY-MM-DD HH24:MI:SS'), '1'); -INSERT INTO "LEN"."SYS_USER" VALUES ('d555ffd6b51f4df7a18e2ef4eece1bed', 'wangwu', 'b162011c014942eac61c478a7bfc386d', '25', null, null, '王五', 'acfc0e9232f54732a5d9ffe9071bf572', 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-06-14 23:21:17', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2018-06-19 23:09:12', 'YYYY-MM-DD HH24:MI:SS'), '0'); -INSERT INTO "LEN"."SYS_USER" VALUES ('fb483b76457811e8bcf1309c2315f9aa', 'lisi', 'f497935e5f47325399d595ef31b25e47', '20', null, null, '李四', 'acfc0e9232f54732a5d9ffe9071bf572', 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-04-21 23:30:43', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2018-06-14 23:21:50', 'YYYY-MM-DD HH24:MI:SS'), '0'); -INSERT INTO "LEN"."SYS_USER" VALUES ('fbb427b4e2764260a337f074744bc55a', '12', '123456', '10', '2345', null, '123', null, null, null, null, '0'); +INSERT INTO "LEN"."SYS_USER" +VALUES ('1ec421975ffe45229b48d4b9d712ff4f', '33333', '533add1dc96c02469d50ca0ffdcb493a', '26', null, null, '33', + 'acfc0e9232f54732a5d9ffe9071bf572', 'acfc0e9232f54732a5d9ffe9071bf572', + TO_DATE('2018-08-20 23:52:47', 'YYYY-MM-DD HH24:MI:SS'), + TO_DATE('2018-12-11 22:57:16', 'YYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "LEN"."SYS_USER" +VALUES ('2211fec3e17c11e795ed201a068c6482', 'tom', '11ac200620f90acd1fdae53716fd3de2', '41', 'lenospmiller@gmail.com', + 'bd214483-7c5e-49d6-862d-de97e9de50b5.jpeg', 'Tom Curise', null, 'acfc0e9232f54732a5d9ffe9071bf572', + TO_DATE('2018-01-03 15:49:48', 'YYYY-MM-DD HH24:MI:SS'), + TO_DATE('2018-06-19 21:15:49', 'YYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "LEN"."SYS_USER" +VALUES ('2bf2d2db774247b99f27efb1dda29c34', '12', '123456', '10', '2345', null, '123', null, null, null, null, '0'); +INSERT INTO "LEN"."SYS_USER" +VALUES ('3c14c2f8316741e9aaeb29d78d03e958', '22222', '2b8aae82f069cc838dfe8afc945f8045', '222', null, null, '222', + 'acfc0e9232f54732a5d9ffe9071bf572', null, TO_DATE('2018-08-19 22:00:27', 'YYYY-MM-DD HH24:MI:SS'), null, '0'); +INSERT INTO "LEN"."SYS_USER" +VALUES ('a4a743bffe9711e7b472201a068c6482', 'zxm', 'f8880ebbdbc37a936245657fa9084198', '25', '1544040976@qq.com', + '662d5a3b-56aa-4bbb-bd47-194e24db1d60.jpeg', 'zxm', 'acfc0e9232f54732a5d9ffe9071bf572', + 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-01-21 18:41:32', 'YYYY-MM-DD HH24:MI:SS'), + TO_DATE('2019-02-17 15:09:41', 'YYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "LEN"."SYS_USER" +VALUES ('acfc0e9232f54732a5d9ffe9071bf572', 'admin', 'e0b141de1c8091be350d3fc80de66528', '24', null, + '2d4c37c3-c106-4288-9c0d-e7fe1b8adc72.jpeg', '管理员', null, 'acfc0e9232f54732a5d9ffe9071bf572', + TO_DATE('2017-12-20 16:34:06', 'YYYY-MM-DD HH24:MI:SS'), + TO_DATE('2018-10-01 10:21:19', 'YYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "LEN"."SYS_USER" +VALUES ('b50d049022124b04b73605caae5ecb3b', '12', '123456', '10', '2345', null, '123', null, null, null, null, '0'); +INSERT INTO "LEN"."SYS_USER" +VALUES ('c7f1a7d7018311e8a1a2201a068c6482', '666', 'c6953f608430df414ea52e8c01b81a45', '24', null, null, '666', + 'acfc0e9232f54732a5d9ffe9071bf572', 'acfc0e9232f54732a5d9ffe9071bf572', + TO_DATE('2018-01-25 11:56:54', 'YYYY-MM-DD HH24:MI:SS'), + TO_DATE('2018-06-14 23:18:51', 'YYYY-MM-DD HH24:MI:SS'), '1'); +INSERT INTO "LEN"."SYS_USER" +VALUES ('d555ffd6b51f4df7a18e2ef4eece1bed', 'wangwu', 'b162011c014942eac61c478a7bfc386d', '25', null, null, '王五', + 'acfc0e9232f54732a5d9ffe9071bf572', 'acfc0e9232f54732a5d9ffe9071bf572', + TO_DATE('2018-06-14 23:21:17', 'YYYY-MM-DD HH24:MI:SS'), + TO_DATE('2018-06-19 23:09:12', 'YYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "LEN"."SYS_USER" +VALUES ('fb483b76457811e8bcf1309c2315f9aa', 'lisi', 'f497935e5f47325399d595ef31b25e47', '20', null, null, '李四', + 'acfc0e9232f54732a5d9ffe9071bf572', 'acfc0e9232f54732a5d9ffe9071bf572', + TO_DATE('2018-04-21 23:30:43', 'YYYY-MM-DD HH24:MI:SS'), + TO_DATE('2018-06-14 23:21:50', 'YYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "LEN"."SYS_USER" +VALUES ('fbb427b4e2764260a337f074744bc55a', '12', '123456', '10', '2345', null, '123', null, null, null, null, '0'); -- ---------------------------- -- Table structure for USER_LEAVE -- ---------------------------- DROP TABLE "LEN"."USER_LEAVE"; -CREATE TABLE "LEN"."USER_LEAVE" ( -"ID" NVARCHAR2(32) NOT NULL , -"USER_ID" NVARCHAR2(32) NOT NULL , -"USER_NAME" NVARCHAR2(18) NULL , -"BEGIN_TIME" DATE NULL , -"END_TIME" DATE NULL , -"REASON" NVARCHAR2(255) NULL , -"DAYS" NUMBER(11) NULL , -"PROCESS_INSTANCE_ID" NVARCHAR2(32) NULL , -"STATUS" NVARCHAR2(64) NULL , -"CREATE_DATE" DATE NULL , -"CREATE_BY" NVARCHAR2(32) NULL , -"UPDATE_DATE" DATE NULL , -"UPDATE_BY" NVARCHAR2(32) NULL , -"TASK_NAME" NVARCHAR2(255) NULL , -"URLPATH" NVARCHAR2(255) NULL , -"SUBMITTIMES" NUMBER(11) NULL -) -LOGGING +CREATE TABLE "LEN"."USER_LEAVE" +( + "ID" NVARCHAR2(32) NOT NULL, + "USER_ID" NVARCHAR2(32) NOT NULL, + "USER_NAME" NVARCHAR2(18) NULL, + "BEGIN_TIME" DATE NULL, + "END_TIME" DATE NULL, + "REASON" NVARCHAR2(255) NULL, + "DAYS" NUMBER(11) NULL, + "PROCESS_INSTANCE_ID" NVARCHAR2(32) NULL, + "STATUS" NVARCHAR2(64) NULL, + "CREATE_DATE" DATE NULL, + "CREATE_BY" NVARCHAR2(32) NULL, + "UPDATE_DATE" DATE NULL, + "UPDATE_BY" NVARCHAR2(32) NULL, + "TASK_NAME" NVARCHAR2(255) NULL, + "URLPATH" NVARCHAR2(255) NULL, + "SUBMITTIMES" NUMBER(11) NULL +) LOGGING NOCOMPRESS NOCACHE - ; -- ---------------------------- -- Records of USER_LEAVE -- ---------------------------- -INSERT INTO "LEN"."USER_LEAVE" VALUES ('25e601c9ba9a43d38dcee96ef7ec2066', 'a4a743bffe9711e7b472201a068c6482', 'zxm', TO_DATE('2019-02-17 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2019-02-18 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), '请假11111122', '3', '2617', null, null, null, null, null, null, '/leave/readOnlyLeave/25e601c9ba9a43d38dcee96ef7ec2066', '1'); -INSERT INTO "LEN"."USER_LEAVE" VALUES ('34ef7e4ff58044c6b6ed3d303968e2d4', 'a4a743bffe9711e7b472201a068c6482', 'zxm', TO_DATE('2019-02-17 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2019-02-18 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), '请假1234', '3', '2641', null, null, null, null, null, null, '/leave/readOnlyLeave/34ef7e4ff58044c6b6ed3d303968e2d4', '1'); -INSERT INTO "LEN"."USER_LEAVE" VALUES ('4d5cc5e5bd5642569a4b0b9509597f11', 'a4a743bffe9711e7b472201a068c6482', 'zxm', TO_DATE('2019-02-17 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2019-02-18 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), '请假1111', '3', '2678', null, null, null, null, null, null, '/leave/readOnlyLeave/4d5cc5e5bd5642569a4b0b9509597f11', '1'); -INSERT INTO "LEN"."USER_LEAVE" VALUES ('5da09b45283b4720b0026e41a318df56', 'a4a743bffe9711e7b472201a068c6482', 'zxm', TO_DATE('2019-02-17 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2019-02-18 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), '请假11111', '3', '2589', null, null, null, null, null, null, '/leave/readOnlyLeave/5da09b45283b4720b0026e41a318df56', '1'); -INSERT INTO "LEN"."USER_LEAVE" VALUES ('870c3774dacb4640935824398bad686a', 'a4a743bffe9711e7b472201a068c6482', 'zxm', TO_DATE('2019-02-17 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2019-02-18 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), '123', '3', '2665', null, null, null, null, null, null, '/leave/readOnlyLeave/870c3774dacb4640935824398bad686a', '1'); -INSERT INTO "LEN"."USER_LEAVE" VALUES ('89f445cbe3334a458a412691170d1e11', 'a4a743bffe9711e7b472201a068c6482', 'zxm', TO_DATE('2018-07-19 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2018-07-25 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), '2222', '3', '277535', null, null, null, null, null, null, '/leave/readOnlyLeave/89f445cbe3334a458a412691170d1e11', '1'); -INSERT INTO "LEN"."USER_LEAVE" VALUES ('96d24b30e2c04c3b8da030dd2c066cc9', 'a4a743bffe9711e7b472201a068c6482', 'zxm', TO_DATE('2019-02-17 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2019-02-18 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), '轻机枪111', '3', '2576', null, null, null, null, null, null, '/leave/readOnlyLeave/96d24b30e2c04c3b8da030dd2c066cc9', '1'); -INSERT INTO "LEN"."USER_LEAVE" VALUES ('b43d3d08bbb445ec9ba9ce10eac1985d', 'acfc0e9232f54732a5d9ffe9071bf572', 'admin', TO_DATE('2019-02-16 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2019-02-17 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), '111', '3', '302501', null, null, null, null, null, null, '/leave/readOnlyLeave/b43d3d08bbb445ec9ba9ce10eac1985d', '1'); -INSERT INTO "LEN"."USER_LEAVE" VALUES ('be7055719798461d93c3aa635c309bdc', 'a4a743bffe9711e7b472201a068c6482', 'zxm', TO_DATE('2018-07-14 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2018-07-17 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), '111', '3', '277505', null, null, null, null, null, null, '/leave/readOnlyLeave/be7055719798461d93c3aa635c309bdc', '1'); -INSERT INTO "LEN"."USER_LEAVE" VALUES ('caeae3400ee14e96a3b7c27359258111', 'a4a743bffe9711e7b472201a068c6482', 'zxm', TO_DATE('2019-02-17 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2019-02-19 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), '阿斯蒂芬', '3', '2691', null, null, null, null, null, null, '/leave/readOnlyLeave/caeae3400ee14e96a3b7c27359258111', '1'); +INSERT INTO "LEN"."USER_LEAVE" +VALUES ('25e601c9ba9a43d38dcee96ef7ec2066', 'a4a743bffe9711e7b472201a068c6482', 'zxm', + TO_DATE('2019-02-17 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), + TO_DATE('2019-02-18 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), '请假11111122', '3', '2617', null, null, null, null, + null, null, '/leave/readOnlyLeave/25e601c9ba9a43d38dcee96ef7ec2066', '1'); +INSERT INTO "LEN"."USER_LEAVE" +VALUES ('34ef7e4ff58044c6b6ed3d303968e2d4', 'a4a743bffe9711e7b472201a068c6482', 'zxm', + TO_DATE('2019-02-17 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), + TO_DATE('2019-02-18 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), '请假1234', '3', '2641', null, null, null, null, null, + null, '/leave/readOnlyLeave/34ef7e4ff58044c6b6ed3d303968e2d4', '1'); +INSERT INTO "LEN"."USER_LEAVE" +VALUES ('4d5cc5e5bd5642569a4b0b9509597f11', 'a4a743bffe9711e7b472201a068c6482', 'zxm', + TO_DATE('2019-02-17 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), + TO_DATE('2019-02-18 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), '请假1111', '3', '2678', null, null, null, null, null, + null, '/leave/readOnlyLeave/4d5cc5e5bd5642569a4b0b9509597f11', '1'); +INSERT INTO "LEN"."USER_LEAVE" +VALUES ('5da09b45283b4720b0026e41a318df56', 'a4a743bffe9711e7b472201a068c6482', 'zxm', + TO_DATE('2019-02-17 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), + TO_DATE('2019-02-18 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), '请假11111', '3', '2589', null, null, null, null, null, + null, '/leave/readOnlyLeave/5da09b45283b4720b0026e41a318df56', '1'); +INSERT INTO "LEN"."USER_LEAVE" +VALUES ('870c3774dacb4640935824398bad686a', 'a4a743bffe9711e7b472201a068c6482', 'zxm', + TO_DATE('2019-02-17 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), + TO_DATE('2019-02-18 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), '123', '3', '2665', null, null, null, null, null, null, + '/leave/readOnlyLeave/870c3774dacb4640935824398bad686a', '1'); +INSERT INTO "LEN"."USER_LEAVE" +VALUES ('89f445cbe3334a458a412691170d1e11', 'a4a743bffe9711e7b472201a068c6482', 'zxm', + TO_DATE('2018-07-19 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), + TO_DATE('2018-07-25 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), '2222', '3', '277535', null, null, null, null, null, + null, '/leave/readOnlyLeave/89f445cbe3334a458a412691170d1e11', '1'); +INSERT INTO "LEN"."USER_LEAVE" +VALUES ('96d24b30e2c04c3b8da030dd2c066cc9', 'a4a743bffe9711e7b472201a068c6482', 'zxm', + TO_DATE('2019-02-17 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), + TO_DATE('2019-02-18 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), '轻机枪111', '3', '2576', null, null, null, null, null, + null, '/leave/readOnlyLeave/96d24b30e2c04c3b8da030dd2c066cc9', '1'); +INSERT INTO "LEN"."USER_LEAVE" +VALUES ('b43d3d08bbb445ec9ba9ce10eac1985d', 'acfc0e9232f54732a5d9ffe9071bf572', 'admin', + TO_DATE('2019-02-16 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), + TO_DATE('2019-02-17 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), '111', '3', '302501', null, null, null, null, null, + null, '/leave/readOnlyLeave/b43d3d08bbb445ec9ba9ce10eac1985d', '1'); +INSERT INTO "LEN"."USER_LEAVE" +VALUES ('be7055719798461d93c3aa635c309bdc', 'a4a743bffe9711e7b472201a068c6482', 'zxm', + TO_DATE('2018-07-14 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), + TO_DATE('2018-07-17 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), '111', '3', '277505', null, null, null, null, null, + null, '/leave/readOnlyLeave/be7055719798461d93c3aa635c309bdc', '1'); +INSERT INTO "LEN"."USER_LEAVE" +VALUES ('caeae3400ee14e96a3b7c27359258111', 'a4a743bffe9711e7b472201a068c6482', 'zxm', + TO_DATE('2019-02-17 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), + TO_DATE('2019-02-19 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), '阿斯蒂芬', '3', '2691', null, null, null, null, null, + null, '/leave/readOnlyLeave/caeae3400ee14e96a3b7c27359258111', '1'); -- ---------------------------- -- Sequence structure for ACT_EVT_LOG_SEQ -- ---------------------------- DROP SEQUENCE "LEN"."ACT_EVT_LOG_SEQ"; CREATE SEQUENCE "LEN"."ACT_EVT_LOG_SEQ" - INCREMENT BY 1 - MINVALUE 1 - MAXVALUE 9999999999999999999999999999 - START WITH 1 - CACHE 20; + INCREMENT BY 1 + MINVALUE 1 + MAXVALUE 9999999999999999999999999999 + START WITH 1 CACHE 20; -- ---------------------------- -- Indexes structure for table ACT_ASSIGNEE @@ -1306,14 +1629,18 @@ CREATE SEQUENCE "LEN"."ACT_EVT_LOG_SEQ" -- ---------------------------- -- Checks structure for table ACT_ASSIGNEE -- ---------------------------- -ALTER TABLE "LEN"."ACT_ASSIGNEE" ADD CHECK ("ID" IS NOT NULL); -ALTER TABLE "LEN"."ACT_ASSIGNEE" ADD CHECK ("SID" IS NOT NULL); -ALTER TABLE "LEN"."ACT_ASSIGNEE" ADD CHECK ("ASSIGNEE_TYPE" IS NOT NULL); +ALTER TABLE "LEN"."ACT_ASSIGNEE" + ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "LEN"."ACT_ASSIGNEE" + ADD CHECK ("SID" IS NOT NULL); +ALTER TABLE "LEN"."ACT_ASSIGNEE" + ADD CHECK ("ASSIGNEE_TYPE" IS NOT NULL); -- ---------------------------- -- Primary Key structure for table ACT_ASSIGNEE -- ---------------------------- -ALTER TABLE "LEN"."ACT_ASSIGNEE" ADD PRIMARY KEY ("ID"); +ALTER TABLE "LEN"."ACT_ASSIGNEE" + ADD PRIMARY KEY ("ID"); -- ---------------------------- -- Indexes structure for table ACT_EVT_LOG @@ -1322,30 +1649,33 @@ ALTER TABLE "LEN"."ACT_ASSIGNEE" ADD PRIMARY KEY ("ID"); -- ---------------------------- -- Checks structure for table ACT_EVT_LOG -- ---------------------------- -ALTER TABLE "LEN"."ACT_EVT_LOG" ADD CHECK ("TIME_STAMP_" IS NOT NULL); +ALTER TABLE "LEN"."ACT_EVT_LOG" + ADD CHECK ("TIME_STAMP_" IS NOT NULL); -- ---------------------------- -- Primary Key structure for table ACT_EVT_LOG -- ---------------------------- -ALTER TABLE "LEN"."ACT_EVT_LOG" ADD PRIMARY KEY ("LOG_NR_"); +ALTER TABLE "LEN"."ACT_EVT_LOG" + ADD PRIMARY KEY ("LOG_NR_"); -- ---------------------------- -- Indexes structure for table ACT_GE_BYTEARRAY -- ---------------------------- CREATE INDEX "LEN"."ACT_IDX_BYTEAR_DEPL" -ON "LEN"."ACT_GE_BYTEARRAY" ("DEPLOYMENT_ID_" ASC) -LOGGING + ON "LEN"."ACT_GE_BYTEARRAY" ("DEPLOYMENT_ID_" ASC) LOGGING VISIBLE; -- ---------------------------- -- Checks structure for table ACT_GE_BYTEARRAY -- ---------------------------- -ALTER TABLE "LEN"."ACT_GE_BYTEARRAY" ADD CHECK (GENERATED_ IN (1,0)); +ALTER TABLE "LEN"."ACT_GE_BYTEARRAY" + ADD CHECK (GENERATED_ IN (1, 0)); -- ---------------------------- -- Primary Key structure for table ACT_GE_BYTEARRAY -- ---------------------------- -ALTER TABLE "LEN"."ACT_GE_BYTEARRAY" ADD PRIMARY KEY ("ID_"); +ALTER TABLE "LEN"."ACT_GE_BYTEARRAY" + ADD PRIMARY KEY ("ID_"); -- ---------------------------- -- Indexes structure for table ACT_GE_PROPERTY @@ -1354,43 +1684,48 @@ ALTER TABLE "LEN"."ACT_GE_BYTEARRAY" ADD PRIMARY KEY ("ID_"); -- ---------------------------- -- Primary Key structure for table ACT_GE_PROPERTY -- ---------------------------- -ALTER TABLE "LEN"."ACT_GE_PROPERTY" ADD PRIMARY KEY ("NAME_"); +ALTER TABLE "LEN"."ACT_GE_PROPERTY" + ADD PRIMARY KEY ("NAME_"); -- ---------------------------- -- Indexes structure for table ACT_HI_ACTINST -- ---------------------------- CREATE INDEX "LEN"."ACT_IDX_HI_ACT_INST_END" -ON "LEN"."ACT_HI_ACTINST" ("END_TIME_" ASC) -LOGGING + ON "LEN"."ACT_HI_ACTINST" ("END_TIME_" ASC) LOGGING VISIBLE; CREATE INDEX "LEN"."ACT_IDX_HI_ACT_INST_EXEC" -ON "LEN"."ACT_HI_ACTINST" ("EXECUTION_ID_" ASC, "ACT_ID_" ASC) -LOGGING + ON "LEN"."ACT_HI_ACTINST" ("EXECUTION_ID_" ASC, "ACT_ID_" ASC) LOGGING VISIBLE; CREATE INDEX "LEN"."ACT_IDX_HI_ACT_INST_PROCINST" -ON "LEN"."ACT_HI_ACTINST" ("PROC_INST_ID_" ASC, "ACT_ID_" ASC) -LOGGING + ON "LEN"."ACT_HI_ACTINST" ("PROC_INST_ID_" ASC, "ACT_ID_" ASC) LOGGING VISIBLE; CREATE INDEX "LEN"."ACT_IDX_HI_ACT_INST_START" -ON "LEN"."ACT_HI_ACTINST" ("START_TIME_" ASC) -LOGGING + ON "LEN"."ACT_HI_ACTINST" ("START_TIME_" ASC) LOGGING VISIBLE; -- ---------------------------- -- Checks structure for table ACT_HI_ACTINST -- ---------------------------- -ALTER TABLE "LEN"."ACT_HI_ACTINST" ADD CHECK ("ID_" IS NOT NULL); -ALTER TABLE "LEN"."ACT_HI_ACTINST" ADD CHECK ("PROC_DEF_ID_" IS NOT NULL); -ALTER TABLE "LEN"."ACT_HI_ACTINST" ADD CHECK ("PROC_INST_ID_" IS NOT NULL); -ALTER TABLE "LEN"."ACT_HI_ACTINST" ADD CHECK ("EXECUTION_ID_" IS NOT NULL); -ALTER TABLE "LEN"."ACT_HI_ACTINST" ADD CHECK ("ACT_ID_" IS NOT NULL); -ALTER TABLE "LEN"."ACT_HI_ACTINST" ADD CHECK ("ACT_TYPE_" IS NOT NULL); -ALTER TABLE "LEN"."ACT_HI_ACTINST" ADD CHECK ("START_TIME_" IS NOT NULL); +ALTER TABLE "LEN"."ACT_HI_ACTINST" + ADD CHECK ("ID_" IS NOT NULL); +ALTER TABLE "LEN"."ACT_HI_ACTINST" + ADD CHECK ("PROC_DEF_ID_" IS NOT NULL); +ALTER TABLE "LEN"."ACT_HI_ACTINST" + ADD CHECK ("PROC_INST_ID_" IS NOT NULL); +ALTER TABLE "LEN"."ACT_HI_ACTINST" + ADD CHECK ("EXECUTION_ID_" IS NOT NULL); +ALTER TABLE "LEN"."ACT_HI_ACTINST" + ADD CHECK ("ACT_ID_" IS NOT NULL); +ALTER TABLE "LEN"."ACT_HI_ACTINST" + ADD CHECK ("ACT_TYPE_" IS NOT NULL); +ALTER TABLE "LEN"."ACT_HI_ACTINST" + ADD CHECK ("START_TIME_" IS NOT NULL); -- ---------------------------- -- Primary Key structure for table ACT_HI_ACTINST -- ---------------------------- -ALTER TABLE "LEN"."ACT_HI_ACTINST" ADD PRIMARY KEY ("ID_"); +ALTER TABLE "LEN"."ACT_HI_ACTINST" + ADD PRIMARY KEY ("ID_"); -- ---------------------------- -- Indexes structure for table ACT_HI_ATTACHMENT @@ -1399,12 +1734,14 @@ ALTER TABLE "LEN"."ACT_HI_ACTINST" ADD PRIMARY KEY ("ID_"); -- ---------------------------- -- Checks structure for table ACT_HI_ATTACHMENT -- ---------------------------- -ALTER TABLE "LEN"."ACT_HI_ATTACHMENT" ADD CHECK ("ID_" IS NOT NULL); +ALTER TABLE "LEN"."ACT_HI_ATTACHMENT" + ADD CHECK ("ID_" IS NOT NULL); -- ---------------------------- -- Primary Key structure for table ACT_HI_ATTACHMENT -- ---------------------------- -ALTER TABLE "LEN"."ACT_HI_ATTACHMENT" ADD PRIMARY KEY ("ID_"); +ALTER TABLE "LEN"."ACT_HI_ATTACHMENT" + ADD PRIMARY KEY ("ID_"); -- ---------------------------- -- Indexes structure for table ACT_HI_COMMENT @@ -1413,147 +1750,154 @@ ALTER TABLE "LEN"."ACT_HI_ATTACHMENT" ADD PRIMARY KEY ("ID_"); -- ---------------------------- -- Checks structure for table ACT_HI_COMMENT -- ---------------------------- -ALTER TABLE "LEN"."ACT_HI_COMMENT" ADD CHECK ("ID_" IS NOT NULL); -ALTER TABLE "LEN"."ACT_HI_COMMENT" ADD CHECK ("TIME_" IS NOT NULL); +ALTER TABLE "LEN"."ACT_HI_COMMENT" + ADD CHECK ("ID_" IS NOT NULL); +ALTER TABLE "LEN"."ACT_HI_COMMENT" + ADD CHECK ("TIME_" IS NOT NULL); -- ---------------------------- -- Primary Key structure for table ACT_HI_COMMENT -- ---------------------------- -ALTER TABLE "LEN"."ACT_HI_COMMENT" ADD PRIMARY KEY ("ID_"); +ALTER TABLE "LEN"."ACT_HI_COMMENT" + ADD PRIMARY KEY ("ID_"); -- ---------------------------- -- Indexes structure for table ACT_HI_DETAIL -- ---------------------------- CREATE INDEX "LEN"."ACT_IDX_HI_DETAIL_ACT_INST" -ON "LEN"."ACT_HI_DETAIL" ("ACT_INST_ID_" ASC) -LOGGING + ON "LEN"."ACT_HI_DETAIL" ("ACT_INST_ID_" ASC) LOGGING VISIBLE; CREATE INDEX "LEN"."ACT_IDX_HI_DETAIL_NAME" -ON "LEN"."ACT_HI_DETAIL" ("NAME_" ASC) -LOGGING + ON "LEN"."ACT_HI_DETAIL" ("NAME_" ASC) LOGGING VISIBLE; CREATE INDEX "LEN"."ACT_IDX_HI_DETAIL_PROC_INST" -ON "LEN"."ACT_HI_DETAIL" ("PROC_INST_ID_" ASC) -LOGGING + ON "LEN"."ACT_HI_DETAIL" ("PROC_INST_ID_" ASC) LOGGING VISIBLE; CREATE INDEX "LEN"."ACT_IDX_HI_DETAIL_TASK_ID" -ON "LEN"."ACT_HI_DETAIL" ("TASK_ID_" ASC) -LOGGING + ON "LEN"."ACT_HI_DETAIL" ("TASK_ID_" ASC) LOGGING VISIBLE; CREATE INDEX "LEN"."ACT_IDX_HI_DETAIL_TIME" -ON "LEN"."ACT_HI_DETAIL" ("TIME_" ASC) -LOGGING + ON "LEN"."ACT_HI_DETAIL" ("TIME_" ASC) LOGGING VISIBLE; -- ---------------------------- -- Checks structure for table ACT_HI_DETAIL -- ---------------------------- -ALTER TABLE "LEN"."ACT_HI_DETAIL" ADD CHECK ("ID_" IS NOT NULL); -ALTER TABLE "LEN"."ACT_HI_DETAIL" ADD CHECK ("TYPE_" IS NOT NULL); -ALTER TABLE "LEN"."ACT_HI_DETAIL" ADD CHECK ("NAME_" IS NOT NULL); -ALTER TABLE "LEN"."ACT_HI_DETAIL" ADD CHECK ("TIME_" IS NOT NULL); +ALTER TABLE "LEN"."ACT_HI_DETAIL" + ADD CHECK ("ID_" IS NOT NULL); +ALTER TABLE "LEN"."ACT_HI_DETAIL" + ADD CHECK ("TYPE_" IS NOT NULL); +ALTER TABLE "LEN"."ACT_HI_DETAIL" + ADD CHECK ("NAME_" IS NOT NULL); +ALTER TABLE "LEN"."ACT_HI_DETAIL" + ADD CHECK ("TIME_" IS NOT NULL); -- ---------------------------- -- Primary Key structure for table ACT_HI_DETAIL -- ---------------------------- -ALTER TABLE "LEN"."ACT_HI_DETAIL" ADD PRIMARY KEY ("ID_"); +ALTER TABLE "LEN"."ACT_HI_DETAIL" + ADD PRIMARY KEY ("ID_"); -- ---------------------------- -- Indexes structure for table ACT_HI_IDENTITYLINK -- ---------------------------- CREATE INDEX "LEN"."ACT_IDX_HI_IDENT_LNK_PROCINST" -ON "LEN"."ACT_HI_IDENTITYLINK" ("PROC_INST_ID_" ASC) -LOGGING + ON "LEN"."ACT_HI_IDENTITYLINK" ("PROC_INST_ID_" ASC) LOGGING VISIBLE; CREATE INDEX "LEN"."ACT_IDX_HI_IDENT_LNK_TASK" -ON "LEN"."ACT_HI_IDENTITYLINK" ("TASK_ID_" ASC) -LOGGING + ON "LEN"."ACT_HI_IDENTITYLINK" ("TASK_ID_" ASC) LOGGING VISIBLE; CREATE INDEX "LEN"."ACT_IDX_HI_IDENT_LNK_USER" -ON "LEN"."ACT_HI_IDENTITYLINK" ("USER_ID_" ASC) -LOGGING + ON "LEN"."ACT_HI_IDENTITYLINK" ("USER_ID_" ASC) LOGGING VISIBLE; -- ---------------------------- -- Primary Key structure for table ACT_HI_IDENTITYLINK -- ---------------------------- -ALTER TABLE "LEN"."ACT_HI_IDENTITYLINK" ADD PRIMARY KEY ("ID_"); +ALTER TABLE "LEN"."ACT_HI_IDENTITYLINK" + ADD PRIMARY KEY ("ID_"); -- ---------------------------- -- Indexes structure for table ACT_HI_PROCINST -- ---------------------------- CREATE INDEX "LEN"."ACT_IDX_HI_PRO_INST_END" -ON "LEN"."ACT_HI_PROCINST" ("END_TIME_" ASC) -LOGGING + ON "LEN"."ACT_HI_PROCINST" ("END_TIME_" ASC) LOGGING VISIBLE; CREATE INDEX "LEN"."ACT_IDX_HI_PRO_I_BUSKEY" -ON "LEN"."ACT_HI_PROCINST" ("BUSINESS_KEY_" ASC) -LOGGING + ON "LEN"."ACT_HI_PROCINST" ("BUSINESS_KEY_" ASC) LOGGING VISIBLE; -- ---------------------------- -- Uniques structure for table ACT_HI_PROCINST -- ---------------------------- -ALTER TABLE "LEN"."ACT_HI_PROCINST" ADD UNIQUE ("PROC_INST_ID_"); +ALTER TABLE "LEN"."ACT_HI_PROCINST" + ADD UNIQUE ("PROC_INST_ID_"); -- ---------------------------- -- Checks structure for table ACT_HI_PROCINST -- ---------------------------- -ALTER TABLE "LEN"."ACT_HI_PROCINST" ADD CHECK ("ID_" IS NOT NULL); -ALTER TABLE "LEN"."ACT_HI_PROCINST" ADD CHECK ("PROC_INST_ID_" IS NOT NULL); -ALTER TABLE "LEN"."ACT_HI_PROCINST" ADD CHECK ("PROC_DEF_ID_" IS NOT NULL); -ALTER TABLE "LEN"."ACT_HI_PROCINST" ADD CHECK ("START_TIME_" IS NOT NULL); +ALTER TABLE "LEN"."ACT_HI_PROCINST" + ADD CHECK ("ID_" IS NOT NULL); +ALTER TABLE "LEN"."ACT_HI_PROCINST" + ADD CHECK ("PROC_INST_ID_" IS NOT NULL); +ALTER TABLE "LEN"."ACT_HI_PROCINST" + ADD CHECK ("PROC_DEF_ID_" IS NOT NULL); +ALTER TABLE "LEN"."ACT_HI_PROCINST" + ADD CHECK ("START_TIME_" IS NOT NULL); -- ---------------------------- -- Primary Key structure for table ACT_HI_PROCINST -- ---------------------------- -ALTER TABLE "LEN"."ACT_HI_PROCINST" ADD PRIMARY KEY ("ID_"); +ALTER TABLE "LEN"."ACT_HI_PROCINST" + ADD PRIMARY KEY ("ID_"); -- ---------------------------- -- Indexes structure for table ACT_HI_TASKINST -- ---------------------------- CREATE INDEX "LEN"."ACT_IDX_HI_TASK_INST_PROCINST" -ON "LEN"."ACT_HI_TASKINST" ("PROC_INST_ID_" ASC) -LOGGING + ON "LEN"."ACT_HI_TASKINST" ("PROC_INST_ID_" ASC) LOGGING VISIBLE; -- ---------------------------- -- Checks structure for table ACT_HI_TASKINST -- ---------------------------- -ALTER TABLE "LEN"."ACT_HI_TASKINST" ADD CHECK ("ID_" IS NOT NULL); -ALTER TABLE "LEN"."ACT_HI_TASKINST" ADD CHECK ("START_TIME_" IS NOT NULL); +ALTER TABLE "LEN"."ACT_HI_TASKINST" + ADD CHECK ("ID_" IS NOT NULL); +ALTER TABLE "LEN"."ACT_HI_TASKINST" + ADD CHECK ("START_TIME_" IS NOT NULL); -- ---------------------------- -- Primary Key structure for table ACT_HI_TASKINST -- ---------------------------- -ALTER TABLE "LEN"."ACT_HI_TASKINST" ADD PRIMARY KEY ("ID_"); +ALTER TABLE "LEN"."ACT_HI_TASKINST" + ADD PRIMARY KEY ("ID_"); -- ---------------------------- -- Indexes structure for table ACT_HI_VARINST -- ---------------------------- CREATE INDEX "LEN"."ACT_IDX_HI_PROCVAR_NAME_TYPE" -ON "LEN"."ACT_HI_VARINST" ("NAME_" ASC, "VAR_TYPE_" ASC) -LOGGING + ON "LEN"."ACT_HI_VARINST" ("NAME_" ASC, "VAR_TYPE_" ASC) LOGGING VISIBLE; CREATE INDEX "LEN"."ACT_IDX_HI_PROCVAR_PROC_INST" -ON "LEN"."ACT_HI_VARINST" ("PROC_INST_ID_" ASC) -LOGGING + ON "LEN"."ACT_HI_VARINST" ("PROC_INST_ID_" ASC) LOGGING VISIBLE; CREATE INDEX "LEN"."ACT_IDX_HI_PROCVAR_TASK_ID" -ON "LEN"."ACT_HI_VARINST" ("TASK_ID_" ASC) -LOGGING + ON "LEN"."ACT_HI_VARINST" ("TASK_ID_" ASC) LOGGING VISIBLE; -- ---------------------------- -- Checks structure for table ACT_HI_VARINST -- ---------------------------- -ALTER TABLE "LEN"."ACT_HI_VARINST" ADD CHECK ("ID_" IS NOT NULL); -ALTER TABLE "LEN"."ACT_HI_VARINST" ADD CHECK ("NAME_" IS NOT NULL); +ALTER TABLE "LEN"."ACT_HI_VARINST" + ADD CHECK ("ID_" IS NOT NULL); +ALTER TABLE "LEN"."ACT_HI_VARINST" + ADD CHECK ("NAME_" IS NOT NULL); -- ---------------------------- -- Primary Key structure for table ACT_HI_VARINST -- ---------------------------- -ALTER TABLE "LEN"."ACT_HI_VARINST" ADD PRIMARY KEY ("ID_"); +ALTER TABLE "LEN"."ACT_HI_VARINST" + ADD PRIMARY KEY ("ID_"); -- ---------------------------- -- Indexes structure for table ACT_ID_GROUP @@ -1562,7 +1906,8 @@ ALTER TABLE "LEN"."ACT_HI_VARINST" ADD PRIMARY KEY ("ID_"); -- ---------------------------- -- Primary Key structure for table ACT_ID_GROUP -- ---------------------------- -ALTER TABLE "LEN"."ACT_ID_GROUP" ADD PRIMARY KEY ("ID_"); +ALTER TABLE "LEN"."ACT_ID_GROUP" + ADD PRIMARY KEY ("ID_"); -- ---------------------------- -- Indexes structure for table ACT_ID_INFO @@ -1571,24 +1916,24 @@ ALTER TABLE "LEN"."ACT_ID_GROUP" ADD PRIMARY KEY ("ID_"); -- ---------------------------- -- Primary Key structure for table ACT_ID_INFO -- ---------------------------- -ALTER TABLE "LEN"."ACT_ID_INFO" ADD PRIMARY KEY ("ID_"); +ALTER TABLE "LEN"."ACT_ID_INFO" + ADD PRIMARY KEY ("ID_"); -- ---------------------------- -- Indexes structure for table ACT_ID_MEMBERSHIP -- ---------------------------- CREATE INDEX "LEN"."ACT_IDX_MEMB_GROUP" -ON "LEN"."ACT_ID_MEMBERSHIP" ("GROUP_ID_" ASC) -LOGGING + ON "LEN"."ACT_ID_MEMBERSHIP" ("GROUP_ID_" ASC) LOGGING VISIBLE; CREATE INDEX "LEN"."ACT_IDX_MEMB_USER" -ON "LEN"."ACT_ID_MEMBERSHIP" ("USER_ID_" ASC) -LOGGING + ON "LEN"."ACT_ID_MEMBERSHIP" ("USER_ID_" ASC) LOGGING VISIBLE; -- ---------------------------- -- Primary Key structure for table ACT_ID_MEMBERSHIP -- ---------------------------- -ALTER TABLE "LEN"."ACT_ID_MEMBERSHIP" ADD PRIMARY KEY ("USER_ID_", "GROUP_ID_"); +ALTER TABLE "LEN"."ACT_ID_MEMBERSHIP" + ADD PRIMARY KEY ("USER_ID_", "GROUP_ID_"); -- ---------------------------- -- Indexes structure for table ACT_ID_USER @@ -1597,35 +1942,38 @@ ALTER TABLE "LEN"."ACT_ID_MEMBERSHIP" ADD PRIMARY KEY ("USER_ID_", "GROUP_ID_"); -- ---------------------------- -- Primary Key structure for table ACT_ID_USER -- ---------------------------- -ALTER TABLE "LEN"."ACT_ID_USER" ADD PRIMARY KEY ("ID_"); +ALTER TABLE "LEN"."ACT_ID_USER" + ADD PRIMARY KEY ("ID_"); -- ---------------------------- -- Indexes structure for table ACT_PROCDEF_INFO -- ---------------------------- CREATE INDEX "LEN"."ACT_IDX_PROCDEF_INFO_JSON" -ON "LEN"."ACT_PROCDEF_INFO" ("INFO_JSON_ID_" ASC) -LOGGING + ON "LEN"."ACT_PROCDEF_INFO" ("INFO_JSON_ID_" ASC) LOGGING VISIBLE; CREATE INDEX "LEN"."ACT_IDX_PROCDEF_INFO_PROC" -ON "LEN"."ACT_PROCDEF_INFO" ("PROC_DEF_ID_" ASC) -LOGGING + ON "LEN"."ACT_PROCDEF_INFO" ("PROC_DEF_ID_" ASC) LOGGING VISIBLE; -- ---------------------------- -- Uniques structure for table ACT_PROCDEF_INFO -- ---------------------------- -ALTER TABLE "LEN"."ACT_PROCDEF_INFO" ADD UNIQUE ("PROC_DEF_ID_"); +ALTER TABLE "LEN"."ACT_PROCDEF_INFO" + ADD UNIQUE ("PROC_DEF_ID_"); -- ---------------------------- -- Checks structure for table ACT_PROCDEF_INFO -- ---------------------------- -ALTER TABLE "LEN"."ACT_PROCDEF_INFO" ADD CHECK ("ID_" IS NOT NULL); -ALTER TABLE "LEN"."ACT_PROCDEF_INFO" ADD CHECK ("PROC_DEF_ID_" IS NOT NULL); +ALTER TABLE "LEN"."ACT_PROCDEF_INFO" + ADD CHECK ("ID_" IS NOT NULL); +ALTER TABLE "LEN"."ACT_PROCDEF_INFO" + ADD CHECK ("PROC_DEF_ID_" IS NOT NULL); -- ---------------------------- -- Primary Key structure for table ACT_PROCDEF_INFO -- ---------------------------- -ALTER TABLE "LEN"."ACT_PROCDEF_INFO" ADD PRIMARY KEY ("ID_"); +ALTER TABLE "LEN"."ACT_PROCDEF_INFO" + ADD PRIMARY KEY ("ID_"); -- ---------------------------- -- Indexes structure for table ACT_RE_DEPLOYMENT @@ -1634,33 +1982,33 @@ ALTER TABLE "LEN"."ACT_PROCDEF_INFO" ADD PRIMARY KEY ("ID_"); -- ---------------------------- -- Primary Key structure for table ACT_RE_DEPLOYMENT -- ---------------------------- -ALTER TABLE "LEN"."ACT_RE_DEPLOYMENT" ADD PRIMARY KEY ("ID_"); +ALTER TABLE "LEN"."ACT_RE_DEPLOYMENT" + ADD PRIMARY KEY ("ID_"); -- ---------------------------- -- Indexes structure for table ACT_RE_MODEL -- ---------------------------- CREATE INDEX "LEN"."ACT_IDX_MODEL_DEPLOYMENT" -ON "LEN"."ACT_RE_MODEL" ("DEPLOYMENT_ID_" ASC) -LOGGING + ON "LEN"."ACT_RE_MODEL" ("DEPLOYMENT_ID_" ASC) LOGGING VISIBLE; CREATE INDEX "LEN"."ACT_IDX_MODEL_SOURCE" -ON "LEN"."ACT_RE_MODEL" ("EDITOR_SOURCE_VALUE_ID_" ASC) -LOGGING + ON "LEN"."ACT_RE_MODEL" ("EDITOR_SOURCE_VALUE_ID_" ASC) LOGGING VISIBLE; CREATE INDEX "LEN"."ACT_IDX_MODEL_SOURCE_EXTRA" -ON "LEN"."ACT_RE_MODEL" ("EDITOR_SOURCE_EXTRA_VALUE_ID_" ASC) -LOGGING + ON "LEN"."ACT_RE_MODEL" ("EDITOR_SOURCE_EXTRA_VALUE_ID_" ASC) LOGGING VISIBLE; -- ---------------------------- -- Checks structure for table ACT_RE_MODEL -- ---------------------------- -ALTER TABLE "LEN"."ACT_RE_MODEL" ADD CHECK ("ID_" IS NOT NULL); +ALTER TABLE "LEN"."ACT_RE_MODEL" + ADD CHECK ("ID_" IS NOT NULL); -- ---------------------------- -- Primary Key structure for table ACT_RE_MODEL -- ---------------------------- -ALTER TABLE "LEN"."ACT_RE_MODEL" ADD PRIMARY KEY ("ID_"); +ALTER TABLE "LEN"."ACT_RE_MODEL" + ADD PRIMARY KEY ("ID_"); -- ---------------------------- -- Indexes structure for table ACT_RE_PROCDEF @@ -1669,199 +2017,211 @@ ALTER TABLE "LEN"."ACT_RE_MODEL" ADD PRIMARY KEY ("ID_"); -- ---------------------------- -- Uniques structure for table ACT_RE_PROCDEF -- ---------------------------- -ALTER TABLE "LEN"."ACT_RE_PROCDEF" ADD UNIQUE ("KEY_", "VERSION_", "TENANT_ID_"); +ALTER TABLE "LEN"."ACT_RE_PROCDEF" + ADD UNIQUE ("KEY_", "VERSION_", "TENANT_ID_"); -- ---------------------------- -- Checks structure for table ACT_RE_PROCDEF -- ---------------------------- -ALTER TABLE "LEN"."ACT_RE_PROCDEF" ADD CHECK ("ID_" IS NOT NULL); -ALTER TABLE "LEN"."ACT_RE_PROCDEF" ADD CHECK ("KEY_" IS NOT NULL); -ALTER TABLE "LEN"."ACT_RE_PROCDEF" ADD CHECK ("VERSION_" IS NOT NULL); -ALTER TABLE "LEN"."ACT_RE_PROCDEF" ADD CHECK (HAS_START_FORM_KEY_ IN (1,0)); -ALTER TABLE "LEN"."ACT_RE_PROCDEF" ADD CHECK (HAS_GRAPHICAL_NOTATION_ IN (1,0)); +ALTER TABLE "LEN"."ACT_RE_PROCDEF" + ADD CHECK ("ID_" IS NOT NULL); +ALTER TABLE "LEN"."ACT_RE_PROCDEF" + ADD CHECK ("KEY_" IS NOT NULL); +ALTER TABLE "LEN"."ACT_RE_PROCDEF" + ADD CHECK ("VERSION_" IS NOT NULL); +ALTER TABLE "LEN"."ACT_RE_PROCDEF" + ADD CHECK (HAS_START_FORM_KEY_ IN (1, 0)); +ALTER TABLE "LEN"."ACT_RE_PROCDEF" + ADD CHECK (HAS_GRAPHICAL_NOTATION_ IN (1, 0)); -- ---------------------------- -- Primary Key structure for table ACT_RE_PROCDEF -- ---------------------------- -ALTER TABLE "LEN"."ACT_RE_PROCDEF" ADD PRIMARY KEY ("ID_"); +ALTER TABLE "LEN"."ACT_RE_PROCDEF" + ADD PRIMARY KEY ("ID_"); -- ---------------------------- -- Indexes structure for table ACT_RU_EVENT_SUBSCR -- ---------------------------- CREATE INDEX "LEN"."ACT_IDX_EVENT_SUBSCR" -ON "LEN"."ACT_RU_EVENT_SUBSCR" ("EXECUTION_ID_" ASC) -LOGGING + ON "LEN"."ACT_RU_EVENT_SUBSCR" ("EXECUTION_ID_" ASC) LOGGING VISIBLE; CREATE INDEX "LEN"."ACT_IDX_EVENT_SUBSCR_CONFIG_" -ON "LEN"."ACT_RU_EVENT_SUBSCR" ("CONFIGURATION_" ASC) -LOGGING + ON "LEN"."ACT_RU_EVENT_SUBSCR" ("CONFIGURATION_" ASC) LOGGING VISIBLE; -- ---------------------------- -- Checks structure for table ACT_RU_EVENT_SUBSCR -- ---------------------------- -ALTER TABLE "LEN"."ACT_RU_EVENT_SUBSCR" ADD CHECK ("ID_" IS NOT NULL); -ALTER TABLE "LEN"."ACT_RU_EVENT_SUBSCR" ADD CHECK ("EVENT_TYPE_" IS NOT NULL); -ALTER TABLE "LEN"."ACT_RU_EVENT_SUBSCR" ADD CHECK ("CREATED_" IS NOT NULL); +ALTER TABLE "LEN"."ACT_RU_EVENT_SUBSCR" + ADD CHECK ("ID_" IS NOT NULL); +ALTER TABLE "LEN"."ACT_RU_EVENT_SUBSCR" + ADD CHECK ("EVENT_TYPE_" IS NOT NULL); +ALTER TABLE "LEN"."ACT_RU_EVENT_SUBSCR" + ADD CHECK ("CREATED_" IS NOT NULL); -- ---------------------------- -- Primary Key structure for table ACT_RU_EVENT_SUBSCR -- ---------------------------- -ALTER TABLE "LEN"."ACT_RU_EVENT_SUBSCR" ADD PRIMARY KEY ("ID_"); +ALTER TABLE "LEN"."ACT_RU_EVENT_SUBSCR" + ADD PRIMARY KEY ("ID_"); -- ---------------------------- -- Indexes structure for table ACT_RU_EXECUTION -- ---------------------------- CREATE INDEX "LEN"."ACT_IDX_EXEC_BUSKEY" -ON "LEN"."ACT_RU_EXECUTION" ("BUSINESS_KEY_" ASC) -LOGGING + ON "LEN"."ACT_RU_EXECUTION" ("BUSINESS_KEY_" ASC) LOGGING VISIBLE; CREATE INDEX "LEN"."ACT_IDX_EXE_PARENT" -ON "LEN"."ACT_RU_EXECUTION" ("PARENT_ID_" ASC) -LOGGING + ON "LEN"."ACT_RU_EXECUTION" ("PARENT_ID_" ASC) LOGGING VISIBLE; CREATE INDEX "LEN"."ACT_IDX_EXE_PROCDEF" -ON "LEN"."ACT_RU_EXECUTION" ("PROC_DEF_ID_" ASC) -LOGGING + ON "LEN"."ACT_RU_EXECUTION" ("PROC_DEF_ID_" ASC) LOGGING VISIBLE; CREATE INDEX "LEN"."ACT_IDX_EXE_PROCINST" -ON "LEN"."ACT_RU_EXECUTION" ("PROC_INST_ID_" ASC) -LOGGING + ON "LEN"."ACT_RU_EXECUTION" ("PROC_INST_ID_" ASC) LOGGING VISIBLE; CREATE INDEX "LEN"."ACT_IDX_EXE_SUPER" -ON "LEN"."ACT_RU_EXECUTION" ("SUPER_EXEC_" ASC) -LOGGING + ON "LEN"."ACT_RU_EXECUTION" ("SUPER_EXEC_" ASC) LOGGING VISIBLE; -- ---------------------------- -- Checks structure for table ACT_RU_EXECUTION -- ---------------------------- -ALTER TABLE "LEN"."ACT_RU_EXECUTION" ADD CHECK (IS_ACTIVE_ IN (1,0)); -ALTER TABLE "LEN"."ACT_RU_EXECUTION" ADD CHECK (IS_CONCURRENT_ IN (1,0)); -ALTER TABLE "LEN"."ACT_RU_EXECUTION" ADD CHECK (IS_SCOPE_ IN (1,0)); -ALTER TABLE "LEN"."ACT_RU_EXECUTION" ADD CHECK (IS_EVENT_SCOPE_ IN (1,0)); +ALTER TABLE "LEN"."ACT_RU_EXECUTION" + ADD CHECK (IS_ACTIVE_ IN (1, 0)); +ALTER TABLE "LEN"."ACT_RU_EXECUTION" + ADD CHECK (IS_CONCURRENT_ IN (1, 0)); +ALTER TABLE "LEN"."ACT_RU_EXECUTION" + ADD CHECK (IS_SCOPE_ IN (1, 0)); +ALTER TABLE "LEN"."ACT_RU_EXECUTION" + ADD CHECK (IS_EVENT_SCOPE_ IN (1, 0)); -- ---------------------------- -- Primary Key structure for table ACT_RU_EXECUTION -- ---------------------------- -ALTER TABLE "LEN"."ACT_RU_EXECUTION" ADD PRIMARY KEY ("ID_"); +ALTER TABLE "LEN"."ACT_RU_EXECUTION" + ADD PRIMARY KEY ("ID_"); -- ---------------------------- -- Indexes structure for table ACT_RU_IDENTITYLINK -- ---------------------------- CREATE INDEX "LEN"."ACT_IDX_ATHRZ_PROCEDEF" -ON "LEN"."ACT_RU_IDENTITYLINK" ("PROC_DEF_ID_" ASC) -LOGGING + ON "LEN"."ACT_RU_IDENTITYLINK" ("PROC_DEF_ID_" ASC) LOGGING VISIBLE; CREATE INDEX "LEN"."ACT_IDX_IDENT_LNK_GROUP" -ON "LEN"."ACT_RU_IDENTITYLINK" ("GROUP_ID_" ASC) -LOGGING + ON "LEN"."ACT_RU_IDENTITYLINK" ("GROUP_ID_" ASC) LOGGING VISIBLE; CREATE INDEX "LEN"."ACT_IDX_IDENT_LNK_USER" -ON "LEN"."ACT_RU_IDENTITYLINK" ("USER_ID_" ASC) -LOGGING + ON "LEN"."ACT_RU_IDENTITYLINK" ("USER_ID_" ASC) LOGGING VISIBLE; CREATE INDEX "LEN"."ACT_IDX_IDL_PROCINST" -ON "LEN"."ACT_RU_IDENTITYLINK" ("PROC_INST_ID_" ASC) -LOGGING + ON "LEN"."ACT_RU_IDENTITYLINK" ("PROC_INST_ID_" ASC) LOGGING VISIBLE; CREATE INDEX "LEN"."ACT_IDX_TSKASS_TASK" -ON "LEN"."ACT_RU_IDENTITYLINK" ("TASK_ID_" ASC) -LOGGING + ON "LEN"."ACT_RU_IDENTITYLINK" ("TASK_ID_" ASC) LOGGING VISIBLE; -- ---------------------------- -- Primary Key structure for table ACT_RU_IDENTITYLINK -- ---------------------------- -ALTER TABLE "LEN"."ACT_RU_IDENTITYLINK" ADD PRIMARY KEY ("ID_"); +ALTER TABLE "LEN"."ACT_RU_IDENTITYLINK" + ADD PRIMARY KEY ("ID_"); -- ---------------------------- -- Indexes structure for table ACT_RU_JOB -- ---------------------------- CREATE INDEX "LEN"."ACT_IDX_JOB_EXCEPTION" -ON "LEN"."ACT_RU_JOB" ("EXCEPTION_STACK_ID_" ASC) -LOGGING + ON "LEN"."ACT_RU_JOB" ("EXCEPTION_STACK_ID_" ASC) LOGGING VISIBLE; -- ---------------------------- -- Checks structure for table ACT_RU_JOB -- ---------------------------- -ALTER TABLE "LEN"."ACT_RU_JOB" ADD CHECK ("ID_" IS NOT NULL); -ALTER TABLE "LEN"."ACT_RU_JOB" ADD CHECK ("TYPE_" IS NOT NULL); -ALTER TABLE "LEN"."ACT_RU_JOB" ADD CHECK (EXCLUSIVE_ IN (1,0)); +ALTER TABLE "LEN"."ACT_RU_JOB" + ADD CHECK ("ID_" IS NOT NULL); +ALTER TABLE "LEN"."ACT_RU_JOB" + ADD CHECK ("TYPE_" IS NOT NULL); +ALTER TABLE "LEN"."ACT_RU_JOB" + ADD CHECK (EXCLUSIVE_ IN (1, 0)); -- ---------------------------- -- Primary Key structure for table ACT_RU_JOB -- ---------------------------- -ALTER TABLE "LEN"."ACT_RU_JOB" ADD PRIMARY KEY ("ID_"); +ALTER TABLE "LEN"."ACT_RU_JOB" + ADD PRIMARY KEY ("ID_"); -- ---------------------------- -- Indexes structure for table ACT_RU_TASK -- ---------------------------- CREATE INDEX "LEN"."ACT_IDX_TASK_CREATE" -ON "LEN"."ACT_RU_TASK" ("CREATE_TIME_" ASC) -LOGGING + ON "LEN"."ACT_RU_TASK" ("CREATE_TIME_" ASC) LOGGING VISIBLE; CREATE INDEX "LEN"."ACT_IDX_TASK_EXEC" -ON "LEN"."ACT_RU_TASK" ("EXECUTION_ID_" ASC) -LOGGING + ON "LEN"."ACT_RU_TASK" ("EXECUTION_ID_" ASC) LOGGING VISIBLE; CREATE INDEX "LEN"."ACT_IDX_TASK_PROCDEF" -ON "LEN"."ACT_RU_TASK" ("PROC_DEF_ID_" ASC) -LOGGING + ON "LEN"."ACT_RU_TASK" ("PROC_DEF_ID_" ASC) LOGGING VISIBLE; CREATE INDEX "LEN"."ACT_IDX_TASK_PROCINST" -ON "LEN"."ACT_RU_TASK" ("PROC_INST_ID_" ASC) -LOGGING + ON "LEN"."ACT_RU_TASK" ("PROC_INST_ID_" ASC) LOGGING VISIBLE; -- ---------------------------- -- Primary Key structure for table ACT_RU_TASK -- ---------------------------- -ALTER TABLE "LEN"."ACT_RU_TASK" ADD PRIMARY KEY ("ID_"); +ALTER TABLE "LEN"."ACT_RU_TASK" + ADD PRIMARY KEY ("ID_"); -- ---------------------------- -- Indexes structure for table ACT_RU_VARIABLE -- ---------------------------- CREATE INDEX "LEN"."ACT_IDX_VARIABLE_TASK_ID" -ON "LEN"."ACT_RU_VARIABLE" ("TASK_ID_" ASC) -LOGGING + ON "LEN"."ACT_RU_VARIABLE" ("TASK_ID_" ASC) LOGGING VISIBLE; CREATE INDEX "LEN"."ACT_IDX_VAR_BYTEARRAY" -ON "LEN"."ACT_RU_VARIABLE" ("BYTEARRAY_ID_" ASC) -LOGGING + ON "LEN"."ACT_RU_VARIABLE" ("BYTEARRAY_ID_" ASC) LOGGING VISIBLE; CREATE INDEX "LEN"."ACT_IDX_VAR_EXE" -ON "LEN"."ACT_RU_VARIABLE" ("EXECUTION_ID_" ASC) -LOGGING + ON "LEN"."ACT_RU_VARIABLE" ("EXECUTION_ID_" ASC) LOGGING VISIBLE; CREATE INDEX "LEN"."ACT_IDX_VAR_PROCINST" -ON "LEN"."ACT_RU_VARIABLE" ("PROC_INST_ID_" ASC) -LOGGING + ON "LEN"."ACT_RU_VARIABLE" ("PROC_INST_ID_" ASC) LOGGING VISIBLE; -- ---------------------------- -- Checks structure for table ACT_RU_VARIABLE -- ---------------------------- -ALTER TABLE "LEN"."ACT_RU_VARIABLE" ADD CHECK ("ID_" IS NOT NULL); -ALTER TABLE "LEN"."ACT_RU_VARIABLE" ADD CHECK ("TYPE_" IS NOT NULL); -ALTER TABLE "LEN"."ACT_RU_VARIABLE" ADD CHECK ("NAME_" IS NOT NULL); +ALTER TABLE "LEN"."ACT_RU_VARIABLE" + ADD CHECK ("ID_" IS NOT NULL); +ALTER TABLE "LEN"."ACT_RU_VARIABLE" + ADD CHECK ("TYPE_" IS NOT NULL); +ALTER TABLE "LEN"."ACT_RU_VARIABLE" + ADD CHECK ("NAME_" IS NOT NULL); -- ---------------------------- -- Primary Key structure for table ACT_RU_VARIABLE -- ---------------------------- -ALTER TABLE "LEN"."ACT_RU_VARIABLE" ADD PRIMARY KEY ("ID_"); +ALTER TABLE "LEN"."ACT_RU_VARIABLE" + ADD PRIMARY KEY ("ID_"); -- ---------------------------- -- Checks structure for table BLOG_ARTICLE -- ---------------------------- -ALTER TABLE "LEN"."BLOG_ARTICLE" ADD CHECK ("ID" IS NOT NULL); -ALTER TABLE "LEN"."BLOG_ARTICLE" ADD CHECK ("CODE" IS NOT NULL); -ALTER TABLE "LEN"."BLOG_ARTICLE" ADD CHECK ("TITLE" IS NOT NULL); -ALTER TABLE "LEN"."BLOG_ARTICLE" ADD CHECK ("CONTENT" IS NOT NULL); -ALTER TABLE "LEN"."BLOG_ARTICLE" ADD CHECK ("READ_NUMBER" IS NOT NULL); -ALTER TABLE "LEN"."BLOG_ARTICLE" ADD CHECK ("CREATE_BY" IS NOT NULL); -ALTER TABLE "LEN"."BLOG_ARTICLE" ADD CHECK ("DEL_FLAG" IS NOT NULL); +ALTER TABLE "LEN"."BLOG_ARTICLE" + ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "LEN"."BLOG_ARTICLE" + ADD CHECK ("CODE" IS NOT NULL); +ALTER TABLE "LEN"."BLOG_ARTICLE" + ADD CHECK ("TITLE" IS NOT NULL); +ALTER TABLE "LEN"."BLOG_ARTICLE" + ADD CHECK ("CONTENT" IS NOT NULL); +ALTER TABLE "LEN"."BLOG_ARTICLE" + ADD CHECK ("READ_NUMBER" IS NOT NULL); +ALTER TABLE "LEN"."BLOG_ARTICLE" + ADD CHECK ("CREATE_BY" IS NOT NULL); +ALTER TABLE "LEN"."BLOG_ARTICLE" + ADD CHECK ("DEL_FLAG" IS NOT NULL); -- ---------------------------- -- Indexes structure for table BLOG_ARTICLE_CATEGORY @@ -1870,14 +2230,18 @@ ALTER TABLE "LEN"."BLOG_ARTICLE" ADD CHECK ("DEL_FLAG" IS NOT NULL); -- ---------------------------- -- Checks structure for table BLOG_ARTICLE_CATEGORY -- ---------------------------- -ALTER TABLE "LEN"."BLOG_ARTICLE_CATEGORY" ADD CHECK ("ID" IS NOT NULL); -ALTER TABLE "LEN"."BLOG_ARTICLE_CATEGORY" ADD CHECK ("ARTICLE_ID" IS NOT NULL); -ALTER TABLE "LEN"."BLOG_ARTICLE_CATEGORY" ADD CHECK ("CATEGORY_ID" IS NOT NULL); +ALTER TABLE "LEN"."BLOG_ARTICLE_CATEGORY" + ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "LEN"."BLOG_ARTICLE_CATEGORY" + ADD CHECK ("ARTICLE_ID" IS NOT NULL); +ALTER TABLE "LEN"."BLOG_ARTICLE_CATEGORY" + ADD CHECK ("CATEGORY_ID" IS NOT NULL); -- ---------------------------- -- Primary Key structure for table BLOG_ARTICLE_CATEGORY -- ---------------------------- -ALTER TABLE "LEN"."BLOG_ARTICLE_CATEGORY" ADD PRIMARY KEY ("ID"); +ALTER TABLE "LEN"."BLOG_ARTICLE_CATEGORY" + ADD PRIMARY KEY ("ID"); -- ---------------------------- -- Indexes structure for table BLOG_ARTICLE_TAG @@ -1886,13 +2250,16 @@ ALTER TABLE "LEN"."BLOG_ARTICLE_CATEGORY" ADD PRIMARY KEY ("ID"); -- ---------------------------- -- Checks structure for table BLOG_ARTICLE_TAG -- ---------------------------- -ALTER TABLE "LEN"."BLOG_ARTICLE_TAG" ADD CHECK ("ARTICLE_ID" IS NOT NULL); -ALTER TABLE "LEN"."BLOG_ARTICLE_TAG" ADD CHECK ("TAG_ID" IS NOT NULL); +ALTER TABLE "LEN"."BLOG_ARTICLE_TAG" + ADD CHECK ("ARTICLE_ID" IS NOT NULL); +ALTER TABLE "LEN"."BLOG_ARTICLE_TAG" + ADD CHECK ("TAG_ID" IS NOT NULL); -- ---------------------------- -- Primary Key structure for table BLOG_ARTICLE_TAG -- ---------------------------- -ALTER TABLE "LEN"."BLOG_ARTICLE_TAG" ADD PRIMARY KEY ("ARTICLE_ID", "TAG_ID"); +ALTER TABLE "LEN"."BLOG_ARTICLE_TAG" + ADD PRIMARY KEY ("ARTICLE_ID", "TAG_ID"); -- ---------------------------- -- Indexes structure for table BLOG_CATEGORY @@ -1901,16 +2268,22 @@ ALTER TABLE "LEN"."BLOG_ARTICLE_TAG" ADD PRIMARY KEY ("ARTICLE_ID", "TAG_ID"); -- ---------------------------- -- Checks structure for table BLOG_CATEGORY -- ---------------------------- -ALTER TABLE "LEN"."BLOG_CATEGORY" ADD CHECK ("ID" IS NOT NULL); -ALTER TABLE "LEN"."BLOG_CATEGORY" ADD CHECK ("SEQUENCE" IS NOT NULL); -ALTER TABLE "LEN"."BLOG_CATEGORY" ADD CHECK ("CODE" IS NOT NULL); -ALTER TABLE "LEN"."BLOG_CATEGORY" ADD CHECK ("NAME" IS NOT NULL); -ALTER TABLE "LEN"."BLOG_CATEGORY" ADD CHECK ("PARENT_ID" IS NOT NULL); +ALTER TABLE "LEN"."BLOG_CATEGORY" + ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "LEN"."BLOG_CATEGORY" + ADD CHECK ("SEQUENCE" IS NOT NULL); +ALTER TABLE "LEN"."BLOG_CATEGORY" + ADD CHECK ("CODE" IS NOT NULL); +ALTER TABLE "LEN"."BLOG_CATEGORY" + ADD CHECK ("NAME" IS NOT NULL); +ALTER TABLE "LEN"."BLOG_CATEGORY" + ADD CHECK ("PARENT_ID" IS NOT NULL); -- ---------------------------- -- Primary Key structure for table BLOG_CATEGORY -- ---------------------------- -ALTER TABLE "LEN"."BLOG_CATEGORY" ADD PRIMARY KEY ("ID"); +ALTER TABLE "LEN"."BLOG_CATEGORY" + ADD PRIMARY KEY ("ID"); -- ---------------------------- -- Indexes structure for table BLOG_TAG @@ -1919,14 +2292,18 @@ ALTER TABLE "LEN"."BLOG_CATEGORY" ADD PRIMARY KEY ("ID"); -- ---------------------------- -- Checks structure for table BLOG_TAG -- ---------------------------- -ALTER TABLE "LEN"."BLOG_TAG" ADD CHECK ("ID" IS NOT NULL); -ALTER TABLE "LEN"."BLOG_TAG" ADD CHECK ("TAG_CODE" IS NOT NULL); -ALTER TABLE "LEN"."BLOG_TAG" ADD CHECK ("TAG_NAME" IS NOT NULL); +ALTER TABLE "LEN"."BLOG_TAG" + ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "LEN"."BLOG_TAG" + ADD CHECK ("TAG_CODE" IS NOT NULL); +ALTER TABLE "LEN"."BLOG_TAG" + ADD CHECK ("TAG_NAME" IS NOT NULL); -- ---------------------------- -- Primary Key structure for table BLOG_TAG -- ---------------------------- -ALTER TABLE "LEN"."BLOG_TAG" ADD PRIMARY KEY ("ID"); +ALTER TABLE "LEN"."BLOG_TAG" + ADD PRIMARY KEY ("ID"); -- ---------------------------- -- Indexes structure for table SYS_DICT_ITEM @@ -1935,17 +2312,24 @@ ALTER TABLE "LEN"."BLOG_TAG" ADD PRIMARY KEY ("ID"); -- ---------------------------- -- Checks structure for table SYS_DICT_ITEM -- ---------------------------- -ALTER TABLE "LEN"."SYS_DICT_ITEM" ADD CHECK ("ID" IS NOT NULL); -ALTER TABLE "LEN"."SYS_DICT_ITEM" ADD CHECK ("SEQUENCE" IS NOT NULL); -ALTER TABLE "LEN"."SYS_DICT_ITEM" ADD CHECK ("VALUE" IS NOT NULL); -ALTER TABLE "LEN"."SYS_DICT_ITEM" ADD CHECK ("DESCRIPTION" IS NOT NULL); -ALTER TABLE "LEN"."SYS_DICT_ITEM" ADD CHECK ("TYPE_ID" IS NOT NULL); -ALTER TABLE "LEN"."SYS_DICT_ITEM" ADD CHECK ("DEL_FLAG" IS NOT NULL); +ALTER TABLE "LEN"."SYS_DICT_ITEM" + ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "LEN"."SYS_DICT_ITEM" + ADD CHECK ("SEQUENCE" IS NOT NULL); +ALTER TABLE "LEN"."SYS_DICT_ITEM" + ADD CHECK ("VALUE" IS NOT NULL); +ALTER TABLE "LEN"."SYS_DICT_ITEM" + ADD CHECK ("DESCRIPTION" IS NOT NULL); +ALTER TABLE "LEN"."SYS_DICT_ITEM" + ADD CHECK ("TYPE_ID" IS NOT NULL); +ALTER TABLE "LEN"."SYS_DICT_ITEM" + ADD CHECK ("DEL_FLAG" IS NOT NULL); -- ---------------------------- -- Primary Key structure for table SYS_DICT_ITEM -- ---------------------------- -ALTER TABLE "LEN"."SYS_DICT_ITEM" ADD PRIMARY KEY ("ID"); +ALTER TABLE "LEN"."SYS_DICT_ITEM" + ADD PRIMARY KEY ("ID"); -- ---------------------------- -- Indexes structure for table SYS_DICT_TYPE @@ -1954,15 +2338,20 @@ ALTER TABLE "LEN"."SYS_DICT_ITEM" ADD PRIMARY KEY ("ID"); -- ---------------------------- -- Checks structure for table SYS_DICT_TYPE -- ---------------------------- -ALTER TABLE "LEN"."SYS_DICT_TYPE" ADD CHECK ("ID" IS NOT NULL); -ALTER TABLE "LEN"."SYS_DICT_TYPE" ADD CHECK ("CODE" IS NOT NULL); -ALTER TABLE "LEN"."SYS_DICT_TYPE" ADD CHECK ("DEL_FLAG" IS NOT NULL); -ALTER TABLE "LEN"."SYS_DICT_TYPE" ADD CHECK ("TEXT" IS NOT NULL); +ALTER TABLE "LEN"."SYS_DICT_TYPE" + ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "LEN"."SYS_DICT_TYPE" + ADD CHECK ("CODE" IS NOT NULL); +ALTER TABLE "LEN"."SYS_DICT_TYPE" + ADD CHECK ("DEL_FLAG" IS NOT NULL); +ALTER TABLE "LEN"."SYS_DICT_TYPE" + ADD CHECK ("TEXT" IS NOT NULL); -- ---------------------------- -- Primary Key structure for table SYS_DICT_TYPE -- ---------------------------- -ALTER TABLE "LEN"."SYS_DICT_TYPE" ADD PRIMARY KEY ("ID"); +ALTER TABLE "LEN"."SYS_DICT_TYPE" + ADD PRIMARY KEY ("ID"); -- ---------------------------- -- Indexes structure for table SYS_JOB @@ -1971,16 +2360,22 @@ ALTER TABLE "LEN"."SYS_DICT_TYPE" ADD PRIMARY KEY ("ID"); -- ---------------------------- -- Checks structure for table SYS_JOB -- ---------------------------- -ALTER TABLE "LEN"."SYS_JOB" ADD CHECK ("ID" IS NOT NULL); -ALTER TABLE "LEN"."SYS_JOB" ADD CHECK ("JOB_NAME" IS NOT NULL); -ALTER TABLE "LEN"."SYS_JOB" ADD CHECK ("CRON" IS NOT NULL); -ALTER TABLE "LEN"."SYS_JOB" ADD CHECK ("STATUS" IS NOT NULL); -ALTER TABLE "LEN"."SYS_JOB" ADD CHECK ("CLAZZ_PATH" IS NOT NULL); +ALTER TABLE "LEN"."SYS_JOB" + ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "LEN"."SYS_JOB" + ADD CHECK ("JOB_NAME" IS NOT NULL); +ALTER TABLE "LEN"."SYS_JOB" + ADD CHECK ("CRON" IS NOT NULL); +ALTER TABLE "LEN"."SYS_JOB" + ADD CHECK ("STATUS" IS NOT NULL); +ALTER TABLE "LEN"."SYS_JOB" + ADD CHECK ("CLAZZ_PATH" IS NOT NULL); -- ---------------------------- -- Primary Key structure for table SYS_JOB -- ---------------------------- -ALTER TABLE "LEN"."SYS_JOB" ADD PRIMARY KEY ("ID"); +ALTER TABLE "LEN"."SYS_JOB" + ADD PRIMARY KEY ("ID"); -- ---------------------------- -- Indexes structure for table SYS_LOG @@ -1989,12 +2384,14 @@ ALTER TABLE "LEN"."SYS_JOB" ADD PRIMARY KEY ("ID"); -- ---------------------------- -- Checks structure for table SYS_LOG -- ---------------------------- -ALTER TABLE "LEN"."SYS_LOG" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "LEN"."SYS_LOG" + ADD CHECK ("ID" IS NOT NULL); -- ---------------------------- -- Primary Key structure for table SYS_LOG -- ---------------------------- -ALTER TABLE "LEN"."SYS_LOG" ADD PRIMARY KEY ("ID"); +ALTER TABLE "LEN"."SYS_LOG" + ADD PRIMARY KEY ("ID"); -- ---------------------------- -- Indexes structure for table SYS_MENU @@ -2003,14 +2400,18 @@ ALTER TABLE "LEN"."SYS_LOG" ADD PRIMARY KEY ("ID"); -- ---------------------------- -- Checks structure for table SYS_MENU -- ---------------------------- -ALTER TABLE "LEN"."SYS_MENU" ADD CHECK ("ID" IS NOT NULL); -ALTER TABLE "LEN"."SYS_MENU" ADD CHECK ("NAME" IS NOT NULL); -ALTER TABLE "LEN"."SYS_MENU" ADD CHECK ("MENU_TYPE" IS NOT NULL); +ALTER TABLE "LEN"."SYS_MENU" + ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "LEN"."SYS_MENU" + ADD CHECK ("NAME" IS NOT NULL); +ALTER TABLE "LEN"."SYS_MENU" + ADD CHECK ("MENU_TYPE" IS NOT NULL); -- ---------------------------- -- Primary Key structure for table SYS_MENU -- ---------------------------- -ALTER TABLE "LEN"."SYS_MENU" ADD PRIMARY KEY ("ID"); +ALTER TABLE "LEN"."SYS_MENU" + ADD PRIMARY KEY ("ID"); -- ---------------------------- -- Indexes structure for table SYS_ROLE @@ -2019,12 +2420,14 @@ ALTER TABLE "LEN"."SYS_MENU" ADD PRIMARY KEY ("ID"); -- ---------------------------- -- Checks structure for table SYS_ROLE -- ---------------------------- -ALTER TABLE "LEN"."SYS_ROLE" ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "LEN"."SYS_ROLE" + ADD CHECK ("ID" IS NOT NULL); -- ---------------------------- -- Primary Key structure for table SYS_ROLE -- ---------------------------- -ALTER TABLE "LEN"."SYS_ROLE" ADD PRIMARY KEY ("ID"); +ALTER TABLE "LEN"."SYS_ROLE" + ADD PRIMARY KEY ("ID"); -- ---------------------------- -- Indexes structure for table SYS_ROLE_MENU @@ -2033,13 +2436,16 @@ ALTER TABLE "LEN"."SYS_ROLE" ADD PRIMARY KEY ("ID"); -- ---------------------------- -- Checks structure for table SYS_ROLE_MENU -- ---------------------------- -ALTER TABLE "LEN"."SYS_ROLE_MENU" ADD CHECK ("ROLE_ID" IS NOT NULL); -ALTER TABLE "LEN"."SYS_ROLE_MENU" ADD CHECK ("MENU_ID" IS NOT NULL); +ALTER TABLE "LEN"."SYS_ROLE_MENU" + ADD CHECK ("ROLE_ID" IS NOT NULL); +ALTER TABLE "LEN"."SYS_ROLE_MENU" + ADD CHECK ("MENU_ID" IS NOT NULL); -- ---------------------------- -- Primary Key structure for table SYS_ROLE_MENU -- ---------------------------- -ALTER TABLE "LEN"."SYS_ROLE_MENU" ADD PRIMARY KEY ("ROLE_ID", "MENU_ID"); +ALTER TABLE "LEN"."SYS_ROLE_MENU" + ADD PRIMARY KEY ("ROLE_ID", "MENU_ID"); -- ---------------------------- -- Indexes structure for table SYS_ROLE_USER @@ -2048,13 +2454,16 @@ ALTER TABLE "LEN"."SYS_ROLE_MENU" ADD PRIMARY KEY ("ROLE_ID", "MENU_ID"); -- ---------------------------- -- Checks structure for table SYS_ROLE_USER -- ---------------------------- -ALTER TABLE "LEN"."SYS_ROLE_USER" ADD CHECK ("USER_ID" IS NOT NULL); -ALTER TABLE "LEN"."SYS_ROLE_USER" ADD CHECK ("ROLE_ID" IS NOT NULL); +ALTER TABLE "LEN"."SYS_ROLE_USER" + ADD CHECK ("USER_ID" IS NOT NULL); +ALTER TABLE "LEN"."SYS_ROLE_USER" + ADD CHECK ("ROLE_ID" IS NOT NULL); -- ---------------------------- -- Primary Key structure for table SYS_ROLE_USER -- ---------------------------- -ALTER TABLE "LEN"."SYS_ROLE_USER" ADD PRIMARY KEY ("USER_ID", "ROLE_ID"); +ALTER TABLE "LEN"."SYS_ROLE_USER" + ADD PRIMARY KEY ("USER_ID", "ROLE_ID"); -- ---------------------------- -- Indexes structure for table SYS_USER @@ -2063,15 +2472,20 @@ ALTER TABLE "LEN"."SYS_ROLE_USER" ADD PRIMARY KEY ("USER_ID", "ROLE_ID"); -- ---------------------------- -- Checks structure for table SYS_USER -- ---------------------------- -ALTER TABLE "LEN"."SYS_USER" ADD CHECK ("ID" IS NOT NULL); -ALTER TABLE "LEN"."SYS_USER" ADD CHECK ("USERNAME" IS NOT NULL); -ALTER TABLE "LEN"."SYS_USER" ADD CHECK ("PASSWORD" IS NOT NULL); -ALTER TABLE "LEN"."SYS_USER" ADD CHECK ("DEL_FLAG" IS NOT NULL); +ALTER TABLE "LEN"."SYS_USER" + ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "LEN"."SYS_USER" + ADD CHECK ("USERNAME" IS NOT NULL); +ALTER TABLE "LEN"."SYS_USER" + ADD CHECK ("PASSWORD" IS NOT NULL); +ALTER TABLE "LEN"."SYS_USER" + ADD CHECK ("DEL_FLAG" IS NOT NULL); -- ---------------------------- -- Primary Key structure for table SYS_USER -- ---------------------------- -ALTER TABLE "LEN"."SYS_USER" ADD PRIMARY KEY ("ID"); +ALTER TABLE "LEN"."SYS_USER" + ADD PRIMARY KEY ("ID"); -- ---------------------------- -- Indexes structure for table USER_LEAVE @@ -2080,73 +2494,99 @@ ALTER TABLE "LEN"."SYS_USER" ADD PRIMARY KEY ("ID"); -- ---------------------------- -- Checks structure for table USER_LEAVE -- ---------------------------- -ALTER TABLE "LEN"."USER_LEAVE" ADD CHECK ("ID" IS NOT NULL); -ALTER TABLE "LEN"."USER_LEAVE" ADD CHECK ("USER_ID" IS NOT NULL); +ALTER TABLE "LEN"."USER_LEAVE" + ADD CHECK ("ID" IS NOT NULL); +ALTER TABLE "LEN"."USER_LEAVE" + ADD CHECK ("USER_ID" IS NOT NULL); -- ---------------------------- -- Primary Key structure for table USER_LEAVE -- ---------------------------- -ALTER TABLE "LEN"."USER_LEAVE" ADD PRIMARY KEY ("ID"); +ALTER TABLE "LEN"."USER_LEAVE" + ADD PRIMARY KEY ("ID"); -- ---------------------------- -- Foreign Key structure for table "LEN"."ACT_GE_BYTEARRAY" -- ---------------------------- -ALTER TABLE "LEN"."ACT_GE_BYTEARRAY" ADD FOREIGN KEY ("DEPLOYMENT_ID_") REFERENCES "LEN"."ACT_RE_DEPLOYMENT" ("ID_"); +ALTER TABLE "LEN"."ACT_GE_BYTEARRAY" + ADD FOREIGN KEY ("DEPLOYMENT_ID_") REFERENCES "LEN"."ACT_RE_DEPLOYMENT" ("ID_"); -- ---------------------------- -- Foreign Key structure for table "LEN"."ACT_ID_MEMBERSHIP" -- ---------------------------- -ALTER TABLE "LEN"."ACT_ID_MEMBERSHIP" ADD FOREIGN KEY ("GROUP_ID_") REFERENCES "LEN"."ACT_ID_GROUP" ("ID_"); -ALTER TABLE "LEN"."ACT_ID_MEMBERSHIP" ADD FOREIGN KEY ("USER_ID_") REFERENCES "LEN"."ACT_ID_USER" ("ID_"); +ALTER TABLE "LEN"."ACT_ID_MEMBERSHIP" + ADD FOREIGN KEY ("GROUP_ID_") REFERENCES "LEN"."ACT_ID_GROUP" ("ID_"); +ALTER TABLE "LEN"."ACT_ID_MEMBERSHIP" + ADD FOREIGN KEY ("USER_ID_") REFERENCES "LEN"."ACT_ID_USER" ("ID_"); -- ---------------------------- -- Foreign Key structure for table "LEN"."ACT_PROCDEF_INFO" -- ---------------------------- -ALTER TABLE "LEN"."ACT_PROCDEF_INFO" ADD FOREIGN KEY ("INFO_JSON_ID_") REFERENCES "LEN"."ACT_GE_BYTEARRAY" ("ID_"); -ALTER TABLE "LEN"."ACT_PROCDEF_INFO" ADD FOREIGN KEY ("PROC_DEF_ID_") REFERENCES "LEN"."ACT_RE_PROCDEF" ("ID_"); +ALTER TABLE "LEN"."ACT_PROCDEF_INFO" + ADD FOREIGN KEY ("INFO_JSON_ID_") REFERENCES "LEN"."ACT_GE_BYTEARRAY" ("ID_"); +ALTER TABLE "LEN"."ACT_PROCDEF_INFO" + ADD FOREIGN KEY ("PROC_DEF_ID_") REFERENCES "LEN"."ACT_RE_PROCDEF" ("ID_"); -- ---------------------------- -- Foreign Key structure for table "LEN"."ACT_RE_MODEL" -- ---------------------------- -ALTER TABLE "LEN"."ACT_RE_MODEL" ADD FOREIGN KEY ("DEPLOYMENT_ID_") REFERENCES "LEN"."ACT_RE_DEPLOYMENT" ("ID_"); -ALTER TABLE "LEN"."ACT_RE_MODEL" ADD FOREIGN KEY ("EDITOR_SOURCE_VALUE_ID_") REFERENCES "LEN"."ACT_GE_BYTEARRAY" ("ID_"); -ALTER TABLE "LEN"."ACT_RE_MODEL" ADD FOREIGN KEY ("EDITOR_SOURCE_EXTRA_VALUE_ID_") REFERENCES "LEN"."ACT_GE_BYTEARRAY" ("ID_"); +ALTER TABLE "LEN"."ACT_RE_MODEL" + ADD FOREIGN KEY ("DEPLOYMENT_ID_") REFERENCES "LEN"."ACT_RE_DEPLOYMENT" ("ID_"); +ALTER TABLE "LEN"."ACT_RE_MODEL" + ADD FOREIGN KEY ("EDITOR_SOURCE_VALUE_ID_") REFERENCES "LEN"."ACT_GE_BYTEARRAY" ("ID_"); +ALTER TABLE "LEN"."ACT_RE_MODEL" + ADD FOREIGN KEY ("EDITOR_SOURCE_EXTRA_VALUE_ID_") REFERENCES "LEN"."ACT_GE_BYTEARRAY" ("ID_"); -- ---------------------------- -- Foreign Key structure for table "LEN"."ACT_RU_EVENT_SUBSCR" -- ---------------------------- -ALTER TABLE "LEN"."ACT_RU_EVENT_SUBSCR" ADD FOREIGN KEY ("EXECUTION_ID_") REFERENCES "LEN"."ACT_RU_EXECUTION" ("ID_"); +ALTER TABLE "LEN"."ACT_RU_EVENT_SUBSCR" + ADD FOREIGN KEY ("EXECUTION_ID_") REFERENCES "LEN"."ACT_RU_EXECUTION" ("ID_"); -- ---------------------------- -- Foreign Key structure for table "LEN"."ACT_RU_EXECUTION" -- ---------------------------- -ALTER TABLE "LEN"."ACT_RU_EXECUTION" ADD FOREIGN KEY ("PARENT_ID_") REFERENCES "LEN"."ACT_RU_EXECUTION" ("ID_"); -ALTER TABLE "LEN"."ACT_RU_EXECUTION" ADD FOREIGN KEY ("PROC_DEF_ID_") REFERENCES "LEN"."ACT_RE_PROCDEF" ("ID_"); -ALTER TABLE "LEN"."ACT_RU_EXECUTION" ADD FOREIGN KEY ("PROC_INST_ID_") REFERENCES "LEN"."ACT_RU_EXECUTION" ("ID_"); -ALTER TABLE "LEN"."ACT_RU_EXECUTION" ADD FOREIGN KEY ("SUPER_EXEC_") REFERENCES "LEN"."ACT_RU_EXECUTION" ("ID_"); +ALTER TABLE "LEN"."ACT_RU_EXECUTION" + ADD FOREIGN KEY ("PARENT_ID_") REFERENCES "LEN"."ACT_RU_EXECUTION" ("ID_"); +ALTER TABLE "LEN"."ACT_RU_EXECUTION" + ADD FOREIGN KEY ("PROC_DEF_ID_") REFERENCES "LEN"."ACT_RE_PROCDEF" ("ID_"); +ALTER TABLE "LEN"."ACT_RU_EXECUTION" + ADD FOREIGN KEY ("PROC_INST_ID_") REFERENCES "LEN"."ACT_RU_EXECUTION" ("ID_"); +ALTER TABLE "LEN"."ACT_RU_EXECUTION" + ADD FOREIGN KEY ("SUPER_EXEC_") REFERENCES "LEN"."ACT_RU_EXECUTION" ("ID_"); -- ---------------------------- -- Foreign Key structure for table "LEN"."ACT_RU_IDENTITYLINK" -- ---------------------------- -ALTER TABLE "LEN"."ACT_RU_IDENTITYLINK" ADD FOREIGN KEY ("PROC_DEF_ID_") REFERENCES "LEN"."ACT_RE_PROCDEF" ("ID_"); -ALTER TABLE "LEN"."ACT_RU_IDENTITYLINK" ADD FOREIGN KEY ("PROC_INST_ID_") REFERENCES "LEN"."ACT_RU_EXECUTION" ("ID_"); -ALTER TABLE "LEN"."ACT_RU_IDENTITYLINK" ADD FOREIGN KEY ("TASK_ID_") REFERENCES "LEN"."ACT_RU_TASK" ("ID_"); +ALTER TABLE "LEN"."ACT_RU_IDENTITYLINK" + ADD FOREIGN KEY ("PROC_DEF_ID_") REFERENCES "LEN"."ACT_RE_PROCDEF" ("ID_"); +ALTER TABLE "LEN"."ACT_RU_IDENTITYLINK" + ADD FOREIGN KEY ("PROC_INST_ID_") REFERENCES "LEN"."ACT_RU_EXECUTION" ("ID_"); +ALTER TABLE "LEN"."ACT_RU_IDENTITYLINK" + ADD FOREIGN KEY ("TASK_ID_") REFERENCES "LEN"."ACT_RU_TASK" ("ID_"); -- ---------------------------- -- Foreign Key structure for table "LEN"."ACT_RU_JOB" -- ---------------------------- -ALTER TABLE "LEN"."ACT_RU_JOB" ADD FOREIGN KEY ("EXCEPTION_STACK_ID_") REFERENCES "LEN"."ACT_GE_BYTEARRAY" ("ID_"); +ALTER TABLE "LEN"."ACT_RU_JOB" + ADD FOREIGN KEY ("EXCEPTION_STACK_ID_") REFERENCES "LEN"."ACT_GE_BYTEARRAY" ("ID_"); -- ---------------------------- -- Foreign Key structure for table "LEN"."ACT_RU_TASK" -- ---------------------------- -ALTER TABLE "LEN"."ACT_RU_TASK" ADD FOREIGN KEY ("EXECUTION_ID_") REFERENCES "LEN"."ACT_RU_EXECUTION" ("ID_"); -ALTER TABLE "LEN"."ACT_RU_TASK" ADD FOREIGN KEY ("PROC_DEF_ID_") REFERENCES "LEN"."ACT_RE_PROCDEF" ("ID_"); -ALTER TABLE "LEN"."ACT_RU_TASK" ADD FOREIGN KEY ("PROC_INST_ID_") REFERENCES "LEN"."ACT_RU_EXECUTION" ("ID_"); +ALTER TABLE "LEN"."ACT_RU_TASK" + ADD FOREIGN KEY ("EXECUTION_ID_") REFERENCES "LEN"."ACT_RU_EXECUTION" ("ID_"); +ALTER TABLE "LEN"."ACT_RU_TASK" + ADD FOREIGN KEY ("PROC_DEF_ID_") REFERENCES "LEN"."ACT_RE_PROCDEF" ("ID_"); +ALTER TABLE "LEN"."ACT_RU_TASK" + ADD FOREIGN KEY ("PROC_INST_ID_") REFERENCES "LEN"."ACT_RU_EXECUTION" ("ID_"); -- ---------------------------- -- Foreign Key structure for table "LEN"."ACT_RU_VARIABLE" -- ---------------------------- -ALTER TABLE "LEN"."ACT_RU_VARIABLE" ADD FOREIGN KEY ("BYTEARRAY_ID_") REFERENCES "LEN"."ACT_GE_BYTEARRAY" ("ID_"); -ALTER TABLE "LEN"."ACT_RU_VARIABLE" ADD FOREIGN KEY ("EXECUTION_ID_") REFERENCES "LEN"."ACT_RU_EXECUTION" ("ID_"); -ALTER TABLE "LEN"."ACT_RU_VARIABLE" ADD FOREIGN KEY ("PROC_INST_ID_") REFERENCES "LEN"."ACT_RU_EXECUTION" ("ID_"); +ALTER TABLE "LEN"."ACT_RU_VARIABLE" + ADD FOREIGN KEY ("BYTEARRAY_ID_") REFERENCES "LEN"."ACT_GE_BYTEARRAY" ("ID_"); +ALTER TABLE "LEN"."ACT_RU_VARIABLE" + ADD FOREIGN KEY ("EXECUTION_ID_") REFERENCES "LEN"."ACT_RU_EXECUTION" ("ID_"); +ALTER TABLE "LEN"."ACT_RU_VARIABLE" + ADD FOREIGN KEY ("PROC_INST_ID_") REFERENCES "LEN"."ACT_RU_EXECUTION" ("ID_"); diff --git a/len-activiti/pom.xml b/len-activiti/pom.xml index ad9c854..c8a4af9 100644 --- a/len-activiti/pom.xml +++ b/len-activiti/pom.xml @@ -1,89 +1,89 @@ - - - lenosp - com.len - lenosp-2.0-SNAPSHOT - - 4.0.0 + + + lenosp + com.len + lenosp-2.0-SNAPSHOT + + 4.0.0 - len-activiti + len-activiti - len-activiti - http://maven.apache.org - + len-activiti + http://maven.apache.org + - - UTF-8 - 5.22.0 - - + + UTF-8 + 5.22.0 + + - - - org.activiti - activiti-engine - ${activiti.version} - + + + org.activiti + activiti-engine + ${activiti.version} + - - org.activiti - activiti-spring - ${activiti.version} - + + org.activiti + activiti-spring + ${activiti.version} + - - org.activiti - activiti-modeler - ${activiti.version} - + + org.activiti + activiti-modeler + ${activiti.version} + - - org.activiti - activiti-diagram-rest - ${activiti.version} - - + + org.activiti + activiti-diagram-rest + ${activiti.version} + + - - - com.len - len-sys - - - junit - junit - 4.12 - - - - - - com.len - len-sys - lenosp-2.0-SNAPSHOT - - - + + + com.len + len-sys + + + junit + junit + 4.12 + + + + + + com.len + len-sys + lenosp-2.0-SNAPSHOT + + + - - - - src/main/java - - **/*.xml - - - - src/main/resources - - **.* - **/*.* - **/*/*.* - - - - + + + + src/main/java + + **/*.xml + + + + src/main/resources + + **.* + **/*.* + **/*/*.* + + + + diff --git a/len-activiti/src/main/java/com/len/actlistener/ActNodeListener.java b/len-activiti/src/main/java/com/len/actlistener/ActNodeListener.java index 155ca87..6b0b746 100644 --- a/len-activiti/src/main/java/com/len/actlistener/ActNodeListener.java +++ b/len-activiti/src/main/java/com/len/actlistener/ActNodeListener.java @@ -21,12 +21,11 @@ import com.len.service.ActAssigneeService; import com.len.service.impl.ActAssigneeServiceImpl; import com.len.util.AssigneeType; import com.len.util.SpringUtil; - -import java.util.List; - import org.activiti.engine.delegate.DelegateTask; import org.activiti.engine.delegate.TaskListener; +import java.util.List; + /** * @author zhuxiaomeng * @date 2018/1/20. @@ -36,21 +35,21 @@ import org.activiti.engine.delegate.TaskListener; */ public class ActNodeListener implements TaskListener { - @Override - public void notify(DelegateTask delegateTask) { - //KEY - String nodeId = delegateTask.getTaskDefinitionKey(); - ActAssigneeService actAssigneeService = SpringUtil.getBean(ActAssigneeServiceImpl.class); - List assigneeList = actAssigneeService.list(new QueryWrapper<>(new ActAssignee(nodeId))); - for (ActAssignee assignee : assigneeList) { - switch (assignee.getAssigneeType()) { - case AssigneeType.GROUP_TYPE: - delegateTask.addCandidateGroup(assignee.getRoleId()); - break; - case AssigneeType.USER_TYPE: - delegateTask.addCandidateUser(assignee.getAssignee()); - break; - } - } - } + @Override + public void notify(DelegateTask delegateTask) { + //KEY + String nodeId = delegateTask.getTaskDefinitionKey(); + ActAssigneeService actAssigneeService = SpringUtil.getBean(ActAssigneeServiceImpl.class); + List assigneeList = actAssigneeService.list(new QueryWrapper<>(new ActAssignee(nodeId))); + for (ActAssignee assignee : assigneeList) { + switch (assignee.getAssigneeType()) { + case AssigneeType.GROUP_TYPE: + delegateTask.addCandidateGroup(assignee.getRoleId()); + break; + case AssigneeType.USER_TYPE: + delegateTask.addCandidateUser(assignee.getAssignee()); + break; + } + } + } } diff --git a/len-activiti/src/main/java/com/len/actlistener/ActStartNodeListener.java b/len-activiti/src/main/java/com/len/actlistener/ActStartNodeListener.java index ab993a0..c19eead 100644 --- a/len-activiti/src/main/java/com/len/actlistener/ActStartNodeListener.java +++ b/len-activiti/src/main/java/com/len/actlistener/ActStartNodeListener.java @@ -30,15 +30,15 @@ import java.util.Map; */ public class ActStartNodeListener implements TaskListener { - @Override - public void notify(DelegateTask delegateTask) { - //KEY - String nodeId = delegateTask.getTaskDefinitionKey(); + @Override + public void notify(DelegateTask delegateTask) { + //KEY + String nodeId = delegateTask.getTaskDefinitionKey(); - Map variables = delegateTask.getVariables(); - BaseTask baseTask = (BaseTask) variables.get("baseTask"); + Map variables = delegateTask.getVariables(); + BaseTask baseTask = (BaseTask) variables.get("baseTask"); - delegateTask.setAssignee(baseTask.getUserId()); + delegateTask.setAssignee(baseTask.getUserId()); - } + } } diff --git a/len-activiti/src/main/java/com/len/actlistener/LeaveListenerImpl.java b/len-activiti/src/main/java/com/len/actlistener/LeaveListenerImpl.java index ebac5f5..c0cd013 100644 --- a/len-activiti/src/main/java/com/len/actlistener/LeaveListenerImpl.java +++ b/len-activiti/src/main/java/com/len/actlistener/LeaveListenerImpl.java @@ -29,12 +29,12 @@ import java.util.Map; */ public class LeaveListenerImpl extends ActNodeListener { - @Override - public void notify(DelegateTask delegateTask) { - super.notify(delegateTask); - String taskId = delegateTask.getId(); - Map map = delegateTask.getVariables(); - UserLeave userLeave = (UserLeave) map.get("userLeave"); - delegateTask.addCandidateUser(userLeave.getUserId()); - } + @Override + public void notify(DelegateTask delegateTask) { + super.notify(delegateTask); + String taskId = delegateTask.getId(); + Map map = delegateTask.getVariables(); + UserLeave userLeave = (UserLeave) map.get("userLeave"); + delegateTask.addCandidateUser(userLeave.getUserId()); + } } diff --git a/len-activiti/src/main/java/com/len/actlistener/ListenUserRole.java b/len-activiti/src/main/java/com/len/actlistener/ListenUserRole.java index 8d9145f..1d06c5d 100644 --- a/len-activiti/src/main/java/com/len/actlistener/ListenUserRole.java +++ b/len-activiti/src/main/java/com/len/actlistener/ListenUserRole.java @@ -46,146 +46,146 @@ import java.util.List; @Component public class ListenUserRole { - @Autowired - IdentityService identityService; - - @Autowired - SysUserService userService; - - /**********************用户处理begin***************************/ - /** - * 明确切入方法的参数 - * - * @param joinPoint - */ - @Around("execution(com.len.util.LenResponse com.len.controller.UserController.updateUser(*,String[]))") - public Object listenerUserUpdate(ProceedingJoinPoint joinPoint) throws Throwable { - Object o = new Object(); - //更新前拿到用户-角色数据 - SysRoleUser sysRoleUser = new SysRoleUser(); - Object[] args = joinPoint.getArgs(); - sysRoleUser.setUserId(((SysUser) args[0]).getId()); - List keyList = userService.selectByCondition(sysRoleUser); - List strings = new ArrayList<>(); - keyList.forEach(sysRoleUser1 -> strings.add(sysRoleUser1.getRoleId())); - o = joinPoint.proceed(joinPoint.getArgs()); - LenResponse jsonUtil = (LenResponse) o; - if (jsonUtil.isFlag()) { - changeUser(args, strings); - } - return o; - } - - /** - * 新增用户监听 同步工作流用户表 环绕注解能得到 插入用户id 啊哈哈 - * - * @param joinPoint - */ - @Around("execution(com.len.util.LenResponse com.len.controller.UserController.addUser(*,String[]))") - public Object listenerUserInsert(ProceedingJoinPoint joinPoint) throws Throwable { - Object o = joinPoint.proceed(joinPoint.getArgs()); - Object[] args = joinPoint.getArgs(); - if (args.length == 2) { - LenResponse jsonUtil = (LenResponse) o; - if (jsonUtil.isFlag()) { - changeUser(args, Arrays.asList((String[]) args[1])); - } - } - return o; - } - - @Around("execution(com.len.util.LenResponse com.len.controller.UserController.del(..))") - public Object listenDelUser(ProceedingJoinPoint point) throws Throwable { - Object o = point.proceed(point.getArgs()); - LenResponse util = (LenResponse) o; - if (util.isFlag()) { - Object[] args = point.getArgs(); - identityService.deleteUser((String) args[0]); - } - return o; - } - - - /** - * 保存进 activiti 用户 角色 用户角色中间表 - * - * @param obj - */ - private void changeUser(Object[] obj, List strings) { - SysUser user = (SysUser) obj[0]; - identityService.deleteUser(user.getId()); - User au = new UserEntity(); - au.setId(user.getId()); + @Autowired + IdentityService identityService; + + @Autowired + SysUserService userService; + + /**********************用户处理begin***************************/ + /** + * 明确切入方法的参数 + * + * @param joinPoint + */ + @Around("execution(com.len.util.LenResponse com.len.controller.UserController.updateUser(*,String[]))") + public Object listenerUserUpdate(ProceedingJoinPoint joinPoint) throws Throwable { + Object o = new Object(); + //更新前拿到用户-角色数据 + SysRoleUser sysRoleUser = new SysRoleUser(); + Object[] args = joinPoint.getArgs(); + sysRoleUser.setUserId(((SysUser) args[0]).getId()); + List keyList = userService.selectByCondition(sysRoleUser); + List strings = new ArrayList<>(); + keyList.forEach(sysRoleUser1 -> strings.add(sysRoleUser1.getRoleId())); + o = joinPoint.proceed(joinPoint.getArgs()); + LenResponse jsonUtil = (LenResponse) o; + if (jsonUtil.isFlag()) { + changeUser(args, strings); + } + return o; + } + + /** + * 新增用户监听 同步工作流用户表 环绕注解能得到 插入用户id 啊哈哈 + * + * @param joinPoint + */ + @Around("execution(com.len.util.LenResponse com.len.controller.UserController.addUser(*,String[]))") + public Object listenerUserInsert(ProceedingJoinPoint joinPoint) throws Throwable { + Object o = joinPoint.proceed(joinPoint.getArgs()); + Object[] args = joinPoint.getArgs(); + if (args.length == 2) { + LenResponse jsonUtil = (LenResponse) o; + if (jsonUtil.isFlag()) { + changeUser(args, Arrays.asList((String[]) args[1])); + } + } + return o; + } + + @Around("execution(com.len.util.LenResponse com.len.controller.UserController.del(..))") + public Object listenDelUser(ProceedingJoinPoint point) throws Throwable { + Object o = point.proceed(point.getArgs()); + LenResponse util = (LenResponse) o; + if (util.isFlag()) { + Object[] args = point.getArgs(); + identityService.deleteUser((String) args[0]); + } + return o; + } + + + /** + * 保存进 activiti 用户 角色 用户角色中间表 + * + * @param obj + */ + private void changeUser(Object[] obj, List strings) { + SysUser user = (SysUser) obj[0]; + identityService.deleteUser(user.getId()); + User au = new UserEntity(); + au.setId(user.getId()); // au.setFirstName(user.getRealName()); - au.setEmail(user.getEmail()); - identityService.saveUser(au); - - //删除用户-组关联 - for (String roleId : strings) { - identityService.deleteMembership(user.getId(), roleId); - } - //再次关联 - if (!strings.isEmpty()) { - for (String roleId : strings) { - identityService.createMembership(user.getId(), roleId); - } - } - } - - /**********************用户处理end***************************/ - - - /**********************角色处理begin***************************/ - @Around("execution(com.len.util.LenResponse com.len.controller.RoleController.addRole(*,String[]))") - public Object listenRoleInsert(ProceedingJoinPoint joinPoint) throws Throwable { - Object o = joinPoint.proceed(joinPoint.getArgs()); - LenResponse j = (LenResponse) o; - if (j.isFlag()) { - Object[] args = joinPoint.getArgs(); - if (args.length == 2) { - changeRole(args); - } - } - return o; - } - - @Around("execution(com.len.util.LenResponse com.len.controller.RoleController.updateUser(*,String[]))") - public Object listenRoleUpdate(ProceedingJoinPoint joinPoint) throws Throwable { - Object o = joinPoint.proceed(joinPoint.getArgs()); - Object[] args = joinPoint.getArgs(); - if (args.length == 2) { - if (((LenResponse) o).isFlag()) { - changeRole(args); - } - } - - return o; - } - - @Around("execution(com.len.util.LenResponse com.len.controller.RoleController.del(..))") - public Object listenDelRole(ProceedingJoinPoint point) throws Throwable { - Object o = point.proceed(point.getArgs()); - LenResponse util = (LenResponse) o; - if (util.isFlag()) { - Object[] args = point.getArgs(); - identityService.deleteGroup((String) args[0]); - } - return o; - } - - /** - * 更新进组 - * - * @param obj - */ - public void changeRole(Object[] obj) { - SysRole role = (SysRole) obj[0]; - identityService.deleteGroup(role.getId()); - Group group = new GroupEntity(); - group.setId(role.getId()); - group.setName(role.getRoleName()); - identityService.saveGroup(group); - } - - /**********************角色处理end***************************/ + au.setEmail(user.getEmail()); + identityService.saveUser(au); + + //删除用户-组关联 + for (String roleId : strings) { + identityService.deleteMembership(user.getId(), roleId); + } + //再次关联 + if (!strings.isEmpty()) { + for (String roleId : strings) { + identityService.createMembership(user.getId(), roleId); + } + } + } + + /**********************用户处理end***************************/ + + + /**********************角色处理begin***************************/ + @Around("execution(com.len.util.LenResponse com.len.controller.RoleController.addRole(*,String[]))") + public Object listenRoleInsert(ProceedingJoinPoint joinPoint) throws Throwable { + Object o = joinPoint.proceed(joinPoint.getArgs()); + LenResponse j = (LenResponse) o; + if (j.isFlag()) { + Object[] args = joinPoint.getArgs(); + if (args.length == 2) { + changeRole(args); + } + } + return o; + } + + @Around("execution(com.len.util.LenResponse com.len.controller.RoleController.updateUser(*,String[]))") + public Object listenRoleUpdate(ProceedingJoinPoint joinPoint) throws Throwable { + Object o = joinPoint.proceed(joinPoint.getArgs()); + Object[] args = joinPoint.getArgs(); + if (args.length == 2) { + if (((LenResponse) o).isFlag()) { + changeRole(args); + } + } + + return o; + } + + @Around("execution(com.len.util.LenResponse com.len.controller.RoleController.del(..))") + public Object listenDelRole(ProceedingJoinPoint point) throws Throwable { + Object o = point.proceed(point.getArgs()); + LenResponse util = (LenResponse) o; + if (util.isFlag()) { + Object[] args = point.getArgs(); + identityService.deleteGroup((String) args[0]); + } + return o; + } + + /** + * 更新进组 + * + * @param obj + */ + public void changeRole(Object[] obj) { + SysRole role = (SysRole) obj[0]; + identityService.deleteGroup(role.getId()); + Group group = new GroupEntity(); + group.setId(role.getId()); + group.setName(role.getRoleName()); + identityService.saveGroup(group); + } + + /**********************角色处理end***************************/ } diff --git a/len-activiti/src/main/java/com/len/config/ActPropertiesConfig.java b/len-activiti/src/main/java/com/len/config/ActPropertiesConfig.java index cdd1ed6..018d8d0 100644 --- a/len-activiti/src/main/java/com/len/config/ActPropertiesConfig.java +++ b/len-activiti/src/main/java/com/len/config/ActPropertiesConfig.java @@ -21,26 +21,25 @@ import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; /** - * * 可以自定义一些配置类 */ @Configuration @PropertySource("classpath:properties\\activiti.properties") public class ActPropertiesConfig { - @Value("${modelId}") - private String modelId; + @Value("${modelId}") + private String modelId; - public String getModelId() { - return modelId; - } + public String getModelId() { + return modelId; + } - public void setModelId(String modelId) { - this.modelId = modelId; - } + public void setModelId(String modelId) { + this.modelId = modelId; + } - @Bean - public ActPropertiesConfig getActPropertiesConfig(){ - return new ActPropertiesConfig(); - } + @Bean + public ActPropertiesConfig getActPropertiesConfig() { + return new ActPropertiesConfig(); + } } diff --git a/len-activiti/src/main/java/com/len/config/ActivitiConfig.java b/len-activiti/src/main/java/com/len/config/ActivitiConfig.java index bc37a6d..b823f92 100644 --- a/len-activiti/src/main/java/com/len/config/ActivitiConfig.java +++ b/len-activiti/src/main/java/com/len/config/ActivitiConfig.java @@ -1,21 +1,8 @@ package com.len.config; import com.fasterxml.jackson.databind.ObjectMapper; - -import javax.sql.DataSource; - -import org.activiti.engine.DynamicBpmnService; -import org.activiti.engine.FormService; -import org.activiti.engine.HistoryService; -import org.activiti.engine.IdentityService; -import org.activiti.engine.ManagementService; -import org.activiti.engine.ProcessEngine; -import org.activiti.engine.ProcessEngineConfiguration; -import org.activiti.engine.RepositoryService; -import org.activiti.engine.RuntimeService; -import org.activiti.engine.TaskService; +import org.activiti.engine.*; import org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl; -import org.activiti.image.HMProcessDiagramGenerator; import org.activiti.image.impl.DefaultProcessDiagramGenerator; import org.activiti.spring.ProcessEngineFactoryBean; import org.activiti.spring.SpringProcessEngineConfiguration; @@ -23,8 +10,8 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.transaction.PlatformTransactionManager; -import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; + +import javax.sql.DataSource; /** * Created by liuruijie on 2017/2/20. @@ -33,83 +20,83 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter @Configuration public class ActivitiConfig { - @Value("${dataType}") - private String dataType; - - /** - * spring 集成 activiti - */ - @Bean - public ProcessEngineConfiguration processEngineConfiguration(DataSource dataSource, PlatformTransactionManager transactionManager) { - SpringProcessEngineConfiguration processEngineConfiguration = new SpringProcessEngineConfiguration(); - processEngineConfiguration.setDataSource(dataSource); - //表不存在创建表 - processEngineConfiguration.setDatabaseSchemaUpdate("true"); - //指定数据库 - processEngineConfiguration.setDatabaseType(dataType); - processEngineConfiguration.setTransactionManager(transactionManager); - //历史变量 - processEngineConfiguration.setHistory("full"); - //指定字体 - processEngineConfiguration.setActivityFontName("宋体"); - processEngineConfiguration.setAnnotationFontName("宋体"); - processEngineConfiguration.setLabelFontName("宋体"); - - processEngineConfiguration.setProcessDiagramGenerator(new DefaultProcessDiagramGenerator()); - - return processEngineConfiguration; - } - - //流程引擎,与spring整合使用factoryBean - @Bean - public ProcessEngineFactoryBean processEngine(ProcessEngineConfiguration processEngineConfiguration) { - ProcessEngineFactoryBean processEngineFactoryBean = new ProcessEngineFactoryBean(); - processEngineFactoryBean.setProcessEngineConfiguration((ProcessEngineConfigurationImpl) processEngineConfiguration); - return processEngineFactoryBean; - } - - @Bean - public RepositoryService repositoryService(ProcessEngine processEngine) { - return processEngine.getRepositoryService(); - } - - @Bean - public RuntimeService runtimeService(ProcessEngine processEngine) { - return processEngine.getRuntimeService(); - } - - @Bean - public TaskService taskService(ProcessEngine processEngine) { - return processEngine.getTaskService(); - } - - @Bean - public HistoryService historyService(ProcessEngine processEngine) { - return processEngine.getHistoryService(); - } - - @Bean - public FormService formService(ProcessEngine processEngine) { - return processEngine.getFormService(); - } - - @Bean - public IdentityService identityService(ProcessEngine processEngine) { - return processEngine.getIdentityService(); - } - - @Bean - public ManagementService managementService(ProcessEngine processEngine) { - return processEngine.getManagementService(); - } - - @Bean - public DynamicBpmnService dynamicBpmnService(ProcessEngine processEngine) { - return processEngine.getDynamicBpmnService(); - } - - @Bean - public ObjectMapper objectMapper() { - return new ObjectMapper(); - } + @Value("${dataType}") + private String dataType; + + /** + * spring 集成 activiti + */ + @Bean + public ProcessEngineConfiguration processEngineConfiguration(DataSource dataSource, PlatformTransactionManager transactionManager) { + SpringProcessEngineConfiguration processEngineConfiguration = new SpringProcessEngineConfiguration(); + processEngineConfiguration.setDataSource(dataSource); + //表不存在创建表 + processEngineConfiguration.setDatabaseSchemaUpdate("true"); + //指定数据库 + processEngineConfiguration.setDatabaseType(dataType); + processEngineConfiguration.setTransactionManager(transactionManager); + //历史变量 + processEngineConfiguration.setHistory("full"); + //指定字体 + processEngineConfiguration.setActivityFontName("宋体"); + processEngineConfiguration.setAnnotationFontName("宋体"); + processEngineConfiguration.setLabelFontName("宋体"); + + processEngineConfiguration.setProcessDiagramGenerator(new DefaultProcessDiagramGenerator()); + + return processEngineConfiguration; + } + + //流程引擎,与spring整合使用factoryBean + @Bean + public ProcessEngineFactoryBean processEngine(ProcessEngineConfiguration processEngineConfiguration) { + ProcessEngineFactoryBean processEngineFactoryBean = new ProcessEngineFactoryBean(); + processEngineFactoryBean.setProcessEngineConfiguration((ProcessEngineConfigurationImpl) processEngineConfiguration); + return processEngineFactoryBean; + } + + @Bean + public RepositoryService repositoryService(ProcessEngine processEngine) { + return processEngine.getRepositoryService(); + } + + @Bean + public RuntimeService runtimeService(ProcessEngine processEngine) { + return processEngine.getRuntimeService(); + } + + @Bean + public TaskService taskService(ProcessEngine processEngine) { + return processEngine.getTaskService(); + } + + @Bean + public HistoryService historyService(ProcessEngine processEngine) { + return processEngine.getHistoryService(); + } + + @Bean + public FormService formService(ProcessEngine processEngine) { + return processEngine.getFormService(); + } + + @Bean + public IdentityService identityService(ProcessEngine processEngine) { + return processEngine.getIdentityService(); + } + + @Bean + public ManagementService managementService(ProcessEngine processEngine) { + return processEngine.getManagementService(); + } + + @Bean + public DynamicBpmnService dynamicBpmnService(ProcessEngine processEngine) { + return processEngine.getDynamicBpmnService(); + } + + @Bean + public ObjectMapper objectMapper() { + return new ObjectMapper(); + } } diff --git a/len-activiti/src/main/java/com/len/controller/ActivitiController.java b/len-activiti/src/main/java/com/len/controller/ActivitiController.java index 70b477e..9c12baa 100644 --- a/len-activiti/src/main/java/com/len/controller/ActivitiController.java +++ b/len-activiti/src/main/java/com/len/controller/ActivitiController.java @@ -74,394 +74,382 @@ import java.util.*; @RequestMapping(value = "/act") public class ActivitiController extends BaseController { - @Autowired - private RepositoryService repositoryService; - - @Autowired - private ObjectMapper objectMapper; - - @Autowired - private IdentityService identityService; - - @Autowired - private SysUserService userService; - - @Autowired - private RoleService roleService; - - @Autowired - private RoleUserService roleUserService; - - @Autowired - private ActAssigneeService actAssigneeService; - - @Autowired - ActivitiService activitiService; - - - /** - * 同步用户 角色 用户角色到activiti表中 - */ - @PostMapping(value = "syncdata") - @ResponseBody - public LenResponse syncdata() { - LenResponse j = new LenResponse(); - try { - List userList = userService.list(); - User au; - for (SysUser user : userList) { - au = new UserEntity(); - au.setId(user.getId()); + @Autowired + ActivitiService activitiService; + @Autowired + ActPropertiesConfig actPropertiesConfig; + @Autowired + private RepositoryService repositoryService; + @Autowired + private ObjectMapper objectMapper; + @Autowired + private IdentityService identityService; + @Autowired + private SysUserService userService; + @Autowired + private RoleService roleService; + @Autowired + private RoleUserService roleUserService; + @Autowired + private ActAssigneeService actAssigneeService; + + /** + * 同步用户 角色 用户角色到activiti表中 + */ + @PostMapping(value = "syncdata") + @ResponseBody + public LenResponse syncdata() { + LenResponse j = new LenResponse(); + try { + List userList = userService.list(); + User au; + for (SysUser user : userList) { + au = new UserEntity(); + au.setId(user.getId()); // au.setFirstName(user.getRealName()); - au.setEmail(user.getEmail()); - identityService.deleteUser(au.getId()); - identityService.saveUser(au); - } - List sysRoleList = roleService.list(); - Group group; - for (SysRole role : sysRoleList) { - group = new GroupEntity(); - group.setId(role.getId()); - group.setName(role.getRoleName()); - identityService.deleteGroup(group.getId()); - identityService.saveGroup(group); - } - List roleUserList = roleUserService.list(); - - for (SysRoleUser sysRoleUser : roleUserList) { - identityService.deleteMembership(sysRoleUser.getUserId(), sysRoleUser.getRoleId()); - identityService.createMembership(sysRoleUser.getUserId(), sysRoleUser.getRoleId()); - } - j.setMsg("同步成功"); - } catch (LenException e) { - j.setFlag(false); - j.setMsg("同步失败"); - e.printStackTrace(); - } - return j; - } - - - @GetMapping(value = "goActiviti") - public String goActiviti() throws UnsupportedEncodingException { - Model model = repositoryService.newModel(); - - String name = "新建流程"; - String description = ""; - int revision = 1; - String key = "processKey"; - - ObjectNode modelNode = objectMapper.createObjectNode(); - modelNode.put(ModelDataJsonConstants.MODEL_NAME, name); - modelNode.put(ModelDataJsonConstants.MODEL_DESCRIPTION, description); - modelNode.put(ModelDataJsonConstants.MODEL_REVISION, revision); - - model.setName(name); - model.setKey(key); - model.setMetaInfo(modelNode.toString()); - - repositoryService.saveModel(model); - String id = model.getId(); - - //完善ModelEditorSource - JSONObject editor = new JSONObject(); - editor.put("id", "canvas"); - editor.put("resourceId", "canvas"); - JSONObject stencil = new JSONObject(); - stencil.put("namespace", "http://lenosp.cn#"); - editor.put("stencilset", stencil); - repositoryService.addModelEditorSource(id, editor.toString().getBytes(StandardCharsets.UTF_8)); - return "redirect:/static/modeler.html?modelId=" + id; - } - - @GetMapping("actUpdate/{id}") - public String actUpdate(@PathVariable String id) { - return "redirect:/static/modeler.html?modelId=" + id; - } - - @GetMapping(value = "goAct") - public String goAct(org.springframework.ui.Model model) { - return "/actList"; - } - - /** - * 部署列表 - */ - @GetMapping(value = "showAct") - @ResponseBody - public ReType showAct(org.springframework.ui.Model model, ProcessDefinition definition, - String page, String limit) { - ProcessDefinitionQuery processDefinitionQuery = repositoryService - .createProcessDefinitionQuery(); - List processDefinitionList = null; - if (definition != null) { - if (!StringUtils.isEmpty(definition.getDeploymentId())) { - processDefinitionQuery.deploymentId(definition.getDeploymentId()); - } - if (!StringUtils.isEmpty(definition.getName())) { - processDefinitionQuery.processDefinitionNameLike("%" + definition.getName() + "%"); - - } - } - processDefinitionList = processDefinitionQuery.listPage(Integer.valueOf(limit) * (Integer.valueOf(page) - 1), Integer.valueOf(limit)); - long count = repositoryService.createProcessDefinitionQuery().count(); + au.setEmail(user.getEmail()); + identityService.deleteUser(au.getId()); + identityService.saveUser(au); + } + List sysRoleList = roleService.list(); + Group group; + for (SysRole role : sysRoleList) { + group = new GroupEntity(); + group.setId(role.getId()); + group.setName(role.getRoleName()); + identityService.deleteGroup(group.getId()); + identityService.saveGroup(group); + } + List roleUserList = roleUserService.list(); + + for (SysRoleUser sysRoleUser : roleUserList) { + identityService.deleteMembership(sysRoleUser.getUserId(), sysRoleUser.getRoleId()); + identityService.createMembership(sysRoleUser.getUserId(), sysRoleUser.getRoleId()); + } + j.setMsg("同步成功"); + } catch (LenException e) { + j.setFlag(false); + j.setMsg("同步失败"); + e.printStackTrace(); + } + return j; + } + + @GetMapping(value = "goActiviti") + public String goActiviti() throws UnsupportedEncodingException { + Model model = repositoryService.newModel(); + + String name = "新建流程"; + String description = ""; + int revision = 1; + String key = "processKey"; + + ObjectNode modelNode = objectMapper.createObjectNode(); + modelNode.put(ModelDataJsonConstants.MODEL_NAME, name); + modelNode.put(ModelDataJsonConstants.MODEL_DESCRIPTION, description); + modelNode.put(ModelDataJsonConstants.MODEL_REVISION, revision); + + model.setName(name); + model.setKey(key); + model.setMetaInfo(modelNode.toString()); + + repositoryService.saveModel(model); + String id = model.getId(); + + //完善ModelEditorSource + JSONObject editor = new JSONObject(); + editor.put("id", "canvas"); + editor.put("resourceId", "canvas"); + JSONObject stencil = new JSONObject(); + stencil.put("namespace", "http://lenosp.cn#"); + editor.put("stencilset", stencil); + repositoryService.addModelEditorSource(id, editor.toString().getBytes(StandardCharsets.UTF_8)); + return "redirect:/static/modeler.html?modelId=" + id; + } + + @GetMapping("actUpdate/{id}") + public String actUpdate(@PathVariable String id) { + return "redirect:/static/modeler.html?modelId=" + id; + } + + @GetMapping(value = "goAct") + public String goAct(org.springframework.ui.Model model) { + return "/actList"; + } + + /** + * 部署列表 + */ + @GetMapping(value = "showAct") + @ResponseBody + public ReType showAct(org.springframework.ui.Model model, ProcessDefinition definition, + String page, String limit) { + ProcessDefinitionQuery processDefinitionQuery = repositoryService + .createProcessDefinitionQuery(); + List processDefinitionList = null; + if (definition != null) { + if (!StringUtils.isEmpty(definition.getDeploymentId())) { + processDefinitionQuery.deploymentId(definition.getDeploymentId()); + } + if (!StringUtils.isEmpty(definition.getName())) { + processDefinitionQuery.processDefinitionNameLike("%" + definition.getName() + "%"); + + } + } + processDefinitionList = processDefinitionQuery.listPage(Integer.valueOf(limit) * (Integer.valueOf(page) - 1), Integer.valueOf(limit)); + long count = repositoryService.createProcessDefinitionQuery().count(); // long count = repositoryService.createDeploymentQuery().count(); - List list = new ArrayList<>(); - processDefinitionList - .forEach(processDefinition -> list.add(new ProcessDefinition(processDefinition))); - return new ReType(count, list); - } - - - @GetMapping(value = "goActModel") - public String goActModel(org.springframework.ui.Model model) { - return "/actModelList"; - } - - /** - * 模型列表 - */ - @GetMapping(value = "showAm") - @ResponseBody - public ReType showModel(org.springframework.ui.Model model, ActModel actModel, String page, - String limit) { - ModelQuery modelQuery = repositoryService.createModelQuery(); - if (actModel != null) { - if (!StringUtils.isEmpty(actModel.getKey())) { - modelQuery.modelKey(actModel.getKey()); - } - if (!StringUtils.isEmpty(actModel.getName())) { - modelQuery.modelNameLike("%" + actModel.getName() + "%"); - } - } - List models = modelQuery - .listPage(Integer.valueOf(limit) * (Integer.valueOf(page) - 1), Integer.valueOf(limit)); - long count = repositoryService.createModelQuery().count(); - List list = new ArrayList<>(); - models.forEach(mo -> list.add(new ActModel(mo))); - return new ReType(count, list); - } - - /** - * 发布流程 - */ - @PostMapping(value = "open") - @ResponseBody - public LenResponse open(String id) { - String msg = "发布成功"; - LenResponse j = new LenResponse(); - try { - Model modelData = repositoryService.getModel(id); - byte[] bytes = repositoryService.getModelEditorSource(modelData.getId()); - - if (bytes == null) { - return LenResponse.error("模型为空"); - } - JsonNode modelNode = null; - modelNode = new ObjectMapper().readTree(bytes); - BpmnModel model = new BpmnJsonConverter().convertToBpmnModel(modelNode); - if (model.getProcesses().size() == 0) { - return LenResponse.error("数据不符合要求"); - } - byte[] bpmnBytes = new BpmnXMLConverter().convertToXML(model); - //发布流程 - String processName = modelData.getName() + ".bpmn20.xml"; - String convertToXML = new String(bpmnBytes); - - System.out.println(convertToXML); - Deployment deployment = repositoryService.createDeployment() - .name(modelData.getName()) - .addString(processName, new String(bpmnBytes, "UTF-8")) - .deploy(); - modelData.setDeploymentId(deployment.getId()); - repositoryService.saveModel(modelData); - } catch (LenException e) { - msg = "发布数失败"; - j.setFlag(false); - } catch (IOException e) { - e.printStackTrace(); - } - j.setMsg(msg); - return j; - } - - - /** - * 根据流程部署id获取节点并且传到前端 - * - * @param deploymentId 部署id - * @param model - * @return - */ - @GetMapping("goAssignee/{deploymentId}") - public String goAssignee(@PathVariable("deploymentId") String deploymentId, - org.springframework.ui.Model model) { - /**根据流程实例id查询出所有流程节点*/ - List activityList = actAssigneeService.getActivityList(deploymentId); - /**角色和节点关系封装成list*/ - List roleList = roleService.list(); - Checkbox checkbox = null; - Map map = null; - List> mapList = new ArrayList<>(); - List assigneeList = null; - List checkboxList = null; - for (ActivityImpl activiti : activityList) { - map = new HashMap<>(); - String name = (String) activiti.getProperty("name"); - if (StringUtils.isEmpty(name) || "start".equals(name) || "end".equals(name)) { - continue; - } - //节点id 、name、节点目前关联的角色 封装成进map - String nodeId = activiti.getId(); - assigneeList = actAssigneeService.list(new QueryWrapper<>(new ActAssignee(nodeId))); - List strings = new ArrayList<>(); - assigneeList.forEach(actAssignee1 -> strings.add(actAssignee1.getRoleId())); - map.put("id", nodeId); - map.put("name", name); - checkboxList = new ArrayList<>(); - for (SysRole role : roleList) { - checkbox = new Checkbox(); - checkbox.setId(role.getId()); - checkbox.setName(role.getRoleName()); - if (strings.contains(role.getId())) { - checkbox.setCheck(true); - } - checkboxList.add(checkbox); - } - map.put("boxJson", checkboxList); - mapList.add(map); - } - model.addAttribute("actList", mapList); - - return "act/deploy/act-node"; - } - - /** - * 节点更新配置办理者(人/组) - * - * @param request - * @return - */ - @PostMapping("goAssignee/updateNode") - @ResponseBody - public LenResponse updateNode(HttpServletRequest request) { - LenResponse j = new LenResponse(); - - Map map = request.getParameterMap(); - List assigneeList = new ArrayList<>(); - ActAssignee assignee = null; - for (Map.Entry entry : map.entrySet()) { - assignee = new ActAssignee(); - int sub = entry.getKey().lastIndexOf("_"); - String nodeId = entry.getKey().substring(0, sub); - nodeId = nodeId.substring(nodeId.lastIndexOf("_") + 1, nodeId.length()); - String nodeName = entry.getKey().substring(entry.getKey().lastIndexOf("_") + 1, entry.getKey().length()); - //更新进list - assignee.setAssigneeType(3); - assignee.setRoleId(entry.getValue()[0]); - assignee.setSid(nodeId); - assignee.setActivtiName(nodeName); - //先清除 - actAssigneeService.deleteByNodeId(nodeId); - assigneeList.add(assignee); - } - //后添加 在map循环里添加 多角色会导致添加了的再次被删除 so 要拿出来 - for (ActAssignee actAssignee : assigneeList) { - actAssigneeService.save(actAssignee); - } - j.setMsg("更新成功"); - return j; - } - - /** - * 删除流程定义 级联 删除 流程节点绑定信息 - * - * @param model - * @param id - * @return - */ - @PostMapping("delDeploy") - @ResponseBody - public LenResponse delDeploy(org.springframework.ui.Model model, String id) { - LenResponse j = new LenResponse(); - try { - List activityList = actAssigneeService.getActivityList(id); - for (ActivityImpl activity : activityList) { - String nodeId = activity.getId(); - if (StringUtils.isEmpty(nodeId) || "start".equals(nodeId) || "end".equals(nodeId)) { - continue; - } - /**接触节点和代办关联*/ - actAssigneeService.deleteByNodeId(nodeId); - } - repositoryService.deleteDeployment(id, true); - j.setMsg("删除成功"); - } catch (LenException e) { - j.setMsg("删除失败"); - j.setFlag(false); - e.printStackTrace(); - } - return j; - } - - @Autowired - ActPropertiesConfig actPropertiesConfig; - - @GetMapping("shinePics/{processInstanceId}") - public String shinePics(org.springframework.ui.Model model, @PathVariable String processInstanceId) { - model.addAttribute("processInstanceId", processInstanceId); - return "/act/activiti/shinePics"; - } - - @GetMapping("getShineProcImage") - @ResponseBody - public JSONObject getShineProcImage(HttpServletRequest request, HttpServletResponse resp, String processInstanceId) - throws IOException { - JSONObject result = new JSONObject(); - JSONArray shineProImages = new JSONArray(); - InputStream imageStream = activitiService.generateStream(processInstanceId, true); - if (imageStream != null) { - String imageCurrentNode = Base64Utils.ioToBase64(imageStream); - if (StringUtils.isNotBlank(imageCurrentNode)) { - shineProImages.add(imageCurrentNode); - } - } - InputStream imageNoCurrentStream = activitiService.generateStream(processInstanceId, false); - if (imageNoCurrentStream != null) { - String imageNoCurrentNode = Base64Utils.ioToBase64(imageNoCurrentStream); - if (StringUtils.isNotBlank(imageNoCurrentNode)) { - shineProImages.add(imageNoCurrentNode); - } - } - - List taskSqu = activitiService.getTaskSqu(processInstanceId); - - - result.put("id", UUID.randomUUID().toString()); - result.put("errorNo", 0); - result.put("images", shineProImages); - result.put("taskSqu", taskSqu); - return result; - } - - @PostMapping("delModel") - @ResponseBody - public LenResponse delModel(String id) { - String modelId = actPropertiesConfig.getModelId(); - if (id.equals(modelId)) { - return LenResponse.error("演示禁止删除"); - } - LenResponse j = new LenResponse(); - try { - repositoryService.deleteModel(id); - j.setMsg("删除成功"); - } catch (LenException e) { - j.setMsg("删除失败"); - j.setFlag(false); - e.printStackTrace(); - } - return j; - } + List list = new ArrayList<>(); + processDefinitionList + .forEach(processDefinition -> list.add(new ProcessDefinition(processDefinition))); + return new ReType(count, list); + } + + @GetMapping(value = "goActModel") + public String goActModel(org.springframework.ui.Model model) { + return "/actModelList"; + } + + /** + * 模型列表 + */ + @GetMapping(value = "showAm") + @ResponseBody + public ReType showModel(org.springframework.ui.Model model, ActModel actModel, String page, + String limit) { + ModelQuery modelQuery = repositoryService.createModelQuery(); + if (actModel != null) { + if (!StringUtils.isEmpty(actModel.getKey())) { + modelQuery.modelKey(actModel.getKey()); + } + if (!StringUtils.isEmpty(actModel.getName())) { + modelQuery.modelNameLike("%" + actModel.getName() + "%"); + } + } + List models = modelQuery + .listPage(Integer.valueOf(limit) * (Integer.valueOf(page) - 1), Integer.valueOf(limit)); + long count = repositoryService.createModelQuery().count(); + List list = new ArrayList<>(); + models.forEach(mo -> list.add(new ActModel(mo))); + return new ReType(count, list); + } + + /** + * 发布流程 + */ + @PostMapping(value = "open") + @ResponseBody + public LenResponse open(String id) { + String msg = "发布成功"; + LenResponse j = new LenResponse(); + try { + Model modelData = repositoryService.getModel(id); + byte[] bytes = repositoryService.getModelEditorSource(modelData.getId()); + + if (bytes == null) { + return LenResponse.error("模型为空"); + } + JsonNode modelNode = null; + modelNode = new ObjectMapper().readTree(bytes); + BpmnModel model = new BpmnJsonConverter().convertToBpmnModel(modelNode); + if (model.getProcesses().size() == 0) { + return LenResponse.error("数据不符合要求"); + } + byte[] bpmnBytes = new BpmnXMLConverter().convertToXML(model); + //发布流程 + String processName = modelData.getName() + ".bpmn20.xml"; + String convertToXML = new String(bpmnBytes); + + System.out.println(convertToXML); + Deployment deployment = repositoryService.createDeployment() + .name(modelData.getName()) + .addString(processName, new String(bpmnBytes, "UTF-8")) + .deploy(); + modelData.setDeploymentId(deployment.getId()); + repositoryService.saveModel(modelData); + } catch (LenException e) { + msg = "发布数失败"; + j.setFlag(false); + } catch (IOException e) { + e.printStackTrace(); + } + j.setMsg(msg); + return j; + } + + /** + * 根据流程部署id获取节点并且传到前端 + * + * @param deploymentId 部署id + * @param model + * @return + */ + @GetMapping("goAssignee/{deploymentId}") + public String goAssignee(@PathVariable("deploymentId") String deploymentId, + org.springframework.ui.Model model) { + /**根据流程实例id查询出所有流程节点*/ + List activityList = actAssigneeService.getActivityList(deploymentId); + /**角色和节点关系封装成list*/ + List roleList = roleService.list(); + Checkbox checkbox = null; + Map map = null; + List> mapList = new ArrayList<>(); + List assigneeList = null; + List checkboxList = null; + for (ActivityImpl activiti : activityList) { + map = new HashMap<>(); + String name = (String) activiti.getProperty("name"); + if (StringUtils.isEmpty(name) || "start".equals(name) || "end".equals(name)) { + continue; + } + //节点id 、name、节点目前关联的角色 封装成进map + String nodeId = activiti.getId(); + assigneeList = actAssigneeService.list(new QueryWrapper<>(new ActAssignee(nodeId))); + List strings = new ArrayList<>(); + assigneeList.forEach(actAssignee1 -> strings.add(actAssignee1.getRoleId())); + map.put("id", nodeId); + map.put("name", name); + checkboxList = new ArrayList<>(); + for (SysRole role : roleList) { + checkbox = new Checkbox(); + checkbox.setId(role.getId()); + checkbox.setName(role.getRoleName()); + if (strings.contains(role.getId())) { + checkbox.setCheck(true); + } + checkboxList.add(checkbox); + } + map.put("boxJson", checkboxList); + mapList.add(map); + } + model.addAttribute("actList", mapList); + + return "act/deploy/act-node"; + } + + /** + * 节点更新配置办理者(人/组) + * + * @param request + * @return + */ + @PostMapping("goAssignee/updateNode") + @ResponseBody + public LenResponse updateNode(HttpServletRequest request) { + LenResponse j = new LenResponse(); + + Map map = request.getParameterMap(); + List assigneeList = new ArrayList<>(); + ActAssignee assignee = null; + for (Map.Entry entry : map.entrySet()) { + assignee = new ActAssignee(); + int sub = entry.getKey().lastIndexOf("_"); + String nodeId = entry.getKey().substring(0, sub); + nodeId = nodeId.substring(nodeId.lastIndexOf("_") + 1, nodeId.length()); + String nodeName = entry.getKey().substring(entry.getKey().lastIndexOf("_") + 1, entry.getKey().length()); + //更新进list + assignee.setAssigneeType(3); + assignee.setRoleId(entry.getValue()[0]); + assignee.setSid(nodeId); + assignee.setActivtiName(nodeName); + //先清除 + actAssigneeService.deleteByNodeId(nodeId); + assigneeList.add(assignee); + } + //后添加 在map循环里添加 多角色会导致添加了的再次被删除 so 要拿出来 + for (ActAssignee actAssignee : assigneeList) { + actAssigneeService.save(actAssignee); + } + j.setMsg("更新成功"); + return j; + } + + /** + * 删除流程定义 级联 删除 流程节点绑定信息 + * + * @param model + * @param id + * @return + */ + @PostMapping("delDeploy") + @ResponseBody + public LenResponse delDeploy(org.springframework.ui.Model model, String id) { + LenResponse j = new LenResponse(); + try { + List activityList = actAssigneeService.getActivityList(id); + for (ActivityImpl activity : activityList) { + String nodeId = activity.getId(); + if (StringUtils.isEmpty(nodeId) || "start".equals(nodeId) || "end".equals(nodeId)) { + continue; + } + /**接触节点和代办关联*/ + actAssigneeService.deleteByNodeId(nodeId); + } + repositoryService.deleteDeployment(id, true); + j.setMsg("删除成功"); + } catch (LenException e) { + j.setMsg("删除失败"); + j.setFlag(false); + e.printStackTrace(); + } + return j; + } + + @GetMapping("shinePics/{processInstanceId}") + public String shinePics(org.springframework.ui.Model model, @PathVariable String processInstanceId) { + model.addAttribute("processInstanceId", processInstanceId); + return "/act/activiti/shinePics"; + } + + @GetMapping("getShineProcImage") + @ResponseBody + public JSONObject getShineProcImage(HttpServletRequest request, HttpServletResponse resp, String processInstanceId) + throws IOException { + JSONObject result = new JSONObject(); + JSONArray shineProImages = new JSONArray(); + InputStream imageStream = activitiService.generateStream(processInstanceId, true); + if (imageStream != null) { + String imageCurrentNode = Base64Utils.ioToBase64(imageStream); + if (StringUtils.isNotBlank(imageCurrentNode)) { + shineProImages.add(imageCurrentNode); + } + } + InputStream imageNoCurrentStream = activitiService.generateStream(processInstanceId, false); + if (imageNoCurrentStream != null) { + String imageNoCurrentNode = Base64Utils.ioToBase64(imageNoCurrentStream); + if (StringUtils.isNotBlank(imageNoCurrentNode)) { + shineProImages.add(imageNoCurrentNode); + } + } + + List taskSqu = activitiService.getTaskSqu(processInstanceId); + + + result.put("id", UUID.randomUUID().toString()); + result.put("errorNo", 0); + result.put("images", shineProImages); + result.put("taskSqu", taskSqu); + return result; + } + + @PostMapping("delModel") + @ResponseBody + public LenResponse delModel(String id) { + String modelId = actPropertiesConfig.getModelId(); + if (id.equals(modelId)) { + return LenResponse.error("演示禁止删除"); + } + LenResponse j = new LenResponse(); + try { + repositoryService.deleteModel(id); + j.setMsg("删除成功"); + } catch (LenException e) { + j.setMsg("删除失败"); + j.setFlag(false); + e.printStackTrace(); + } + return j; + } } diff --git a/len-activiti/src/main/java/com/len/controller/UserLeaveController.java b/len-activiti/src/main/java/com/len/controller/UserLeaveController.java index 25a92cd..d572f36 100644 --- a/len-activiti/src/main/java/com/len/controller/UserLeaveController.java +++ b/len-activiti/src/main/java/com/len/controller/UserLeaveController.java @@ -61,8 +61,8 @@ import java.awt.*; import java.awt.image.BufferedImage; import java.io.IOException; import java.io.InputStream; -import java.util.*; import java.util.List; +import java.util.*; /** * @author zhuxiaomeng @@ -75,498 +75,493 @@ import java.util.List; @RequestMapping("/leave") public class UserLeaveController extends BaseController { - @Autowired - UserLeaveService leaveService; - - @Autowired - RuntimeService runtimeService; - - @Autowired - TaskService taskService; - - @Autowired - IdentityService identityService; - - @Autowired - RepositoryService repositoryService; - - @Autowired - ProcessEngineFactoryBean processEngine; - - @Autowired - ProcessEngineConfiguration processEngineConfiguration; - - @Autowired - RoleUserService roleUserService; - - private String leaveOpinionList = "leaveOpinionList"; - - - @GetMapping(value = "showMain") - public String showMain(Model model) { - return "/dashboard/dashboard"; - } - - - @GetMapping(value = "showMain2") - public String showMain2(Model model) { - return "/dashboard/dashboard2"; - } - - @GetMapping(value = "showLeave") - public String showUser(Model model) { - return "/act/leave/leaveList"; - } - - @GetMapping(value = "showLeaveList") - @ResponseBody - public ReType showLeaveList(UserLeave userLeave, String page, String limit) { - String userId = CommonUtil.getUser().getId(); - userLeave.setUserId(userId); - List tList = null; - Page tPage = PageHelper.startPage(Integer.valueOf(page), Integer.valueOf(limit)); - try { - tList = leaveService.selectListByPage(userLeave); - for (UserLeave leave : tList) { - ProcessInstance instance = runtimeService.createProcessInstanceQuery() - .processInstanceId(leave.getProcessInstanceId()).singleResult(); - //保证运行ing - if (instance != null) { - Task task = this.taskService.createTaskQuery().processInstanceId(leave.getProcessInstanceId()).singleResult(); - leave.setTaskName(task.getName()); - } - } - } catch (LenException e) { - e.printStackTrace(); - } - return new ReType(tPage.getTotal(), tList); - } - - /** - * 根据 执行对象id获取审批信息 - * - * @param model - * @param processId - * @return - */ - @GetMapping("leaveDetail") - public String leaveDetail(Model model, String processId) { - ProcessInstance instance = runtimeService.createProcessInstanceQuery() - .processInstanceId(processId).singleResult(); - //保证运行ing - List leaveList = null; - if (instance != null) { - Task task = this.taskService.createTaskQuery().processInstanceId(processId).singleResult(); - Map variables = taskService.getVariables(task.getId()); - Object o = variables.get(leaveOpinionList); - if (o != null) { - /*获取历史审核信息*/ - leaveList = (List) o; - } - } else { - leaveList = new ArrayList<>(); - List list = historyService.createHistoricDetailQuery(). - processInstanceId(processId).list(); - HistoricVariableUpdate variable = null; - for (HistoricDetail historicDetail : list) { - variable = (HistoricVariableUpdate) historicDetail; - if (leaveOpinionList.equals(variable.getVariableName())) { - leaveList.clear(); - leaveList.addAll((List) variable.getValue()); - } - } - } - model.addAttribute("leaveDetail", JSON.toJSONString(leaveList)); - return "/act/leave/leaveDetail"; - } - - @GetMapping("addLeave") - public String addLeave() { - return "/act/leave/add-leave"; - } - - @GetMapping("updateLeave/{taskId}") - public String updateLeave(Model model, @PathVariable String taskId) { - Map variables = taskService.getVariables(taskId); - BaseTask baseTask = (BaseTask) variables.get("baseTask"); - UserLeave leave = leaveService.getById(baseTask.getId()); - model.addAttribute("leave", leave); - model.addAttribute("taskId", taskId); - return "/act/leave/update-leave"; - } - - @PostMapping("updateLeave/updateLeave/{taskId}/{id}/{flag}") - @ResponseBody - public LenResponse updateLeave(UserLeave leave, @PathVariable String taskId, @PathVariable String id, @PathVariable boolean flag) { - LenResponse j = new LenResponse(); - try { - UserLeave oldLeave = leaveService.getById(leave.getId()); - BeanUtil.copyNotNullBean(leave, oldLeave); - QueryWrapper userLeaveQueryWrapper = new QueryWrapper<>(oldLeave); - leaveService.update(userLeaveQueryWrapper); - - Map variables = taskService.getVariables(taskId); - Map map = new HashMap<>(); - if (flag) { - map.put("flag", true); - } else { - map.put("flag", false); - } - taskService.complete(taskId, map); - j.setMsg("保存成功"); - } catch (LenException e) { - j.setMsg("保存失败"); - j.setFlag(false); - e.printStackTrace(); - } - return j; - } - - - @PostMapping("addLeave") - @ResponseBody - public LenResponse addLeave(UserLeave userLeave) { - LenResponse j = new LenResponse(); - if (userLeave == null) { - return LenResponse.error("获取数据失败"); - } - long beginTime = userLeave.getBeginTime().getTime(); - long endTime = userLeave.getEndTime().getTime(); - int days = 1; - if (endTime != beginTime) { - days += (int) ((endTime - beginTime) / (1000 * 60 * 60 * 24)); - } - if (days <= 0) { - return LenResponse.error("时间输入有误"); - } - - userLeave.setDays(days); - CurrentUser user = CommonUtil.getUser(); - userLeave.setUserId(user.getId()); - userLeave.setUserName(user.getUsername()); - userLeave.setProcessInstanceId("2018"); - leaveService.save(userLeave); - Map map = new HashMap<>(); - userLeave.setUrlpath("/leave/readOnlyLeave/" + userLeave.getId()); - map.put("baseTask", userLeave); - map.put("day", days); - ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("process_leave", map); - userLeave.setProcessInstanceId(processInstance.getId()); - userLeave.setUrlpath("/leave/readOnlyLeave/" + userLeave.getId()); - leaveService.updateById(userLeave); - j.setMsg("请假申请成功"); - return j; - } - - @GetMapping("readOnlyLeave/{billId}") - public String readOnlyLeave(Model model, @PathVariable String billId) { - UserLeave leave = leaveService.getById(billId); - model.addAttribute("leave", leave); - return "/act/leave/update-leave-readonly"; - } - - /** - * ---------我的任务--------- - */ - @GetMapping(value = "showTask") - public String showTask(Model model) { - return "/act/task/taskList"; - } - - @GetMapping(value = "showTaskList") - @ResponseBody - public String showTaskList(Model model, com.len.entity.Task task, String page, String limit) { - CurrentUser user = CommonUtil.getUser(); - SysRoleUser sysRoleUser = new SysRoleUser(); - sysRoleUser.setUserId(user.getId()); - QueryWrapper queryWrapper = new QueryWrapper<>(sysRoleUser); - List userRoles = roleUserService.list(queryWrapper); - List roleString = new ArrayList<>(); - for (SysRoleUser sru : userRoles) { - roleString.add(sru.getRoleId()); - } - List taskList = taskService.createTaskQuery().taskCandidateUser(user.getId()).list(); - List assigneeList = taskService.createTaskQuery().taskAssignee(user.getId()).list(); - List candidateGroup = taskService.createTaskQuery().taskCandidateGroupIn(roleString).list(); - taskList.addAll(assigneeList); - taskList.addAll(candidateGroup); - int count = taskList.size(); - Integer index = (Integer.valueOf(page) - 1) * Integer.valueOf(limit); - taskList = taskList.subList(index, taskList.size() > index + 10 ? index + 10 : taskList.size()); - - List tasks = new ArrayList<>(); - Map map; - com.len.entity.Task taskEntity; - - Map> mapMap = new HashMap<>(); - Map objectMap; - Set taskSet = new HashSet(); - for (Task task1 : taskList) { - objectMap = new HashMap<>(); - String taskId = task1.getId(); - if (taskSet.contains(taskId)) { - continue; - } - - map = taskService.getVariables(taskId); - BaseTask userLeave = (BaseTask) map.get("baseTask"); - - taskEntity = new com.len.entity.Task(task1); - taskEntity.setUserName(userLeave.getUserName()); - taskEntity.setReason(userLeave.getReason()); - taskEntity.setUrlpath(userLeave.getUrlpath()); - /*如果是自己*/ - if (user.getId().equals(userLeave.getUserId())) { - if (map.get("flag") != null) { - if (!(boolean) map.get("flag")) { - objectMap.put("flag", true); - } else { - objectMap.put("flag", false); - } - } else { - objectMap.put("flag", true); - } - } else { - objectMap.put("flag", false); - } - mapMap.put(taskEntity.getId(), objectMap); - tasks.add(taskEntity); - taskSet.add(taskId); - } - return ReType.jsonStrng(count, tasks, mapMap, "id"); - } - - @GetMapping("agent/{id}") - public String agent(Model model, @PathVariable("id") String taskId) { - Map variables = taskService.getVariables(taskId); - BaseTask baseTask = (BaseTask) variables.get("baseTask"); + @Autowired + UserLeaveService leaveService; + + @Autowired + RuntimeService runtimeService; + + @Autowired + TaskService taskService; + + @Autowired + IdentityService identityService; + + @Autowired + RepositoryService repositoryService; + + @Autowired + ProcessEngineFactoryBean processEngine; + + @Autowired + ProcessEngineConfiguration processEngineConfiguration; + + @Autowired + RoleUserService roleUserService; + @Autowired + HistoryService historyService; + private String leaveOpinionList = "leaveOpinionList"; + + @GetMapping(value = "showMain") + public String showMain(Model model) { + return "/dashboard/dashboard"; + } + + @GetMapping(value = "showMain2") + public String showMain2(Model model) { + return "/dashboard/dashboard2"; + } + + @GetMapping(value = "showLeave") + public String showUser(Model model) { + return "/act/leave/leaveList"; + } + + @GetMapping(value = "showLeaveList") + @ResponseBody + public ReType showLeaveList(UserLeave userLeave, String page, String limit) { + String userId = CommonUtil.getUser().getId(); + userLeave.setUserId(userId); + List tList = null; + Page tPage = PageHelper.startPage(Integer.valueOf(page), Integer.valueOf(limit)); + try { + tList = leaveService.selectListByPage(userLeave); + for (UserLeave leave : tList) { + ProcessInstance instance = runtimeService.createProcessInstanceQuery() + .processInstanceId(leave.getProcessInstanceId()).singleResult(); + //保证运行ing + if (instance != null) { + Task task = this.taskService.createTaskQuery().processInstanceId(leave.getProcessInstanceId()).singleResult(); + leave.setTaskName(task.getName()); + } + } + } catch (LenException e) { + e.printStackTrace(); + } + return new ReType(tPage.getTotal(), tList); + } + + /** + * 根据 执行对象id获取审批信息 + * + * @param model + * @param processId + * @return + */ + @GetMapping("leaveDetail") + public String leaveDetail(Model model, String processId) { + ProcessInstance instance = runtimeService.createProcessInstanceQuery() + .processInstanceId(processId).singleResult(); + //保证运行ing + List leaveList = null; + if (instance != null) { + Task task = this.taskService.createTaskQuery().processInstanceId(processId).singleResult(); + Map variables = taskService.getVariables(task.getId()); + Object o = variables.get(leaveOpinionList); + if (o != null) { + /*获取历史审核信息*/ + leaveList = (List) o; + } + } else { + leaveList = new ArrayList<>(); + List list = historyService.createHistoricDetailQuery(). + processInstanceId(processId).list(); + HistoricVariableUpdate variable = null; + for (HistoricDetail historicDetail : list) { + variable = (HistoricVariableUpdate) historicDetail; + if (leaveOpinionList.equals(variable.getVariableName())) { + leaveList.clear(); + leaveList.addAll((List) variable.getValue()); + } + } + } + model.addAttribute("leaveDetail", JSON.toJSONString(leaveList)); + return "/act/leave/leaveDetail"; + } + + @GetMapping("addLeave") + public String addLeave() { + return "/act/leave/add-leave"; + } + + @GetMapping("updateLeave/{taskId}") + public String updateLeave(Model model, @PathVariable String taskId) { + Map variables = taskService.getVariables(taskId); + BaseTask baseTask = (BaseTask) variables.get("baseTask"); + UserLeave leave = leaveService.getById(baseTask.getId()); + model.addAttribute("leave", leave); + model.addAttribute("taskId", taskId); + return "/act/leave/update-leave"; + } + + @PostMapping("updateLeave/updateLeave/{taskId}/{id}/{flag}") + @ResponseBody + public LenResponse updateLeave(UserLeave leave, @PathVariable String taskId, @PathVariable String id, @PathVariable boolean flag) { + LenResponse j = new LenResponse(); + try { + UserLeave oldLeave = leaveService.getById(leave.getId()); + BeanUtil.copyNotNullBean(leave, oldLeave); + QueryWrapper userLeaveQueryWrapper = new QueryWrapper<>(oldLeave); + leaveService.update(userLeaveQueryWrapper); + + Map variables = taskService.getVariables(taskId); + Map map = new HashMap<>(); + if (flag) { + map.put("flag", true); + } else { + map.put("flag", false); + } + taskService.complete(taskId, map); + j.setMsg("保存成功"); + } catch (LenException e) { + j.setMsg("保存失败"); + j.setFlag(false); + e.printStackTrace(); + } + return j; + } + + @PostMapping("addLeave") + @ResponseBody + public LenResponse addLeave(UserLeave userLeave) { + LenResponse j = new LenResponse(); + if (userLeave == null) { + return LenResponse.error("获取数据失败"); + } + long beginTime = userLeave.getBeginTime().getTime(); + long endTime = userLeave.getEndTime().getTime(); + int days = 1; + if (endTime != beginTime) { + days += (int) ((endTime - beginTime) / (1000 * 60 * 60 * 24)); + } + if (days <= 0) { + return LenResponse.error("时间输入有误"); + } + + userLeave.setDays(days); + CurrentUser user = CommonUtil.getUser(); + userLeave.setUserId(user.getId()); + userLeave.setUserName(user.getUsername()); + userLeave.setProcessInstanceId("2018"); + leaveService.save(userLeave); + Map map = new HashMap<>(); + userLeave.setUrlpath("/leave/readOnlyLeave/" + userLeave.getId()); + map.put("baseTask", userLeave); + map.put("day", days); + ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("process_leave", map); + userLeave.setProcessInstanceId(processInstance.getId()); + userLeave.setUrlpath("/leave/readOnlyLeave/" + userLeave.getId()); + leaveService.updateById(userLeave); + j.setMsg("请假申请成功"); + return j; + } + + @GetMapping("readOnlyLeave/{billId}") + public String readOnlyLeave(Model model, @PathVariable String billId) { + UserLeave leave = leaveService.getById(billId); + model.addAttribute("leave", leave); + return "/act/leave/update-leave-readonly"; + } + + /** + * ---------我的任务--------- + */ + @GetMapping(value = "showTask") + public String showTask(Model model) { + return "/act/task/taskList"; + } + + @GetMapping(value = "showTaskList") + @ResponseBody + public String showTaskList(Model model, com.len.entity.Task task, String page, String limit) { + CurrentUser user = CommonUtil.getUser(); + SysRoleUser sysRoleUser = new SysRoleUser(); + sysRoleUser.setUserId(user.getId()); + QueryWrapper queryWrapper = new QueryWrapper<>(sysRoleUser); + List userRoles = roleUserService.list(queryWrapper); + List roleString = new ArrayList<>(); + for (SysRoleUser sru : userRoles) { + roleString.add(sru.getRoleId()); + } + List taskList = taskService.createTaskQuery().taskCandidateUser(user.getId()).list(); + List assigneeList = taskService.createTaskQuery().taskAssignee(user.getId()).list(); + List candidateGroup = taskService.createTaskQuery().taskCandidateGroupIn(roleString).list(); + taskList.addAll(assigneeList); + taskList.addAll(candidateGroup); + int count = taskList.size(); + Integer index = (Integer.valueOf(page) - 1) * Integer.valueOf(limit); + taskList = taskList.subList(index, taskList.size() > index + 10 ? index + 10 : taskList.size()); + + List tasks = new ArrayList<>(); + Map map; + com.len.entity.Task taskEntity; + + Map> mapMap = new HashMap<>(); + Map objectMap; + Set taskSet = new HashSet(); + for (Task task1 : taskList) { + objectMap = new HashMap<>(); + String taskId = task1.getId(); + if (taskSet.contains(taskId)) { + continue; + } + + map = taskService.getVariables(taskId); + BaseTask userLeave = (BaseTask) map.get("baseTask"); + + taskEntity = new com.len.entity.Task(task1); + taskEntity.setUserName(userLeave.getUserName()); + taskEntity.setReason(userLeave.getReason()); + taskEntity.setUrlpath(userLeave.getUrlpath()); + /*如果是自己*/ + if (user.getId().equals(userLeave.getUserId())) { + if (map.get("flag") != null) { + if (!(boolean) map.get("flag")) { + objectMap.put("flag", true); + } else { + objectMap.put("flag", false); + } + } else { + objectMap.put("flag", true); + } + } else { + objectMap.put("flag", false); + } + mapMap.put(taskEntity.getId(), objectMap); + tasks.add(taskEntity); + taskSet.add(taskId); + } + return ReType.jsonStrng(count, tasks, mapMap, "id"); + } + + @GetMapping("agent/{id}") + public String agent(Model model, @PathVariable("id") String taskId) { + Map variables = taskService.getVariables(taskId); + BaseTask baseTask = (BaseTask) variables.get("baseTask"); // UserLeave userLeave = leaveService.selectByPrimaryKey(baseTask.getId()); - model.addAttribute("leaveUrl", baseTask.getUrlpath()); - model.addAttribute("taskId", taskId); - return "/act/task/task-agent-iframe"; - } - - @PostMapping("agent/complete") - @ResponseBody - public LenResponse complete(LeaveOpinion op, HttpServletRequest request) { - Map variables = taskService.getVariables(op.getTaskId()); - - CurrentUser user = Principal.getCurrentUse(); - op.setCreateTime(new Date()); - op.setOpId(user.getId()); - op.setOpName(user.getRealName()); - LenResponse j = new LenResponse(); - Map map = new HashMap<>(); - map.put("flag", op.isFlag()); - - //判断节点是否已经拒绝过一次了 - Object needend = variables.get("needend"); - if (needend != null && (boolean) needend && (!op.isFlag())) { - map.put("needfinish", -1); //结束 - } else { - if (op.isFlag()) { - map.put("needfinish", 1);//通过下一个节点 - } else { - map.put("needfinish", 0);//不通过 - } - } - //审批信息叠加 - List leaveList = new ArrayList<>(); - Object o = variables.get(leaveOpinionList); - if (o != null) { - leaveList = (List) o; - } - leaveList.add(op); - UserLeave userLeave=(UserLeave)variables.get("baseTask"); - map.put("day",userLeave.getDays()); - map.put(leaveOpinionList, leaveList); - j.setMsg("审核成功" + (op.isFlag() ? "[通过]" : "[未通过]")); - taskService.complete(op.getTaskId(), map); - return j; - } - - @Autowired - HistoryService historyService; - - /** - * 追踪图片成图 - * 增加历史流程 - * - * @param request - * @param resp - * @param processInstanceId - * @throws IOException - */ - @GetMapping("getProcImage") - public void getProcImage(HttpServletRequest request, HttpServletResponse resp, String processInstanceId) - throws IOException { - InputStream imageStream = generateStream(request, resp, processInstanceId, true); - if (imageStream == null) { - return; - } - InputStream imageNoCurrentStream = generateStream(request, resp, processInstanceId, false); - if (imageNoCurrentStream == null) { - return; - } - - AnimatedGifEncoder e = new AnimatedGifEncoder(); - e.setTransparent(Color.BLACK); - e.setRepeat(0); - e.setQuality(19); - e.start(resp.getOutputStream()); - - BufferedImage current = ImageIO.read(imageStream); // 读入需要播放的jpg文件 - e.addFrame(current); //添加到帧中 - - e.setDelay(200); //设置播放的延迟时间 - BufferedImage nocurrent = ImageIO.read(imageNoCurrentStream); // 读入需要播放的jpg文件 - e.addFrame(nocurrent); //添加到帧中 - - e.finish(); + model.addAttribute("leaveUrl", baseTask.getUrlpath()); + model.addAttribute("taskId", taskId); + return "/act/task/task-agent-iframe"; + } + + @PostMapping("agent/complete") + @ResponseBody + public LenResponse complete(LeaveOpinion op, HttpServletRequest request) { + Map variables = taskService.getVariables(op.getTaskId()); + + CurrentUser user = Principal.getCurrentUse(); + op.setCreateTime(new Date()); + op.setOpId(user.getId()); + op.setOpName(user.getRealName()); + LenResponse j = new LenResponse(); + Map map = new HashMap<>(); + map.put("flag", op.isFlag()); + + //判断节点是否已经拒绝过一次了 + Object needend = variables.get("needend"); + if (needend != null && (boolean) needend && (!op.isFlag())) { + map.put("needfinish", -1); //结束 + } else { + if (op.isFlag()) { + map.put("needfinish", 1);//通过下一个节点 + } else { + map.put("needfinish", 0);//不通过 + } + } + //审批信息叠加 + List leaveList = new ArrayList<>(); + Object o = variables.get(leaveOpinionList); + if (o != null) { + leaveList = (List) o; + } + leaveList.add(op); + UserLeave userLeave = (UserLeave) variables.get("baseTask"); + map.put("day", userLeave.getDays()); + map.put(leaveOpinionList, leaveList); + j.setMsg("审核成功" + (op.isFlag() ? "[通过]" : "[未通过]")); + taskService.complete(op.getTaskId(), map); + return j; + } + + /** + * 追踪图片成图 + * 增加历史流程 + * + * @param request + * @param resp + * @param processInstanceId + * @throws IOException + */ + @GetMapping("getProcImage") + public void getProcImage(HttpServletRequest request, HttpServletResponse resp, String processInstanceId) + throws IOException { + InputStream imageStream = generateStream(request, resp, processInstanceId, true); + if (imageStream == null) { + return; + } + InputStream imageNoCurrentStream = generateStream(request, resp, processInstanceId, false); + if (imageNoCurrentStream == null) { + return; + } + + AnimatedGifEncoder e = new AnimatedGifEncoder(); + e.setTransparent(Color.BLACK); + e.setRepeat(0); + e.setQuality(19); + e.start(resp.getOutputStream()); + + BufferedImage current = ImageIO.read(imageStream); // 读入需要播放的jpg文件 + e.addFrame(current); //添加到帧中 + + e.setDelay(200); //设置播放的延迟时间 + BufferedImage nocurrent = ImageIO.read(imageNoCurrentStream); // 读入需要播放的jpg文件 + e.addFrame(nocurrent); //添加到帧中 + + e.finish(); // byte[] b = new byte[1024]; // int len; // while ((len = imageStream.read(b, 0, 1024)) != -1) { // resp.getOutputStream().write(b, 0, len); // } - } - - //只读图片页面 - @GetMapping("shinePics/{processInstanceId}") - public String shinePics(Model model, @PathVariable String processInstanceId) { - model.addAttribute("processInstanceId", processInstanceId); - return "/act/leave/shinePics"; - } - - @GetMapping("getShineProcImage") - @ResponseBody - public String getShineProcImage(HttpServletRequest request, HttpServletResponse resp, String processInstanceId) - throws IOException { - JSONObject result = new JSONObject(); - JSONArray shineProImages = new JSONArray(); - BASE64Encoder encoder = new BASE64Encoder(); - InputStream imageStream = generateStream(request, resp, processInstanceId, true); - if (imageStream != null) { - String imageCurrentNode = Base64Utils.ioToBase64(imageStream); - if (StringUtils.isNotBlank(imageCurrentNode)) { - shineProImages.add(imageCurrentNode); - } - } - InputStream imageNoCurrentStream = generateStream(request, resp, processInstanceId, false); - if (imageNoCurrentStream != null) { - String imageNoCurrentNode = Base64Utils.ioToBase64(imageNoCurrentStream); - if (StringUtils.isNotBlank(imageNoCurrentNode)) { - shineProImages.add(imageNoCurrentNode); - } - } - result.put("id", UUID.randomUUID().toString()); - result.put("errorNo", 0); - result.put("images", shineProImages); - return result.toJSONString(); - } - - - public InputStream generateStream(HttpServletRequest request, HttpServletResponse resp, String processInstanceId, boolean needCurrent) { - ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); - HistoricProcessInstance historicProcessInstance = - historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); - String processDefinitionId = null; - List executedActivityIdList = new ArrayList(); - List currentActivityIdList = new ArrayList<>(); - List historicActivityInstanceList = new ArrayList<>(); - if (processInstance != null) { - processDefinitionId = processInstance.getProcessDefinitionId(); - if (needCurrent) { - currentActivityIdList = this.runtimeService.getActiveActivityIds(processInstance.getId()); - } - } - if (historicProcessInstance != null) { - processDefinitionId = historicProcessInstance.getProcessDefinitionId(); - historicActivityInstanceList = - historyService.createHistoricActivityInstanceQuery().processInstanceId(processInstanceId).orderByHistoricActivityInstanceId().asc().list(); - for (HistoricActivityInstance activityInstance : historicActivityInstanceList) { - executedActivityIdList.add(activityInstance.getActivityId()); - } - } - - if (StringUtils.isEmpty(processDefinitionId) || executedActivityIdList.isEmpty()) { - return null; - } - - //高亮线路id集合 - ProcessDefinitionEntity definitionEntity = (ProcessDefinitionEntity) repositoryService.getProcessDefinition(processDefinitionId); - List highLightedFlows = getHighLightedFlows(definitionEntity, historicActivityInstanceList); - - BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId); - //List activeActivityIds = runtimeService.getActiveActivityIds(processInstanceId); - processEngineConfiguration = processEngine.getProcessEngineConfiguration(); - Context.setProcessEngineConfiguration((ProcessEngineConfigurationImpl) processEngineConfiguration); - HMProcessDiagramGenerator diagramGenerator = (HMProcessDiagramGenerator) processEngineConfiguration.getProcessDiagramGenerator(); - //List activeIds = this.runtimeService.getActiveActivityIds(processInstance.getId()); - - InputStream imageStream = diagramGenerator.generateDiagram( - bpmnModel, "png", - executedActivityIdList, highLightedFlows, - processEngine.getProcessEngineConfiguration().getActivityFontName(), - processEngine.getProcessEngineConfiguration().getLabelFontName(), - "宋体", - null, 1.0, currentActivityIdList); - - return imageStream; - } - - /** - * 获取需要高亮的线 - * - * @param processDefinitionEntity - * @param historicActivityInstances - * @return - */ - private List getHighLightedFlows( - ProcessDefinitionEntity processDefinitionEntity, - List historicActivityInstances) { - - List highFlows = new ArrayList();// 用以保存高亮的线flowId - for (int i = 0; i < historicActivityInstances.size() - 1; i++) {// 对历史流程节点进行遍历 - ActivityImpl activityImpl = processDefinitionEntity - .findActivity(historicActivityInstances.get(i) - .getActivityId());// 得到节点定义的详细信息 - List sameStartTimeNodes = new ArrayList();// 用以保存后需开始时间相同的节点 - ActivityImpl sameActivityImpl1 = processDefinitionEntity - .findActivity(historicActivityInstances.get(i + 1) - .getActivityId()); - // 将后面第一个节点放在时间相同节点的集合里 - sameStartTimeNodes.add(sameActivityImpl1); - for (int j = i + 1; j < historicActivityInstances.size() - 1; j++) { - HistoricActivityInstance activityImpl1 = historicActivityInstances - .get(j);// 后续第一个节点 - HistoricActivityInstance activityImpl2 = historicActivityInstances - .get(j + 1);// 后续第二个节点 - if (activityImpl1.getStartTime().equals( - activityImpl2.getStartTime())) { - // 如果第一个节点和第二个节点开始时间相同保存 - ActivityImpl sameActivityImpl2 = processDefinitionEntity - .findActivity(activityImpl2.getActivityId()); - sameStartTimeNodes.add(sameActivityImpl2); - } else { - // 有不相同跳出循环 - break; - } - } - List pvmTransitions = activityImpl - .getOutgoingTransitions();// 取出节点的所有出去的线 - for (PvmTransition pvmTransition : pvmTransitions) { - // 对所有的线进行遍历 - ActivityImpl pvmActivityImpl = (ActivityImpl) pvmTransition - .getDestination(); - // 如果取出的线的目标节点存在时间相同的节点里,保存该线的id,进行高亮显示 - if (sameStartTimeNodes.contains(pvmActivityImpl)) { - highFlows.add(pvmTransition.getId()); - } - } - } - return highFlows; - } + } + + //只读图片页面 + @GetMapping("shinePics/{processInstanceId}") + public String shinePics(Model model, @PathVariable String processInstanceId) { + model.addAttribute("processInstanceId", processInstanceId); + return "/act/leave/shinePics"; + } + + @GetMapping("getShineProcImage") + @ResponseBody + public String getShineProcImage(HttpServletRequest request, HttpServletResponse resp, String processInstanceId) + throws IOException { + JSONObject result = new JSONObject(); + JSONArray shineProImages = new JSONArray(); + BASE64Encoder encoder = new BASE64Encoder(); + InputStream imageStream = generateStream(request, resp, processInstanceId, true); + if (imageStream != null) { + String imageCurrentNode = Base64Utils.ioToBase64(imageStream); + if (StringUtils.isNotBlank(imageCurrentNode)) { + shineProImages.add(imageCurrentNode); + } + } + InputStream imageNoCurrentStream = generateStream(request, resp, processInstanceId, false); + if (imageNoCurrentStream != null) { + String imageNoCurrentNode = Base64Utils.ioToBase64(imageNoCurrentStream); + if (StringUtils.isNotBlank(imageNoCurrentNode)) { + shineProImages.add(imageNoCurrentNode); + } + } + result.put("id", UUID.randomUUID().toString()); + result.put("errorNo", 0); + result.put("images", shineProImages); + return result.toJSONString(); + } + + + public InputStream generateStream(HttpServletRequest request, HttpServletResponse resp, String processInstanceId, boolean needCurrent) { + ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); + HistoricProcessInstance historicProcessInstance = + historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); + String processDefinitionId = null; + List executedActivityIdList = new ArrayList(); + List currentActivityIdList = new ArrayList<>(); + List historicActivityInstanceList = new ArrayList<>(); + if (processInstance != null) { + processDefinitionId = processInstance.getProcessDefinitionId(); + if (needCurrent) { + currentActivityIdList = this.runtimeService.getActiveActivityIds(processInstance.getId()); + } + } + if (historicProcessInstance != null) { + processDefinitionId = historicProcessInstance.getProcessDefinitionId(); + historicActivityInstanceList = + historyService.createHistoricActivityInstanceQuery().processInstanceId(processInstanceId).orderByHistoricActivityInstanceId().asc().list(); + for (HistoricActivityInstance activityInstance : historicActivityInstanceList) { + executedActivityIdList.add(activityInstance.getActivityId()); + } + } + + if (StringUtils.isEmpty(processDefinitionId) || executedActivityIdList.isEmpty()) { + return null; + } + + //高亮线路id集合 + ProcessDefinitionEntity definitionEntity = (ProcessDefinitionEntity) repositoryService.getProcessDefinition(processDefinitionId); + List highLightedFlows = getHighLightedFlows(definitionEntity, historicActivityInstanceList); + + BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId); + //List activeActivityIds = runtimeService.getActiveActivityIds(processInstanceId); + processEngineConfiguration = processEngine.getProcessEngineConfiguration(); + Context.setProcessEngineConfiguration((ProcessEngineConfigurationImpl) processEngineConfiguration); + HMProcessDiagramGenerator diagramGenerator = (HMProcessDiagramGenerator) processEngineConfiguration.getProcessDiagramGenerator(); + //List activeIds = this.runtimeService.getActiveActivityIds(processInstance.getId()); + + InputStream imageStream = diagramGenerator.generateDiagram( + bpmnModel, "png", + executedActivityIdList, highLightedFlows, + processEngine.getProcessEngineConfiguration().getActivityFontName(), + processEngine.getProcessEngineConfiguration().getLabelFontName(), + "宋体", + null, 1.0, currentActivityIdList); + + return imageStream; + } + + /** + * 获取需要高亮的线 + * + * @param processDefinitionEntity + * @param historicActivityInstances + * @return + */ + private List getHighLightedFlows( + ProcessDefinitionEntity processDefinitionEntity, + List historicActivityInstances) { + + List highFlows = new ArrayList();// 用以保存高亮的线flowId + for (int i = 0; i < historicActivityInstances.size() - 1; i++) {// 对历史流程节点进行遍历 + ActivityImpl activityImpl = processDefinitionEntity + .findActivity(historicActivityInstances.get(i) + .getActivityId());// 得到节点定义的详细信息 + List sameStartTimeNodes = new ArrayList();// 用以保存后需开始时间相同的节点 + ActivityImpl sameActivityImpl1 = processDefinitionEntity + .findActivity(historicActivityInstances.get(i + 1) + .getActivityId()); + // 将后面第一个节点放在时间相同节点的集合里 + sameStartTimeNodes.add(sameActivityImpl1); + for (int j = i + 1; j < historicActivityInstances.size() - 1; j++) { + HistoricActivityInstance activityImpl1 = historicActivityInstances + .get(j);// 后续第一个节点 + HistoricActivityInstance activityImpl2 = historicActivityInstances + .get(j + 1);// 后续第二个节点 + if (activityImpl1.getStartTime().equals( + activityImpl2.getStartTime())) { + // 如果第一个节点和第二个节点开始时间相同保存 + ActivityImpl sameActivityImpl2 = processDefinitionEntity + .findActivity(activityImpl2.getActivityId()); + sameStartTimeNodes.add(sameActivityImpl2); + } else { + // 有不相同跳出循环 + break; + } + } + List pvmTransitions = activityImpl + .getOutgoingTransitions();// 取出节点的所有出去的线 + for (PvmTransition pvmTransition : pvmTransitions) { + // 对所有的线进行遍历 + ActivityImpl pvmActivityImpl = (ActivityImpl) pvmTransition + .getDestination(); + // 如果取出的线的目标节点存在时间相同的节点里,保存该线的id,进行高亮显示 + if (sameStartTimeNodes.contains(pvmActivityImpl)) { + highFlows.add(pvmTransition.getId()); + } + } + } + return highFlows; + } } diff --git a/len-activiti/src/main/java/com/len/entity/ActAssignee.java b/len-activiti/src/main/java/com/len/entity/ActAssignee.java index b841f36..761c70e 100644 --- a/len-activiti/src/main/java/com/len/entity/ActAssignee.java +++ b/len-activiti/src/main/java/com/len/entity/ActAssignee.java @@ -8,147 +8,147 @@ import com.baomidou.mybatisplus.annotation.TableName; @TableName(value = "act_assignee") public class ActAssignee { - @TableId(value = "id", type = IdType.UUID) - private String id; - - /** - * 节点id - */ - @TableField(value = "sid") - private String sid; - - /** - * 办理人 - */ - @TableField(value = "assignee") - private String assignee; - - /** - * 候选组(角色) - */ - @TableField(value = "role_id") - private String roleId; - - /** - * 办理人类型1办理人2候选人3组 - */ - @TableField(value = "assignee_type") - private Integer assigneeType; - - /** - * 节点名称 - */ - @TableField(value = "activti_name") - private String activtiName; - - /** - * @return id - */ - public String getId() { - return id; - } - - /** - * @param id - */ - public void setId(String id) { - this.id = id == null ? null : id.trim(); - } - - /** - * 获取节点id - * - * @return sid - 节点id - */ - public String getSid() { - return sid; - } - - /** - * 设置节点id - * - * @param sid 节点id - */ - public void setSid(String sid) { - this.sid = sid == null ? null : sid.trim(); - } - - /** - * 获取办理人 - * - * @return assignee - 办理人 - */ - public String getAssignee() { - return assignee; - } - - /** - * 设置办理人 - * - * @param assignee 办理人 - */ - public void setAssignee(String assignee) { - this.assignee = assignee == null ? null : assignee.trim(); - } - - /** - * 获取候选组(角色) - * - * @return role_id - 候选组(角色) - */ - public String getRoleId() { - return roleId; - } - - /** - * 设置候选组(角色) - * - * @param roleId 候选组(角色) - */ - public void setRoleId(String roleId) { - this.roleId = roleId == null ? null : roleId.trim(); - } - - /** - * 获取办理人类型1办理人2候选人3组 - * - * @return assignee_type - 办理人类型1办理人2候选人3组 - */ - public Integer getAssigneeType() { - return assigneeType; - } - - /** - * 设置办理人类型1办理人2候选人3组 - * - * @param assigneeType 办理人类型1办理人2候选人3组 - */ - public void setAssigneeType(Integer assigneeType) { - this.assigneeType = assigneeType; - } - - /** - * 获取节点名称 - * - * @return activti_name - 节点名称 - */ - public String getActivtiName() { - return activtiName; - } - - /** - * 设置节点名称 - * - * @param activtiName 节点名称 - */ - public void setActivtiName(String activtiName) { - this.activtiName = activtiName == null ? null : activtiName.trim(); - } - - public ActAssignee() { - } - - public ActAssignee(String sid) { - this.sid = sid; - } -} \ No newline at end of file + @TableId(value = "id", type = IdType.UUID) + private String id; + + /** + * 节点id + */ + @TableField(value = "sid") + private String sid; + + /** + * 办理人 + */ + @TableField(value = "assignee") + private String assignee; + + /** + * 候选组(角色) + */ + @TableField(value = "role_id") + private String roleId; + + /** + * 办理人类型1办理人2候选人3组 + */ + @TableField(value = "assignee_type") + private Integer assigneeType; + + /** + * 节点名称 + */ + @TableField(value = "activti_name") + private String activtiName; + + public ActAssignee() { + } + + public ActAssignee(String sid) { + this.sid = sid; + } + + /** + * @return id + */ + public String getId() { + return id; + } + + /** + * @param id + */ + public void setId(String id) { + this.id = id == null ? null : id.trim(); + } + + /** + * 获取节点id + * + * @return sid - 节点id + */ + public String getSid() { + return sid; + } + + /** + * 设置节点id + * + * @param sid 节点id + */ + public void setSid(String sid) { + this.sid = sid == null ? null : sid.trim(); + } + + /** + * 获取办理人 + * + * @return assignee - 办理人 + */ + public String getAssignee() { + return assignee; + } + + /** + * 设置办理人 + * + * @param assignee 办理人 + */ + public void setAssignee(String assignee) { + this.assignee = assignee == null ? null : assignee.trim(); + } + + /** + * 获取候选组(角色) + * + * @return role_id - 候选组(角色) + */ + public String getRoleId() { + return roleId; + } + + /** + * 设置候选组(角色) + * + * @param roleId 候选组(角色) + */ + public void setRoleId(String roleId) { + this.roleId = roleId == null ? null : roleId.trim(); + } + + /** + * 获取办理人类型1办理人2候选人3组 + * + * @return assignee_type - 办理人类型1办理人2候选人3组 + */ + public Integer getAssigneeType() { + return assigneeType; + } + + /** + * 设置办理人类型1办理人2候选人3组 + * + * @param assigneeType 办理人类型1办理人2候选人3组 + */ + public void setAssigneeType(Integer assigneeType) { + this.assigneeType = assigneeType; + } + + /** + * 获取节点名称 + * + * @return activti_name - 节点名称 + */ + public String getActivtiName() { + return activtiName; + } + + /** + * 设置节点名称 + * + * @param activtiName 节点名称 + */ + public void setActivtiName(String activtiName) { + this.activtiName = activtiName == null ? null : activtiName.trim(); + } +} diff --git a/len-activiti/src/main/java/com/len/entity/ActDeployment.java b/len-activiti/src/main/java/com/len/entity/ActDeployment.java index 39df8d3..bf34fc7 100644 --- a/len-activiti/src/main/java/com/len/entity/ActDeployment.java +++ b/len-activiti/src/main/java/com/len/entity/ActDeployment.java @@ -15,12 +15,13 @@ */ package com.len.entity; -import java.io.Serializable; -import java.util.Date; import lombok.Getter; import lombok.Setter; import org.activiti.engine.repository.Deployment; +import java.io.Serializable; +import java.util.Date; + /** * @author zhuxiaomeng * @date 2018/1/15. @@ -30,20 +31,20 @@ import org.activiti.engine.repository.Deployment; @Getter @Setter public class ActDeployment implements Serializable { - private String id; - private String name; - private Date deploymentTime; - private String category; - private String tenantId; + private String id; + private String name; + private Date deploymentTime; + private String category; + private String tenantId; - public ActDeployment() { - } + public ActDeployment() { + } - public ActDeployment(Deployment deployment) { - this.id = deployment.getId(); - this.name = deployment.getName(); - this.deploymentTime = deployment.getDeploymentTime(); - this.category = deployment.getCategory(); - this.tenantId = deployment.getTenantId(); - } + public ActDeployment(Deployment deployment) { + this.id = deployment.getId(); + this.name = deployment.getName(); + this.deploymentTime = deployment.getDeploymentTime(); + this.category = deployment.getCategory(); + this.tenantId = deployment.getTenantId(); + } } diff --git a/len-activiti/src/main/java/com/len/entity/ActModel.java b/len-activiti/src/main/java/com/len/entity/ActModel.java index 479b4c5..0bce234 100644 --- a/len-activiti/src/main/java/com/len/entity/ActModel.java +++ b/len-activiti/src/main/java/com/len/entity/ActModel.java @@ -15,14 +15,11 @@ */ package com.len.entity; -import java.util.Date; - import lombok.Data; -import lombok.Getter; -import lombok.Setter; -import lombok.ToString; import org.activiti.engine.repository.Model; +import java.util.Date; + /** * @author zhuxiaomeng * @date 2018/1/18. @@ -32,33 +29,33 @@ import org.activiti.engine.repository.Model; @Data public class ActModel { - private String id; - private String name; - private String key; - private String category; - private Date createTime; - private Date lastUpdateTime; - private Integer version; - private String metaInfo; - private String deploymentId; - private String tenantId; - private boolean hasEditorSource; + private String id; + private String name; + private String key; + private String category; + private Date createTime; + private Date lastUpdateTime; + private Integer version; + private String metaInfo; + private String deploymentId; + private String tenantId; + private boolean hasEditorSource; - public ActModel() { - } + public ActModel() { + } - public ActModel(Model model) { - this.id = model.getId(); - this.name = model.getName(); - this.key = model.getKey(); - this.category = model.getCategory(); - this.createTime = model.getCreateTime(); - this.lastUpdateTime = model.getLastUpdateTime(); - this.version = model.getVersion(); - this.metaInfo = model.getMetaInfo(); - this.deploymentId = model.getDeploymentId(); - this.tenantId = model.getTenantId(); - this.hasEditorSource = model.hasEditorSource(); - } + public ActModel(Model model) { + this.id = model.getId(); + this.name = model.getName(); + this.key = model.getKey(); + this.category = model.getCategory(); + this.createTime = model.getCreateTime(); + this.lastUpdateTime = model.getLastUpdateTime(); + this.version = model.getVersion(); + this.metaInfo = model.getMetaInfo(); + this.deploymentId = model.getDeploymentId(); + this.tenantId = model.getTenantId(); + this.hasEditorSource = model.hasEditorSource(); + } } diff --git a/len-activiti/src/main/java/com/len/entity/BaseTask.java b/len-activiti/src/main/java/com/len/entity/BaseTask.java index 76769ff..35110f1 100644 --- a/len-activiti/src/main/java/com/len/entity/BaseTask.java +++ b/len-activiti/src/main/java/com/len/entity/BaseTask.java @@ -8,202 +8,183 @@ import java.util.Date; */ public abstract class BaseTask implements Serializable { - protected String id; - - /** - * @return id - */ - public String getId() { - return id; - } - - /** - * @param id - */ - public void setId(String id) { - this.id = id == null ? null : id.trim(); - } - - - protected String userId; - - protected String userName; - - - protected String processInstanceId; - - protected String status; - - protected Date createDate; - - protected String createBy; - - protected Date updateDate; - - protected String updateBy; - - - protected String reason; - - - //***实时节点信息 - protected String taskName; - - - private String urlpath; - - - private Integer submittimes; - - - /** - * @return user_id - */ - public String getUserId() { - return userId; - } - - /** - * @param userId - */ - public void setUserId(String userId) { - this.userId = userId == null ? null : userId.trim(); - } - - /** - * @return user_name - */ - public String getUserName() { - return userName; - } - - /** - * @param userName - */ - public void setUserName(String userName) { - this.userName = userName == null ? null : userName.trim(); - } - - - /** - * @return reason - */ - public String getReason() { - return reason; - } - - /** - * @param reason - */ - public void setReason(String reason) { - this.reason = reason == null ? null : reason.trim(); - } - - /** - * @return process_instance_Id - */ - public String getProcessInstanceId() { - return processInstanceId; - } - - /** - * @param processInstanceId - */ - public void setProcessInstanceId(String processInstanceId) { - this.processInstanceId = processInstanceId == null ? null : processInstanceId.trim(); - } - - /** - * @return status - */ - public String getStatus() { - return status; - } - - /** - * @param status - */ - public void setStatus(String status) { - this.status = status == null ? null : status.trim(); - } - - /** - * @return create_date - */ - public Date getCreateDate() { - return createDate; - } - - /** - * @param createDate - */ - public void setCreateDate(Date createDate) { - this.createDate = createDate; - } - - /** - * @return create_by - */ - public String getCreateBy() { - return createBy; - } - - /** - * @param createBy - */ - public void setCreateBy(String createBy) { - this.createBy = createBy == null ? null : createBy.trim(); - } - - /** - * @return update_date - */ - public Date getUpdateDate() { - return updateDate; - } - - /** - * @param updateDate - */ - public void setUpdateDate(Date updateDate) { - this.updateDate = updateDate; - } - - /** - * @return update_by - */ - public String getUpdateBy() { - return updateBy; - } - - /** - * @param updateBy - */ - public void setUpdateBy(String updateBy) { - this.updateBy = updateBy == null ? null : updateBy.trim(); - } - - public String getTaskName() { - return taskName; - } - - public void setTaskName(String taskName) { - this.taskName = taskName; - } - - public String getUrlpath() { - return urlpath; - } - - public void setUrlpath(String urlpath) { - this.urlpath = urlpath; - } - - public Integer getSubmittimes() { - return submittimes; - } - - public void setSubmittimes(Integer submittimes) { - this.submittimes = submittimes; - } + protected String id; + protected String userId; + protected String userName; + protected String processInstanceId; + protected String status; + protected Date createDate; + protected String createBy; + protected Date updateDate; + protected String updateBy; + protected String reason; + //***实时节点信息 + protected String taskName; + private String urlpath; + private Integer submittimes; + + /** + * @return id + */ + public String getId() { + return id; + } + + /** + * @param id + */ + public void setId(String id) { + this.id = id == null ? null : id.trim(); + } + + /** + * @return user_id + */ + public String getUserId() { + return userId; + } + + /** + * @param userId + */ + public void setUserId(String userId) { + this.userId = userId == null ? null : userId.trim(); + } + + /** + * @return user_name + */ + public String getUserName() { + return userName; + } + + /** + * @param userName + */ + public void setUserName(String userName) { + this.userName = userName == null ? null : userName.trim(); + } + + + /** + * @return reason + */ + public String getReason() { + return reason; + } + + /** + * @param reason + */ + public void setReason(String reason) { + this.reason = reason == null ? null : reason.trim(); + } + + /** + * @return process_instance_Id + */ + public String getProcessInstanceId() { + return processInstanceId; + } + + /** + * @param processInstanceId + */ + public void setProcessInstanceId(String processInstanceId) { + this.processInstanceId = processInstanceId == null ? null : processInstanceId.trim(); + } + + /** + * @return status + */ + public String getStatus() { + return status; + } + + /** + * @param status + */ + public void setStatus(String status) { + this.status = status == null ? null : status.trim(); + } + + /** + * @return create_date + */ + public Date getCreateDate() { + return createDate; + } + + /** + * @param createDate + */ + public void setCreateDate(Date createDate) { + this.createDate = createDate; + } + + /** + * @return create_by + */ + public String getCreateBy() { + return createBy; + } + + /** + * @param createBy + */ + public void setCreateBy(String createBy) { + this.createBy = createBy == null ? null : createBy.trim(); + } + + /** + * @return update_date + */ + public Date getUpdateDate() { + return updateDate; + } + + /** + * @param updateDate + */ + public void setUpdateDate(Date updateDate) { + this.updateDate = updateDate; + } + + /** + * @return update_by + */ + public String getUpdateBy() { + return updateBy; + } + + /** + * @param updateBy + */ + public void setUpdateBy(String updateBy) { + this.updateBy = updateBy == null ? null : updateBy.trim(); + } + + public String getTaskName() { + return taskName; + } + + public void setTaskName(String taskName) { + this.taskName = taskName; + } + + public String getUrlpath() { + return urlpath; + } + + public void setUrlpath(String urlpath) { + this.urlpath = urlpath; + } + + public Integer getSubmittimes() { + return submittimes; + } + + public void setSubmittimes(Integer submittimes) { + this.submittimes = submittimes; + } } diff --git a/len-activiti/src/main/java/com/len/entity/LeaveOpinion.java b/len-activiti/src/main/java/com/len/entity/LeaveOpinion.java index 454af09..bbdbbf1 100644 --- a/len-activiti/src/main/java/com/len/entity/LeaveOpinion.java +++ b/len-activiti/src/main/java/com/len/entity/LeaveOpinion.java @@ -15,30 +15,30 @@ */ package com.len.entity; -import java.io.Serializable; -import java.util.Date; import lombok.Getter; import lombok.Setter; +import java.io.Serializable; +import java.util.Date; + /** - * * 请假流程 审批信息 */ @Getter @Setter -public class LeaveOpinion implements Serializable{ +public class LeaveOpinion implements Serializable { - //审批人id - private String opId; - //审批人姓名 - private String opName; - //审批意见 - private String opinion; - //审批时间 - private Date createTime; - //是否通过 - private boolean flag; - //流程id - private String taskId; + //审批人id + private String opId; + //审批人姓名 + private String opName; + //审批意见 + private String opinion; + //审批时间 + private Date createTime; + //是否通过 + private boolean flag; + //流程id + private String taskId; } diff --git a/len-activiti/src/main/java/com/len/entity/ProcessDefinition.java b/len-activiti/src/main/java/com/len/entity/ProcessDefinition.java index 00cdec5..af7be78 100644 --- a/len-activiti/src/main/java/com/len/entity/ProcessDefinition.java +++ b/len-activiti/src/main/java/com/len/entity/ProcessDefinition.java @@ -29,36 +29,37 @@ import lombok.ToString; @Setter @ToString public class ProcessDefinition { - private String id; - private String category; - private String name; - private String key; - private String description; - private int version; - private String resourceName; - private String deploymentId; - private String diagramResourceName; - private boolean hasStartFormKey; - private boolean hasGraphicalNotation; - private boolean isSuspended; - private String tenantId; + private String id; + private String category; + private String name; + private String key; + private String description; + private int version; + private String resourceName; + private String deploymentId; + private String diagramResourceName; + private boolean hasStartFormKey; + private boolean hasGraphicalNotation; + private boolean isSuspended; + private String tenantId; - public ProcessDefinition() { - } - public ProcessDefinition(org.activiti.engine.repository.ProcessDefinition p) { - this.id=p.getId(); - this.category=p.getCategory(); - this.name=p.getName(); - this.key=p.getKey(); - this.description=p.getDescription(); - this.version=p.getVersion(); - this.resourceName=p.getResourceName(); - this.deploymentId=p.getDeploymentId(); - this.diagramResourceName=p.getDiagramResourceName(); - this.hasStartFormKey=p.hasStartFormKey(); - this.hasGraphicalNotation=p.hasGraphicalNotation(); - this.isSuspended=p.isSuspended(); - this.tenantId=p.getTenantId(); + public ProcessDefinition() { + } - } + public ProcessDefinition(org.activiti.engine.repository.ProcessDefinition p) { + this.id = p.getId(); + this.category = p.getCategory(); + this.name = p.getName(); + this.key = p.getKey(); + this.description = p.getDescription(); + this.version = p.getVersion(); + this.resourceName = p.getResourceName(); + this.deploymentId = p.getDeploymentId(); + this.diagramResourceName = p.getDiagramResourceName(); + this.hasStartFormKey = p.hasStartFormKey(); + this.hasGraphicalNotation = p.hasGraphicalNotation(); + this.isSuspended = p.isSuspended(); + this.tenantId = p.getTenantId(); + + } } diff --git a/len-activiti/src/main/java/com/len/entity/Task.java b/len-activiti/src/main/java/com/len/entity/Task.java index 4bea8f9..1b15ec8 100644 --- a/len-activiti/src/main/java/com/len/entity/Task.java +++ b/len-activiti/src/main/java/com/len/entity/Task.java @@ -15,16 +15,17 @@ */ package com.len.entity; -import java.util.Date; import lombok.Getter; import lombok.Setter; import lombok.ToString; +import java.util.Date; + /** * @author zhuxiaomeng * @date 2018/1/21. * @email lenospmiller@gmail.com - * + *

* 流程任务 */ @@ -32,28 +33,30 @@ import lombok.ToString; @Setter @ToString public class Task { - private String id; - private String name; - private Date createTime; - private String assignee; - private String processInstanceId;//流程实例id - private String processDefinitionId;//流程定义id - private String description; - private String category; + private String id; + private String name; + private Date createTime; + private String assignee; + private String processInstanceId;//流程实例id + private String processDefinitionId;//流程定义id + private String description; + private String category; + + private String userName; + private String reason; + private String urlpath; + + public Task() { + } - private String userName; - private String reason; - private String urlpath; - public Task() { - } - public Task(org.activiti.engine.task.Task t) { - this.id=t.getId(); - this.name=t.getName(); - this.createTime=t.getCreateTime(); - this.assignee=t.getAssignee(); - this.processInstanceId=t.getProcessInstanceId(); - this.processDefinitionId=t.getProcessDefinitionId(); - this.description=t.getDescription(); - this.category=t.getCategory(); - } + public Task(org.activiti.engine.task.Task t) { + this.id = t.getId(); + this.name = t.getName(); + this.createTime = t.getCreateTime(); + this.assignee = t.getAssignee(); + this.processInstanceId = t.getProcessInstanceId(); + this.processDefinitionId = t.getProcessDefinitionId(); + this.description = t.getDescription(); + this.category = t.getCategory(); + } } diff --git a/len-activiti/src/main/java/com/len/entity/UserLeave.java b/len-activiti/src/main/java/com/len/entity/UserLeave.java index 276e40e..31399eb 100644 --- a/len-activiti/src/main/java/com/len/entity/UserLeave.java +++ b/len-activiti/src/main/java/com/len/entity/UserLeave.java @@ -12,109 +12,95 @@ import java.util.List; @TableName(value = "user_leave") public class UserLeave extends BaseTask { - @TableId(value = "id", type = IdType.UUID) - protected String id; - - /** - * @return id - */ - @Override - public String getId() { - return id; - } - - /** - * @param id - */ - @Override - public void setId(String id) { - this.id = id == null ? null : id.trim(); - } - - private Integer days; - - @TableField(value = "begin_time") - private Date beginTime; - - @TableField(value = "end_time") - private Date endTime; - - @TableField(value = "process_instance_Id") - private String processInstanceId; - - private String status; - - @TableField(value = "create_date") - private Date createDate; - - @TableField(value = "create_by") - private String createBy; - - @TableField(value = "update_date") - private Date updateDate; - - @TableField(value = "update_by") - private String updateBy; - - //***实时节点信息 - @TableField(exist = false) - private String taskName; - - - - //请假单审核信息 - @TableField(exist = false) - private List opinionList=new ArrayList<>(); - - public void leaveOpAdd(LeaveOpinion leaveOpinion){ - this.opinionList.add(leaveOpinion); - } - public void leaveOpAddAll(List leaveOpinionList){ - this.opinionList.addAll(leaveOpinionList); - } - - public List getOpinionList() { - return opinionList; - } - - public void setOpinionList(List opinionList) { - this.opinionList = opinionList; - } - - - - /** - * @return days - */ - public Integer getDays() { - return days; - } - - /** - * @param days - */ - public void setDays(Integer days) { - this.days = days; - } - - - - public Date getBeginTime() { - return beginTime; - } - - - public void setBeginTime(Date beginTime) { - this.beginTime = beginTime; - } - - - public Date getEndTime() { - return endTime; - } - - - public void setEndTime(Date endTime) { - this.endTime = endTime; - } -} \ No newline at end of file + @TableId(value = "id", type = IdType.UUID) + protected String id; + private Integer days; + @TableField(value = "begin_time") + private Date beginTime; + @TableField(value = "end_time") + private Date endTime; + @TableField(value = "process_instance_Id") + private String processInstanceId; + private String status; + @TableField(value = "create_date") + private Date createDate; + @TableField(value = "create_by") + private String createBy; + @TableField(value = "update_date") + private Date updateDate; + @TableField(value = "update_by") + private String updateBy; + //***实时节点信息 + @TableField(exist = false) + private String taskName; + //请假单审核信息 + @TableField(exist = false) + private List opinionList = new ArrayList<>(); + + /** + * @return id + */ + @Override + public String getId() { + return id; + } + + /** + * @param id + */ + @Override + public void setId(String id) { + this.id = id == null ? null : id.trim(); + } + + public void leaveOpAdd(LeaveOpinion leaveOpinion) { + this.opinionList.add(leaveOpinion); + } + + public void leaveOpAddAll(List leaveOpinionList) { + this.opinionList.addAll(leaveOpinionList); + } + + public List getOpinionList() { + return opinionList; + } + + public void setOpinionList(List opinionList) { + this.opinionList = opinionList; + } + + + /** + * @return days + */ + public Integer getDays() { + return days; + } + + /** + * @param days + */ + public void setDays(Integer days) { + this.days = days; + } + + + public Date getBeginTime() { + return beginTime; + } + + + public void setBeginTime(Date beginTime) { + this.beginTime = beginTime; + } + + + public Date getEndTime() { + return endTime; + } + + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } +} diff --git a/len-activiti/src/main/java/com/len/mapper/ActAssigneeMapper.java b/len-activiti/src/main/java/com/len/mapper/ActAssigneeMapper.java index 39590bd..7ad143e 100644 --- a/len-activiti/src/main/java/com/len/mapper/ActAssigneeMapper.java +++ b/len-activiti/src/main/java/com/len/mapper/ActAssigneeMapper.java @@ -4,5 +4,5 @@ import com.len.base.BaseMapper; import com.len.entity.ActAssignee; public interface ActAssigneeMapper extends BaseMapper { - int deleteByNodeId(String nodeId); -} \ No newline at end of file + int deleteByNodeId(String nodeId); +} diff --git a/len-activiti/src/main/java/com/len/service/ActAssigneeService.java b/len-activiti/src/main/java/com/len/service/ActAssigneeService.java index 6ec20ce..d58e809 100644 --- a/len-activiti/src/main/java/com/len/service/ActAssigneeService.java +++ b/len-activiti/src/main/java/com/len/service/ActAssigneeService.java @@ -12,10 +12,10 @@ import java.util.List; * @email lenospmiller@gmail.com */ public interface ActAssigneeService extends BaseService { - int deleteByNodeId(String nodeId); + int deleteByNodeId(String nodeId); - public List getActivityList(String deploymentId); + public List getActivityList(String deploymentId); - public List selectAllActivity(List activities); + public List selectAllActivity(List activities); } diff --git a/len-activiti/src/main/java/com/len/service/UserLeaveService.java b/len-activiti/src/main/java/com/len/service/UserLeaveService.java index cc174b4..ba5d4bd 100644 --- a/len-activiti/src/main/java/com/len/service/UserLeaveService.java +++ b/len-activiti/src/main/java/com/len/service/UserLeaveService.java @@ -12,5 +12,5 @@ import java.util.List; */ public interface UserLeaveService extends BaseService { - public List selectListByPage(UserLeave record); + public List selectListByPage(UserLeave record); } diff --git a/len-activiti/src/main/java/com/len/service/impl/ActAssigneeServiceImpl.java b/len-activiti/src/main/java/com/len/service/impl/ActAssigneeServiceImpl.java index 6ba629a..8eb216c 100644 --- a/len-activiti/src/main/java/com/len/service/impl/ActAssigneeServiceImpl.java +++ b/len-activiti/src/main/java/com/len/service/impl/ActAssigneeServiceImpl.java @@ -25,40 +25,40 @@ import java.util.List; */ @Service public class ActAssigneeServiceImpl extends BaseServiceImpl implements - ActAssigneeService { + ActAssigneeService { - @Autowired - ActAssigneeMapper actAssigneeMapper; + @Autowired + ActAssigneeMapper actAssigneeMapper; - @Autowired - private RepositoryService repositoryService; + @Autowired + private RepositoryService repositoryService; - @Override - public int deleteByNodeId(String nodeId) { - return actAssigneeMapper.deleteByNodeId(nodeId); - } + @Override + public int deleteByNodeId(String nodeId) { + return actAssigneeMapper.deleteByNodeId(nodeId); + } - @Override - public List getActivityList(String deploymentId) { - org.activiti.engine.repository.ProcessDefinition processDefinition = repositoryService - .createProcessDefinitionQuery().deploymentId(deploymentId).singleResult(); - ProcessDefinitionEntity processDefinitionEntity = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService) - .getDeployedProcessDefinition(processDefinition.getId()); - InputStream inputStream = repositoryService.getResourceAsStream(processDefinition.getDeploymentId(), processDefinition.getResourceName()); - BpmnModel bm = new BpmnXMLConverter().convertToBpmnModel(new InputStreamSource(inputStream), false, true); - return selectAllActivity(processDefinitionEntity.getActivities()); + @Override + public List getActivityList(String deploymentId) { + org.activiti.engine.repository.ProcessDefinition processDefinition = repositoryService + .createProcessDefinitionQuery().deploymentId(deploymentId).singleResult(); + ProcessDefinitionEntity processDefinitionEntity = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService) + .getDeployedProcessDefinition(processDefinition.getId()); + InputStream inputStream = repositoryService.getResourceAsStream(processDefinition.getDeploymentId(), processDefinition.getResourceName()); + BpmnModel bm = new BpmnXMLConverter().convertToBpmnModel(new InputStreamSource(inputStream), false, true); + return selectAllActivity(processDefinitionEntity.getActivities()); - } + } - @Override - public List selectAllActivity(List activities) { - List list = new ArrayList<>(activities); - for (ActivityImpl activity : activities) { - List childActivities = activity.getActivities(); - if (!childActivities.isEmpty()) { - list.addAll(selectAllActivity(childActivities)); - } - } - return list; - } + @Override + public List selectAllActivity(List activities) { + List list = new ArrayList<>(activities); + for (ActivityImpl activity : activities) { + List childActivities = activity.getActivities(); + if (!childActivities.isEmpty()) { + list.addAll(selectAllActivity(childActivities)); + } + } + return list; + } } diff --git a/len-activiti/src/main/java/com/len/service/impl/UserLeaveServiceImpl.java b/len-activiti/src/main/java/com/len/service/impl/UserLeaveServiceImpl.java index fdf6eda..83e7148 100644 --- a/len-activiti/src/main/java/com/len/service/impl/UserLeaveServiceImpl.java +++ b/len-activiti/src/main/java/com/len/service/impl/UserLeaveServiceImpl.java @@ -16,13 +16,13 @@ import java.util.List; */ @Service public class UserLeaveServiceImpl extends BaseServiceImpl implements - UserLeaveService { + UserLeaveService { - @Autowired - UserLeaveMapper userLeaveMapper; + @Autowired + UserLeaveMapper userLeaveMapper; - @Override - public List selectListByPage(UserLeave record) { - return userLeaveMapper.selectListByPage(record); - } + @Override + public List selectListByPage(UserLeave record) { + return userLeaveMapper.selectListByPage(record); + } } diff --git a/len-activiti/src/main/java/com/len/util/AnimatedGifEncoder.java b/len-activiti/src/main/java/com/len/util/AnimatedGifEncoder.java index 62fef8a..69bb76e 100644 --- a/len-activiti/src/main/java/com/len/util/AnimatedGifEncoder.java +++ b/len-activiti/src/main/java/com/len/util/AnimatedGifEncoder.java @@ -1,18 +1,17 @@ package com.len.util; -import java.awt.Color; -import java.awt.Graphics2D; +import java.awt.*; import java.awt.image.BufferedImage; import java.awt.image.DataBufferByte; import java.io.BufferedOutputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; - + /** * Class AnimatedGifEncoder - Encodes a GIF file consisting of one or more * frames. - * + * *

  *  Example:
  *     AnimatedGifEncoder e = new AnimatedGifEncoder();
@@ -22,786 +21,750 @@ import java.io.OutputStream;
  *     e.addFrame(image2);
  *     e.finish();
  * 
- * + *

* No copyright asserted on the source code of this class. May be used for any * purpose, however, refer to the Unisys LZW patent for restrictions on use of * the associated LZWEncoder class. Please forward any corrections to * kweiner@fmsware.com. - * + * * @author Kevin Weiner, FM Software * @version 1.03 November 2003 - * */ - + public class AnimatedGifEncoder { - - protected int width; // image size - - protected int height; - - protected Color transparent = null; // transparent color if given - - protected int transIndex; // transparent index in color table - - protected int repeat = -1; // no repeat - - protected int delay = 0; // frame delay (hundredths) - - protected boolean started = false; // ready to output frames - - protected OutputStream out; - - protected BufferedImage image; // current frame - - protected byte[] pixels; // BGR byte array from frame - - protected byte[] indexedPixels; // converted frame indexed to palette - - protected int colorDepth; // number of bit planes - - protected byte[] colorTab; // RGB palette - - protected boolean[] usedEntry = new boolean[256]; // active palette entries - - protected int palSize = 7; // color table size (bits-1) - - protected int dispose = -1; // disposal code (-1 = use default) - - protected boolean closeStream = false; // close stream when finished - - protected boolean firstFrame = true; - - protected boolean sizeSet = false; // if false, get size from first frame - - protected int sample = 10; // default sample interval for quantizer - - /** - * Sets the delay time between each frame, or changes it for subsequent frames - * (applies to last frame added). - * - * @param ms - * int delay time in milliseconds - */ - public void setDelay(int ms) { - delay = Math.round(ms / 10.0f); - } - - /** - * Sets the GIF frame disposal code for the last added frame and any - * subsequent frames. Default is 0 if no transparent color has been set, - * otherwise 2. - * - * @param code - * int disposal code. - */ - public void setDispose(int code) { - if (code >= 0) { - dispose = code; - } - } - - /** - * Sets the number of times the set of GIF frames should be played. Default is - * 1; 0 means play indefinitely. Must be invoked before the first image is - * added. - * - * @param iter - * int number of iterations. - * @return - */ - public void setRepeat(int iter) { - if (iter >= 0) { - repeat = iter; - } - } - - /** - * Sets the transparent color for the last added frame and any subsequent - * frames. Since all colors are subject to modification in the quantization - * process, the color in the final palette for each frame closest to the given - * color becomes the transparent color for that frame. May be set to null to - * indicate no transparent color. - * - * @param c - * Color to be treated as transparent on display. - */ - public void setTransparent(Color c) { - transparent = c; - } - - /** - * Adds next GIF frame. The frame is not written immediately, but is actually - * deferred until the next frame is received so that timing data can be - * inserted. Invoking finish() flushes all frames. If - * setSize was not invoked, the size of the first image is used - * for all subsequent frames. - * - * @param im - * BufferedImage containing frame to write. - * @return true if successful. - */ - public boolean addFrame(BufferedImage im) { - if ((im == null) || !started) { - return false; - } - boolean ok = true; - try { - if (!sizeSet) { - // use first frame's size - setSize(im.getWidth(), im.getHeight()); - } - image = im; - getImagePixels(); // convert to correct format if necessary - analyzePixels(); // build color table & map pixels - if (firstFrame) { - writeLSD(); // logical screen descriptior - writePalette(); // global color table - if (repeat >= 0) { - // use NS app extension to indicate reps - writeNetscapeExt(); - } - } - writeGraphicCtrlExt(); // write graphic control extension - writeImageDesc(); // image descriptor - if (!firstFrame) { - writePalette(); // local color table - } - writePixels(); // encode and write pixel data - firstFrame = false; - } catch (IOException e) { - ok = false; - } - - return ok; - } - - /** - * Flushes any pending data and closes output file. If writing to an - * OutputStream, the stream is not closed. - */ - public boolean finish() { - if (!started) - return false; - boolean ok = true; - started = false; - try { - out.write(0x3b); // gif trailer - out.flush(); - if (closeStream) { - out.close(); - } - } catch (IOException e) { - ok = false; - } - - // reset for subsequent use - transIndex = 0; - out = null; - image = null; - pixels = null; - indexedPixels = null; - colorTab = null; - closeStream = false; - firstFrame = true; - - return ok; - } - - /** - * Sets frame rate in frames per second. Equivalent to - * setDelay(1000/fps). - * - * @param fps - * float frame rate (frames per second) - */ - public void setFrameRate(float fps) { - if (fps != 0f) { - delay = Math.round(100f / fps); - } - } - - /** - * Sets quality of color quantization (conversion of images to the maximum 256 - * colors allowed by the GIF specification). Lower values (minimum = 1) - * produce better colors, but slow processing significantly. 10 is the - * default, and produces good color mapping at reasonable speeds. Values - * greater than 20 do not yield significant improvements in speed. - * - * @param quality - * int greater than 0. - * @return - */ - public void setQuality(int quality) { - if (quality < 1) - quality = 1; - sample = quality; - } - - /** - * Sets the GIF frame size. The default size is the size of the first frame - * added if this method is not invoked. - * - * @param w - * int frame width. - * @param h - * int frame width. - */ - public void setSize(int w, int h) { - if (started && !firstFrame) - return; - width = w; - height = h; - if (width < 1) - width = 320; - if (height < 1) - height = 240; - sizeSet = true; - } - - /** - * Initiates GIF file creation on the given stream. The stream is not closed - * automatically. - * - * @param os - * OutputStream on which GIF images are written. - * @return false if initial write failed. - */ - public boolean start(OutputStream os) { - if (os == null) - return false; - boolean ok = true; - closeStream = false; - out = os; - try { - writeString("GIF89a"); // header - } catch (IOException e) { - ok = false; - } - return started = ok; - } - - /** - * Initiates writing of a GIF file with the specified name. - * - * @param file - * String containing output file name. - * @return false if open or initial write failed. - */ - public boolean start(String file) { - boolean ok = true; - try { - out = new BufferedOutputStream(new FileOutputStream(file)); - ok = start(out); - closeStream = true; - } catch (IOException e) { - ok = false; - } - return started = ok; - } - - /** - * Analyzes image colors and creates color map. - */ - protected void analyzePixels() { - int len = pixels.length; - int nPix = len / 3; - indexedPixels = new byte[nPix]; - NeuQuant nq = new NeuQuant(pixels, len, sample); - // initialize quantizer - colorTab = nq.process(); // create reduced palette - // convert map from BGR to RGB - for (int i = 0; i < colorTab.length; i += 3) { - byte temp = colorTab[i]; - colorTab[i] = colorTab[i + 2]; - colorTab[i + 2] = temp; - usedEntry[i / 3] = false; - } - // map image pixels to new palette - int k = 0; - for (int i = 0; i < nPix; i++) { - int index = nq.map(pixels[k++] & 0xff, pixels[k++] & 0xff, pixels[k++] & 0xff); - usedEntry[index] = true; - indexedPixels[i] = (byte) index; - } - pixels = null; - colorDepth = 8; - palSize = 7; - // get closest match to transparent color if specified - if (transparent != null) { - transIndex = findClosest(transparent); - } - } - - /** - * Returns index of palette color closest to c - * - */ - protected int findClosest(Color c) { - if (colorTab == null) - return -1; - int r = c.getRed(); - int g = c.getGreen(); - int b = c.getBlue(); - int minpos = 0; - int dmin = 256 * 256 * 256; - int len = colorTab.length; - for (int i = 0; i < len;) { - int dr = r - (colorTab[i++] & 0xff); - int dg = g - (colorTab[i++] & 0xff); - int db = b - (colorTab[i] & 0xff); - int d = dr * dr + dg * dg + db * db; - int index = i / 3; - if (usedEntry[index] && (d < dmin)) { - dmin = d; - minpos = index; - } - i++; - } - return minpos; - } - - /** - * Extracts image pixels into byte array "pixels" - */ - protected void getImagePixels() { - int w = image.getWidth(); - int h = image.getHeight(); - int type = image.getType(); - if ((w != width) || (h != height) || (type != BufferedImage.TYPE_3BYTE_BGR)) { - // create new image with right size/format - BufferedImage temp = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR); - Graphics2D g = temp.createGraphics(); - g.drawImage(image, 0, 0, null); - image = temp; - } - pixels = ((DataBufferByte) image.getRaster().getDataBuffer()).getData(); - } - - /** - * Writes Graphic Control Extension - */ - protected void writeGraphicCtrlExt() throws IOException { - out.write(0x21); // extension introducer - out.write(0xf9); // GCE label - out.write(4); // data block size - int transp, disp; - if (transparent == null) { - transp = 0; - disp = 0; // dispose = no action - } else { - transp = 1; - disp = 2; // force clear if using transparent color - } - if (dispose >= 0) { - disp = dispose & 7; // user override - } - disp <<= 2; - - // packed fields - out.write(0 | // 1:3 reserved - disp | // 4:6 disposal - 0 | // 7 user input - 0 = none - transp); // 8 transparency flag - - writeShort(delay); // delay x 1/100 sec - out.write(transIndex); // transparent color index - out.write(0); // block terminator - } - - /** - * Writes Image Descriptor - */ - protected void writeImageDesc() throws IOException { - out.write(0x2c); // image separator - writeShort(0); // image position x,y = 0,0 - writeShort(0); - writeShort(width); // image size - writeShort(height); - // packed fields - if (firstFrame) { - // no LCT - GCT is used for first (or only) frame - out.write(0); - } else { - // specify normal LCT - out.write(0x80 | // 1 local color table 1=yes - 0 | // 2 interlace - 0=no - 0 | // 3 sorted - 0=no - 0 | // 4-5 reserved - palSize); // 6-8 size of color table - } - } - - /** - * Writes Logical Screen Descriptor - */ - protected void writeLSD() throws IOException { - // logical screen size - writeShort(width); - writeShort(height); - // packed fields - out.write((0x80 | // 1 : global color table flag = 1 (gct used) - 0x70 | // 2-4 : color resolution = 7 - 0x00 | // 5 : gct sort flag = 0 - palSize)); // 6-8 : gct size - - out.write(0); // background color index - out.write(0); // pixel aspect ratio - assume 1:1 - } - - /** - * Writes Netscape application extension to define repeat count. - */ - protected void writeNetscapeExt() throws IOException { - out.write(0x21); // extension introducer - out.write(0xff); // app extension label - out.write(11); // block size - writeString("NETSCAPE" + "2.0"); // app id + auth code - out.write(3); // sub-block size - out.write(1); // loop sub-block id - writeShort(repeat); // loop count (extra iterations, 0=repeat forever) - out.write(0); // block terminator - } - - /** - * Writes color table - */ - protected void writePalette() throws IOException { - out.write(colorTab, 0, colorTab.length); - int n = (3 * 256) - colorTab.length; - for (int i = 0; i < n; i++) { - out.write(0); - } - } - - /** - * Encodes and writes pixel data - */ - protected void writePixels() throws IOException { - LZWEncoder encoder = new LZWEncoder(width, height, indexedPixels, colorDepth); - encoder.encode(out); - } - - /** - * Write 16-bit value to output stream, LSB first - */ - protected void writeShort(int value) throws IOException { - out.write(value & 0xff); - out.write((value >> 8) & 0xff); - } - - /** - * Writes string to output stream - */ - protected void writeString(String s) throws IOException { - for (int i = 0; i < s.length(); i++) { - out.write((byte) s.charAt(i)); - } - } + + protected int width; // image size + + protected int height; + + protected Color transparent = null; // transparent color if given + + protected int transIndex; // transparent index in color table + + protected int repeat = -1; // no repeat + + protected int delay = 0; // frame delay (hundredths) + + protected boolean started = false; // ready to output frames + + protected OutputStream out; + + protected BufferedImage image; // current frame + + protected byte[] pixels; // BGR byte array from frame + + protected byte[] indexedPixels; // converted frame indexed to palette + + protected int colorDepth; // number of bit planes + + protected byte[] colorTab; // RGB palette + + protected boolean[] usedEntry = new boolean[256]; // active palette entries + + protected int palSize = 7; // color table size (bits-1) + + protected int dispose = -1; // disposal code (-1 = use default) + + protected boolean closeStream = false; // close stream when finished + + protected boolean firstFrame = true; + + protected boolean sizeSet = false; // if false, get size from first frame + + protected int sample = 10; // default sample interval for quantizer + + /** + * Sets the delay time between each frame, or changes it for subsequent frames + * (applies to last frame added). + * + * @param ms int delay time in milliseconds + */ + public void setDelay(int ms) { + delay = Math.round(ms / 10.0f); + } + + /** + * Sets the GIF frame disposal code for the last added frame and any + * subsequent frames. Default is 0 if no transparent color has been set, + * otherwise 2. + * + * @param code int disposal code. + */ + public void setDispose(int code) { + if (code >= 0) { + dispose = code; + } + } + + /** + * Sets the number of times the set of GIF frames should be played. Default is + * 1; 0 means play indefinitely. Must be invoked before the first image is + * added. + * + * @param iter int number of iterations. + * @return + */ + public void setRepeat(int iter) { + if (iter >= 0) { + repeat = iter; + } + } + + /** + * Sets the transparent color for the last added frame and any subsequent + * frames. Since all colors are subject to modification in the quantization + * process, the color in the final palette for each frame closest to the given + * color becomes the transparent color for that frame. May be set to null to + * indicate no transparent color. + * + * @param c Color to be treated as transparent on display. + */ + public void setTransparent(Color c) { + transparent = c; + } + + /** + * Adds next GIF frame. The frame is not written immediately, but is actually + * deferred until the next frame is received so that timing data can be + * inserted. Invoking finish() flushes all frames. If + * setSize was not invoked, the size of the first image is used + * for all subsequent frames. + * + * @param im BufferedImage containing frame to write. + * @return true if successful. + */ + public boolean addFrame(BufferedImage im) { + if ((im == null) || !started) { + return false; + } + boolean ok = true; + try { + if (!sizeSet) { + // use first frame's size + setSize(im.getWidth(), im.getHeight()); + } + image = im; + getImagePixels(); // convert to correct format if necessary + analyzePixels(); // build color table & map pixels + if (firstFrame) { + writeLSD(); // logical screen descriptior + writePalette(); // global color table + if (repeat >= 0) { + // use NS app extension to indicate reps + writeNetscapeExt(); + } + } + writeGraphicCtrlExt(); // write graphic control extension + writeImageDesc(); // image descriptor + if (!firstFrame) { + writePalette(); // local color table + } + writePixels(); // encode and write pixel data + firstFrame = false; + } catch (IOException e) { + ok = false; + } + + return ok; + } + + /** + * Flushes any pending data and closes output file. If writing to an + * OutputStream, the stream is not closed. + */ + public boolean finish() { + if (!started) + return false; + boolean ok = true; + started = false; + try { + out.write(0x3b); // gif trailer + out.flush(); + if (closeStream) { + out.close(); + } + } catch (IOException e) { + ok = false; + } + + // reset for subsequent use + transIndex = 0; + out = null; + image = null; + pixels = null; + indexedPixels = null; + colorTab = null; + closeStream = false; + firstFrame = true; + + return ok; + } + + /** + * Sets frame rate in frames per second. Equivalent to + * setDelay(1000/fps). + * + * @param fps float frame rate (frames per second) + */ + public void setFrameRate(float fps) { + if (fps != 0f) { + delay = Math.round(100f / fps); + } + } + + /** + * Sets quality of color quantization (conversion of images to the maximum 256 + * colors allowed by the GIF specification). Lower values (minimum = 1) + * produce better colors, but slow processing significantly. 10 is the + * default, and produces good color mapping at reasonable speeds. Values + * greater than 20 do not yield significant improvements in speed. + * + * @param quality int greater than 0. + * @return + */ + public void setQuality(int quality) { + if (quality < 1) + quality = 1; + sample = quality; + } + + /** + * Sets the GIF frame size. The default size is the size of the first frame + * added if this method is not invoked. + * + * @param w int frame width. + * @param h int frame width. + */ + public void setSize(int w, int h) { + if (started && !firstFrame) + return; + width = w; + height = h; + if (width < 1) + width = 320; + if (height < 1) + height = 240; + sizeSet = true; + } + + /** + * Initiates GIF file creation on the given stream. The stream is not closed + * automatically. + * + * @param os OutputStream on which GIF images are written. + * @return false if initial write failed. + */ + public boolean start(OutputStream os) { + if (os == null) + return false; + boolean ok = true; + closeStream = false; + out = os; + try { + writeString("GIF89a"); // header + } catch (IOException e) { + ok = false; + } + return started = ok; + } + + /** + * Initiates writing of a GIF file with the specified name. + * + * @param file String containing output file name. + * @return false if open or initial write failed. + */ + public boolean start(String file) { + boolean ok = true; + try { + out = new BufferedOutputStream(new FileOutputStream(file)); + ok = start(out); + closeStream = true; + } catch (IOException e) { + ok = false; + } + return started = ok; + } + + /** + * Analyzes image colors and creates color map. + */ + protected void analyzePixels() { + int len = pixels.length; + int nPix = len / 3; + indexedPixels = new byte[nPix]; + NeuQuant nq = new NeuQuant(pixels, len, sample); + // initialize quantizer + colorTab = nq.process(); // create reduced palette + // convert map from BGR to RGB + for (int i = 0; i < colorTab.length; i += 3) { + byte temp = colorTab[i]; + colorTab[i] = colorTab[i + 2]; + colorTab[i + 2] = temp; + usedEntry[i / 3] = false; + } + // map image pixels to new palette + int k = 0; + for (int i = 0; i < nPix; i++) { + int index = nq.map(pixels[k++] & 0xff, pixels[k++] & 0xff, pixels[k++] & 0xff); + usedEntry[index] = true; + indexedPixels[i] = (byte) index; + } + pixels = null; + colorDepth = 8; + palSize = 7; + // get closest match to transparent color if specified + if (transparent != null) { + transIndex = findClosest(transparent); + } + } + + /** + * Returns index of palette color closest to c + */ + protected int findClosest(Color c) { + if (colorTab == null) + return -1; + int r = c.getRed(); + int g = c.getGreen(); + int b = c.getBlue(); + int minpos = 0; + int dmin = 256 * 256 * 256; + int len = colorTab.length; + for (int i = 0; i < len; ) { + int dr = r - (colorTab[i++] & 0xff); + int dg = g - (colorTab[i++] & 0xff); + int db = b - (colorTab[i] & 0xff); + int d = dr * dr + dg * dg + db * db; + int index = i / 3; + if (usedEntry[index] && (d < dmin)) { + dmin = d; + minpos = index; + } + i++; + } + return minpos; + } + + /** + * Extracts image pixels into byte array "pixels" + */ + protected void getImagePixels() { + int w = image.getWidth(); + int h = image.getHeight(); + int type = image.getType(); + if ((w != width) || (h != height) || (type != BufferedImage.TYPE_3BYTE_BGR)) { + // create new image with right size/format + BufferedImage temp = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR); + Graphics2D g = temp.createGraphics(); + g.drawImage(image, 0, 0, null); + image = temp; + } + pixels = ((DataBufferByte) image.getRaster().getDataBuffer()).getData(); + } + + /** + * Writes Graphic Control Extension + */ + protected void writeGraphicCtrlExt() throws IOException { + out.write(0x21); // extension introducer + out.write(0xf9); // GCE label + out.write(4); // data block size + int transp, disp; + if (transparent == null) { + transp = 0; + disp = 0; // dispose = no action + } else { + transp = 1; + disp = 2; // force clear if using transparent color + } + if (dispose >= 0) { + disp = dispose & 7; // user override + } + disp <<= 2; + + // packed fields + out.write(0 | // 1:3 reserved + disp | // 4:6 disposal + 0 | // 7 user input - 0 = none + transp); // 8 transparency flag + + writeShort(delay); // delay x 1/100 sec + out.write(transIndex); // transparent color index + out.write(0); // block terminator + } + + /** + * Writes Image Descriptor + */ + protected void writeImageDesc() throws IOException { + out.write(0x2c); // image separator + writeShort(0); // image position x,y = 0,0 + writeShort(0); + writeShort(width); // image size + writeShort(height); + // packed fields + if (firstFrame) { + // no LCT - GCT is used for first (or only) frame + out.write(0); + } else { + // specify normal LCT + out.write(0x80 | // 1 local color table 1=yes + 0 | // 2 interlace - 0=no + 0 | // 3 sorted - 0=no + 0 | // 4-5 reserved + palSize); // 6-8 size of color table + } + } + + /** + * Writes Logical Screen Descriptor + */ + protected void writeLSD() throws IOException { + // logical screen size + writeShort(width); + writeShort(height); + // packed fields + out.write((0x80 | // 1 : global color table flag = 1 (gct used) + 0x70 | // 2-4 : color resolution = 7 + 0x00 | // 5 : gct sort flag = 0 + palSize)); // 6-8 : gct size + + out.write(0); // background color index + out.write(0); // pixel aspect ratio - assume 1:1 + } + + /** + * Writes Netscape application extension to define repeat count. + */ + protected void writeNetscapeExt() throws IOException { + out.write(0x21); // extension introducer + out.write(0xff); // app extension label + out.write(11); // block size + writeString("NETSCAPE" + "2.0"); // app id + auth code + out.write(3); // sub-block size + out.write(1); // loop sub-block id + writeShort(repeat); // loop count (extra iterations, 0=repeat forever) + out.write(0); // block terminator + } + + /** + * Writes color table + */ + protected void writePalette() throws IOException { + out.write(colorTab, 0, colorTab.length); + int n = (3 * 256) - colorTab.length; + for (int i = 0; i < n; i++) { + out.write(0); + } + } + + /** + * Encodes and writes pixel data + */ + protected void writePixels() throws IOException { + LZWEncoder encoder = new LZWEncoder(width, height, indexedPixels, colorDepth); + encoder.encode(out); + } + + /** + * Write 16-bit value to output stream, LSB first + */ + protected void writeShort(int value) throws IOException { + out.write(value & 0xff); + out.write((value >> 8) & 0xff); + } + + /** + * Writes string to output stream + */ + protected void writeString(String s) throws IOException { + for (int i = 0; i < s.length(); i++) { + out.write((byte) s.charAt(i)); + } + } } - -// + +// // Adapted from Jef Poskanzer's Java port by way of J. M. G. Elliott. // K Weiner 12/00 - + class LZWEncoder { - - private static final int EOF = -1; - - private int imgW, imgH; - - private byte[] pixAry; - - private int initCodeSize; - - private int remaining; - - private int curPixel; - - // GIFCOMPR.C - GIF Image compression routines - // - // Lempel-Ziv compression based on 'compress'. GIF modifications by - // David Rowley (mgardi@watdcsu.waterloo.edu) - - // General DEFINEs - - static final int BITS = 12; - - static final int HSIZE = 5003; // 80% occupancy - - // GIF Image compression - modified 'compress' - // - // Based on: compress.c - File compression ala IEEE Computer, June 1984. - // - // By Authors: Spencer W. Thomas (decvax!harpo!utah-cs!utah-gr!thomas) - // Jim McKie (decvax!mcvax!jim) - // Steve Davies (decvax!vax135!petsd!peora!srd) - // Ken Turkowski (decvax!decwrl!turtlevax!ken) - // James A. Woods (decvax!ihnp4!ames!jaw) - // Joe Orost (decvax!vax135!petsd!joe) - - int n_bits; // number of bits/code - - int maxbits = BITS; // user settable max # bits/code - - int maxcode; // maximum code, given n_bits - - int maxmaxcode = 1 << BITS; // should NEVER generate this code - - int[] htab = new int[HSIZE]; - - int[] codetab = new int[HSIZE]; - - int hsize = HSIZE; // for dynamic table sizing - - int free_ent = 0; // first unused entry - - // block compression parameters -- after all codes are used up, - // and compression rate changes, start over. - boolean clear_flg = false; - - // Algorithm: use open addressing double hashing (no chaining) on the - // prefix code / next character combination. We do a variant of Knuth's - // algorithm D (vol. 3, sec. 6.4) along with G. Knott's relatively-prime - // secondary probe. Here, the modular division first probe is gives way - // to a faster exclusive-or manipulation. Also do block compression with - // an adaptive reset, whereby the code table is cleared when the compression - // ratio decreases, but after the table fills. The variable-length output - // codes are re-sized at this point, and a special CLEAR code is generated - // for the decompressor. Late addition: construct the table according to - // file size for noticeable speed improvement on small files. Please direct - // questions about this implementation to ames!jaw. - - int g_init_bits; - - int ClearCode; - - int EOFCode; - - // output - // - // Output the given code. - // Inputs: - // code: A n_bits-bit integer. If == -1, then EOF. This assumes - // that n_bits =< wordsize - 1. - // Outputs: - // Outputs code to the file. - // Assumptions: - // Chars are 8 bits long. - // Algorithm: - // Maintain a BITS character long buffer (so that 8 codes will - // fit in it exactly). Use the VAX insv instruction to insert each - // code in turn. When the buffer fills up empty it and start over. - - int cur_accum = 0; - - int cur_bits = 0; - - int masks[] = { 0x0000, 0x0001, 0x0003, 0x0007, 0x000F, 0x001F, 0x003F, 0x007F, 0x00FF, 0x01FF, - 0x03FF, 0x07FF, 0x0FFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF }; - - // Number of characters so far in this 'packet' - int a_count; - - // Define the storage for the packet accumulator - byte[] accum = new byte[256]; - - // ---------------------------------------------------------------------------- - LZWEncoder(int width, int height, byte[] pixels, int color_depth) { - imgW = width; - imgH = height; - pixAry = pixels; - initCodeSize = Math.max(2, color_depth); - } - - // Add a character to the end of the current packet, and if it is 254 - // characters, flush the packet to disk. - void char_out(byte c, OutputStream outs) throws IOException { - accum[a_count++] = c; - if (a_count >= 254) - flush_char(outs); - } - - // Clear out the hash table - - // table clear for block compress - void cl_block(OutputStream outs) throws IOException { - cl_hash(hsize); - free_ent = ClearCode + 2; - clear_flg = true; - - output(ClearCode, outs); - } - - // reset code table - void cl_hash(int hsize) { - for (int i = 0; i < hsize; ++i) - htab[i] = -1; - } - - void compress(int init_bits, OutputStream outs) throws IOException { - int fcode; - int i /* = 0 */; - int c; - int ent; - int disp; - int hsize_reg; - int hshift; - - // Set up the globals: g_init_bits - initial number of bits - g_init_bits = init_bits; - - // Set up the necessary values - clear_flg = false; - n_bits = g_init_bits; - maxcode = MAXCODE(n_bits); - - ClearCode = 1 << (init_bits - 1); - EOFCode = ClearCode + 1; - free_ent = ClearCode + 2; - - a_count = 0; // clear packet - - ent = nextPixel(); - - hshift = 0; - for (fcode = hsize; fcode < 65536; fcode *= 2) - ++hshift; - hshift = 8 - hshift; // set hash code range bound - - hsize_reg = hsize; - cl_hash(hsize_reg); // clear hash table - - output(ClearCode, outs); - - outer_loop: while ((c = nextPixel()) != EOF) { - fcode = (c << maxbits) + ent; - i = (c << hshift) ^ ent; // xor hashing - - if (htab[i] == fcode) { - ent = codetab[i]; - continue; - } else if (htab[i] >= 0) // non-empty slot - { - disp = hsize_reg - i; // secondary hash (after G. Knott) - if (i == 0) - disp = 1; - do { - if ((i -= disp) < 0) - i += hsize_reg; - - if (htab[i] == fcode) { - ent = codetab[i]; - continue outer_loop; - } - } while (htab[i] >= 0); - } - output(ent, outs); - ent = c; - if (free_ent < maxmaxcode) { - codetab[i] = free_ent++; // code -> hashtable - htab[i] = fcode; - } else - cl_block(outs); - } - // Put out the final code. - output(ent, outs); - output(EOFCode, outs); - } - - // ---------------------------------------------------------------------------- - void encode(OutputStream os) throws IOException { - os.write(initCodeSize); // write "initial code size" byte - - remaining = imgW * imgH; // reset navigation variables - curPixel = 0; - - compress(initCodeSize + 1, os); // compress and write the pixel data - - os.write(0); // write block terminator - } - - // Flush the packet to disk, and reset the accumulator - void flush_char(OutputStream outs) throws IOException { - if (a_count > 0) { - outs.write(a_count); - outs.write(accum, 0, a_count); - a_count = 0; - } - } - - final int MAXCODE(int n_bits) { - return (1 << n_bits) - 1; - } - - // ---------------------------------------------------------------------------- - // Return the next pixel from the image - // ---------------------------------------------------------------------------- - private int nextPixel() { - if (remaining == 0) - return EOF; - - --remaining; - - byte pix = pixAry[curPixel++]; - - return pix & 0xff; - } - - void output(int code, OutputStream outs) throws IOException { - cur_accum &= masks[cur_bits]; - - if (cur_bits > 0) - cur_accum |= (code << cur_bits); - else - cur_accum = code; - - cur_bits += n_bits; - - while (cur_bits >= 8) { - char_out((byte) (cur_accum & 0xff), outs); - cur_accum >>= 8; - cur_bits -= 8; - } - - // If the next entry is going to be too big for the code size, - // then increase it, if possible. - if (free_ent > maxcode || clear_flg) { - if (clear_flg) { - maxcode = MAXCODE(n_bits = g_init_bits); - clear_flg = false; - } else { - ++n_bits; - if (n_bits == maxbits) - maxcode = maxmaxcode; - else - maxcode = MAXCODE(n_bits); - } - } - - if (code == EOFCode) { - // At EOF, write the rest of the buffer. - while (cur_bits > 0) { - char_out((byte) (cur_accum & 0xff), outs); - cur_accum >>= 8; - cur_bits -= 8; - } - - flush_char(outs); - } - } + + static final int BITS = 12; + static final int HSIZE = 5003; // 80% occupancy + private static final int EOF = -1; + int n_bits; // number of bits/code + int maxbits = BITS; // user settable max # bits/code + int maxcode; // maximum code, given n_bits + + // GIFCOMPR.C - GIF Image compression routines + // + // Lempel-Ziv compression based on 'compress'. GIF modifications by + // David Rowley (mgardi@watdcsu.waterloo.edu) + + // General DEFINEs + int maxmaxcode = 1 << BITS; // should NEVER generate this code + int[] htab = new int[HSIZE]; + + // GIF Image compression - modified 'compress' + // + // Based on: compress.c - File compression ala IEEE Computer, June 1984. + // + // By Authors: Spencer W. Thomas (decvax!harpo!utah-cs!utah-gr!thomas) + // Jim McKie (decvax!mcvax!jim) + // Steve Davies (decvax!vax135!petsd!peora!srd) + // Ken Turkowski (decvax!decwrl!turtlevax!ken) + // James A. Woods (decvax!ihnp4!ames!jaw) + // Joe Orost (decvax!vax135!petsd!joe) + int[] codetab = new int[HSIZE]; + int hsize = HSIZE; // for dynamic table sizing + int free_ent = 0; // first unused entry + // block compression parameters -- after all codes are used up, + // and compression rate changes, start over. + boolean clear_flg = false; + int g_init_bits; + int ClearCode; + int EOFCode; + int cur_accum = 0; + int cur_bits = 0; + + // Algorithm: use open addressing double hashing (no chaining) on the + // prefix code / next character combination. We do a variant of Knuth's + // algorithm D (vol. 3, sec. 6.4) along with G. Knott's relatively-prime + // secondary probe. Here, the modular division first probe is gives way + // to a faster exclusive-or manipulation. Also do block compression with + // an adaptive reset, whereby the code table is cleared when the compression + // ratio decreases, but after the table fills. The variable-length output + // codes are re-sized at this point, and a special CLEAR code is generated + // for the decompressor. Late addition: construct the table according to + // file size for noticeable speed improvement on small files. Please direct + // questions about this implementation to ames!jaw. + int masks[] = {0x0000, 0x0001, 0x0003, 0x0007, 0x000F, 0x001F, 0x003F, 0x007F, 0x00FF, 0x01FF, + 0x03FF, 0x07FF, 0x0FFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF}; + // Number of characters so far in this 'packet' + int a_count; + // Define the storage for the packet accumulator + byte[] accum = new byte[256]; + + // output + // + // Output the given code. + // Inputs: + // code: A n_bits-bit integer. If == -1, then EOF. This assumes + // that n_bits =< wordsize - 1. + // Outputs: + // Outputs code to the file. + // Assumptions: + // Chars are 8 bits long. + // Algorithm: + // Maintain a BITS character long buffer (so that 8 codes will + // fit in it exactly). Use the VAX insv instruction to insert each + // code in turn. When the buffer fills up empty it and start over. + private int imgW, imgH; + private byte[] pixAry; + private int initCodeSize; + private int remaining; + private int curPixel; + + // ---------------------------------------------------------------------------- + LZWEncoder(int width, int height, byte[] pixels, int color_depth) { + imgW = width; + imgH = height; + pixAry = pixels; + initCodeSize = Math.max(2, color_depth); + } + + // Add a character to the end of the current packet, and if it is 254 + // characters, flush the packet to disk. + void char_out(byte c, OutputStream outs) throws IOException { + accum[a_count++] = c; + if (a_count >= 254) + flush_char(outs); + } + + // Clear out the hash table + + // table clear for block compress + void cl_block(OutputStream outs) throws IOException { + cl_hash(hsize); + free_ent = ClearCode + 2; + clear_flg = true; + + output(ClearCode, outs); + } + + // reset code table + void cl_hash(int hsize) { + for (int i = 0; i < hsize; ++i) + htab[i] = -1; + } + + void compress(int init_bits, OutputStream outs) throws IOException { + int fcode; + int i /* = 0 */; + int c; + int ent; + int disp; + int hsize_reg; + int hshift; + + // Set up the globals: g_init_bits - initial number of bits + g_init_bits = init_bits; + + // Set up the necessary values + clear_flg = false; + n_bits = g_init_bits; + maxcode = MAXCODE(n_bits); + + ClearCode = 1 << (init_bits - 1); + EOFCode = ClearCode + 1; + free_ent = ClearCode + 2; + + a_count = 0; // clear packet + + ent = nextPixel(); + + hshift = 0; + for (fcode = hsize; fcode < 65536; fcode *= 2) + ++hshift; + hshift = 8 - hshift; // set hash code range bound + + hsize_reg = hsize; + cl_hash(hsize_reg); // clear hash table + + output(ClearCode, outs); + + outer_loop: + while ((c = nextPixel()) != EOF) { + fcode = (c << maxbits) + ent; + i = (c << hshift) ^ ent; // xor hashing + + if (htab[i] == fcode) { + ent = codetab[i]; + continue; + } else if (htab[i] >= 0) // non-empty slot + { + disp = hsize_reg - i; // secondary hash (after G. Knott) + if (i == 0) + disp = 1; + do { + if ((i -= disp) < 0) + i += hsize_reg; + + if (htab[i] == fcode) { + ent = codetab[i]; + continue outer_loop; + } + } while (htab[i] >= 0); + } + output(ent, outs); + ent = c; + if (free_ent < maxmaxcode) { + codetab[i] = free_ent++; // code -> hashtable + htab[i] = fcode; + } else + cl_block(outs); + } + // Put out the final code. + output(ent, outs); + output(EOFCode, outs); + } + + // ---------------------------------------------------------------------------- + void encode(OutputStream os) throws IOException { + os.write(initCodeSize); // write "initial code size" byte + + remaining = imgW * imgH; // reset navigation variables + curPixel = 0; + + compress(initCodeSize + 1, os); // compress and write the pixel data + + os.write(0); // write block terminator + } + + // Flush the packet to disk, and reset the accumulator + void flush_char(OutputStream outs) throws IOException { + if (a_count > 0) { + outs.write(a_count); + outs.write(accum, 0, a_count); + a_count = 0; + } + } + + final int MAXCODE(int n_bits) { + return (1 << n_bits) - 1; + } + + // ---------------------------------------------------------------------------- + // Return the next pixel from the image + // ---------------------------------------------------------------------------- + private int nextPixel() { + if (remaining == 0) + return EOF; + + --remaining; + + byte pix = pixAry[curPixel++]; + + return pix & 0xff; + } + + void output(int code, OutputStream outs) throws IOException { + cur_accum &= masks[cur_bits]; + + if (cur_bits > 0) + cur_accum |= (code << cur_bits); + else + cur_accum = code; + + cur_bits += n_bits; + + while (cur_bits >= 8) { + char_out((byte) (cur_accum & 0xff), outs); + cur_accum >>= 8; + cur_bits -= 8; + } + + // If the next entry is going to be too big for the code size, + // then increase it, if possible. + if (free_ent > maxcode || clear_flg) { + if (clear_flg) { + maxcode = MAXCODE(n_bits = g_init_bits); + clear_flg = false; + } else { + ++n_bits; + if (n_bits == maxbits) + maxcode = maxmaxcode; + else + maxcode = MAXCODE(n_bits); + } + } + + if (code == EOFCode) { + // At EOF, write the rest of the buffer. + while (cur_bits > 0) { + char_out((byte) (cur_accum & 0xff), outs); + cur_accum >>= 8; + cur_bits -= 8; + } + + flush_char(outs); + } + } } - + /* * NeuQuant Neural-Net Quantization Algorithm * ------------------------------------------ - * + * * Copyright (c) 1994 Anthony Dekker - * + * * NEUQUANT Neural-Net quantization algorithm by Anthony Dekker, 1994. See * "Kohonen neural networks for optimal colour quantization" in "Network: * Computation in Neural Systems" Vol. 5 (1994) pp 351-367. for a discussion of * the algorithm. - * + * * Any party obtaining a copy of these files from the author, directly or * indirectly, is granted, free of charge, a full and unrestricted irrevocable, * world-wide, paid up, royalty-free, nonexclusive right and license to deal in @@ -811,484 +774,472 @@ class LZWEncoder { * receive copies from any such party to do so, with the only requirement being * that this copyright notice remain intact. */ - + // Ported to Java 12/00 K Weiner class NeuQuant { - - protected static final int netsize = 256; /* number of colours used */ - - /* four primes near 500 - assume no image has a length so large */ - /* that it is divisible by all four primes */ - protected static final int prime1 = 499; - - protected static final int prime2 = 491; - - protected static final int prime3 = 487; - - protected static final int prime4 = 503; - - protected static final int minpicturebytes = (3 * prime4); - - /* minimum size for input image */ - - /* - * Program Skeleton ---------------- [select samplefac in range 1..30] [read - * image from input file] pic = (unsigned char*) malloc(3*width*height); - * initnet(pic,3*width*height,samplefac); learn(); unbiasnet(); [write output - * image header, using writecolourmap(f)] inxbuild(); write output image using - * inxsearch(b,g,r) - */ - - /* - * Network Definitions ------------------- - */ - - protected static final int maxnetpos = (netsize - 1); - - protected static final int netbiasshift = 4; /* bias for colour values */ - - protected static final int ncycles = 100; /* no. of learning cycles */ - - /* defs for freq and bias */ - protected static final int intbiasshift = 16; /* bias for fractions */ - - protected static final int intbias = (((int) 1) << intbiasshift); - - protected static final int gammashift = 10; /* gamma = 1024 */ - - protected static final int gamma = (((int) 1) << gammashift); - - protected static final int betashift = 10; - - protected static final int beta = (intbias >> betashift); /* beta = 1/1024 */ - - protected static final int betagamma = (intbias << (gammashift - betashift)); - - /* defs for decreasing radius factor */ - protected static final int initrad = (netsize >> 3); /* - * for 256 cols, radius - * starts - */ - - protected static final int radiusbiasshift = 6; /* at 32.0 biased by 6 bits */ - - protected static final int radiusbias = (((int) 1) << radiusbiasshift); - - protected static final int initradius = (initrad * radiusbias); /* - * and - * decreases - * by a - */ - - protected static final int radiusdec = 30; /* factor of 1/30 each cycle */ - - /* defs for decreasing alpha factor */ - protected static final int alphabiasshift = 10; /* alpha starts at 1.0 */ - - protected static final int initalpha = (((int) 1) << alphabiasshift); - - protected int alphadec; /* biased by 10 bits */ - - /* radbias and alpharadbias used for radpower calculation */ - protected static final int radbiasshift = 8; - - protected static final int radbias = (((int) 1) << radbiasshift); - - protected static final int alpharadbshift = (alphabiasshift + radbiasshift); - - protected static final int alpharadbias = (((int) 1) << alpharadbshift); - - /* - * Types and Global Variables -------------------------- - */ - - protected byte[] thepicture; /* the input image itself */ - - protected int lengthcount; /* lengthcount = H*W*3 */ - - protected int samplefac; /* sampling factor 1..30 */ - - // typedef int pixel[4]; /* BGRc */ - protected int[][] network; /* the network itself - [netsize][4] */ - - protected int[] netindex = new int[256]; - - /* for network lookup - really 256 */ - - protected int[] bias = new int[netsize]; - - /* bias and freq arrays for learning */ - protected int[] freq = new int[netsize]; - - protected int[] radpower = new int[initrad]; - - /* radpower for precomputation */ - - /* - * Initialise network in range (0,0,0) to (255,255,255) and set parameters - * ----------------------------------------------------------------------- - */ - public NeuQuant(byte[] thepic, int len, int sample) { - - int i; - int[] p; - - thepicture = thepic; - lengthcount = len; - samplefac = sample; - - network = new int[netsize][]; - for (i = 0; i < netsize; i++) { - network[i] = new int[4]; - p = network[i]; - p[0] = p[1] = p[2] = (i << (netbiasshift + 8)) / netsize; - freq[i] = intbias / netsize; /* 1/netsize */ - bias[i] = 0; - } - } - - public byte[] colorMap() { - byte[] map = new byte[3 * netsize]; - int[] index = new int[netsize]; - for (int i = 0; i < netsize; i++) - index[network[i][3]] = i; - int k = 0; - for (int i = 0; i < netsize; i++) { - int j = index[i]; - map[k++] = (byte) (network[j][0]); - map[k++] = (byte) (network[j][1]); - map[k++] = (byte) (network[j][2]); - } - return map; - } - - /* - * Insertion sort of network and building of netindex[0..255] (to do after - * unbias) - * ------------------------------------------------------------------------------- - */ - public void inxbuild() { - - int i, j, smallpos, smallval; - int[] p; - int[] q; - int previouscol, startpos; - - previouscol = 0; - startpos = 0; - for (i = 0; i < netsize; i++) { - p = network[i]; - smallpos = i; - smallval = p[1]; /* index on g */ - /* find smallest in i..netsize-1 */ - for (j = i + 1; j < netsize; j++) { - q = network[j]; - if (q[1] < smallval) { /* index on g */ - smallpos = j; - smallval = q[1]; /* index on g */ - } - } - q = network[smallpos]; - /* swap p (i) and q (smallpos) entries */ - if (i != smallpos) { - j = q[0]; - q[0] = p[0]; - p[0] = j; - j = q[1]; - q[1] = p[1]; - p[1] = j; - j = q[2]; - q[2] = p[2]; - p[2] = j; - j = q[3]; - q[3] = p[3]; - p[3] = j; - } - /* smallval entry is now in position i */ - if (smallval != previouscol) { - netindex[previouscol] = (startpos + i) >> 1; - for (j = previouscol + 1; j < smallval; j++) - netindex[j] = i; - previouscol = smallval; - startpos = i; - } - } - netindex[previouscol] = (startpos + maxnetpos) >> 1; - for (j = previouscol + 1; j < 256; j++) - netindex[j] = maxnetpos; /* really 256 */ - } - - /* - * Main Learning Loop ------------------ - */ - public void learn() { - - int i, j, b, g, r; - int radius, rad, alpha, step, delta, samplepixels; - byte[] p; - int pix, lim; - - if (lengthcount < minpicturebytes) - samplefac = 1; - alphadec = 30 + ((samplefac - 1) / 3); - p = thepicture; - pix = 0; - lim = lengthcount; - samplepixels = lengthcount / (3 * samplefac); - delta = samplepixels / ncycles; - alpha = initalpha; - radius = initradius; - - rad = radius >> radiusbiasshift; - if (rad <= 1) - rad = 0; - for (i = 0; i < rad; i++) - radpower[i] = alpha * (((rad * rad - i * i) * radbias) / (rad * rad)); - - // fprintf(stderr,"beginning 1D learning: initial radius=%d\n", rad); - - if (lengthcount < minpicturebytes) - step = 3; - else if ((lengthcount % prime1) != 0) - step = 3 * prime1; - else { - if ((lengthcount % prime2) != 0) - step = 3 * prime2; - else { - if ((lengthcount % prime3) != 0) - step = 3 * prime3; - else - step = 3 * prime4; - } - } - - i = 0; - while (i < samplepixels) { - b = (p[pix + 0] & 0xff) << netbiasshift; - g = (p[pix + 1] & 0xff) << netbiasshift; - r = (p[pix + 2] & 0xff) << netbiasshift; - j = contest(b, g, r); - - altersingle(alpha, j, b, g, r); - if (rad != 0) - alterneigh(rad, j, b, g, r); /* alter neighbours */ - - pix += step; - if (pix >= lim) - pix -= lengthcount; - - i++; - if (delta == 0) - delta = 1; - if (i % delta == 0) { - alpha -= alpha / alphadec; - radius -= radius / radiusdec; - rad = radius >> radiusbiasshift; - if (rad <= 1) - rad = 0; - for (j = 0; j < rad; j++) - radpower[j] = alpha * (((rad * rad - j * j) * radbias) / (rad * rad)); - } - } - // fprintf(stderr,"finished 1D learning: final alpha=%f - // !\n",((float)alpha)/initalpha); - } - - /* - * Search for BGR values 0..255 (after net is unbiased) and return colour - * index - * ---------------------------------------------------------------------------- - */ - public int map(int b, int g, int r) { - - int i, j, dist, a, bestd; - int[] p; - int best; - - bestd = 1000; /* biggest possible dist is 256*3 */ - best = -1; - i = netindex[g]; /* index on g */ - j = i - 1; /* start at netindex[g] and work outwards */ - - while ((i < netsize) || (j >= 0)) { - if (i < netsize) { - p = network[i]; - dist = p[1] - g; /* inx key */ - if (dist >= bestd) - i = netsize; /* stop iter */ - else { - i++; - if (dist < 0) - dist = -dist; - a = p[0] - b; - if (a < 0) - a = -a; - dist += a; - if (dist < bestd) { - a = p[2] - r; - if (a < 0) - a = -a; - dist += a; - if (dist < bestd) { - bestd = dist; - best = p[3]; - } - } - } - } - if (j >= 0) { - p = network[j]; - dist = g - p[1]; /* inx key - reverse dif */ - if (dist >= bestd) - j = -1; /* stop iter */ - else { - j--; - if (dist < 0) - dist = -dist; - a = p[0] - b; - if (a < 0) - a = -a; - dist += a; - if (dist < bestd) { - a = p[2] - r; - if (a < 0) - a = -a; - dist += a; - if (dist < bestd) { - bestd = dist; - best = p[3]; - } - } - } - } - } - return (best); - } - - public byte[] process() { - learn(); - unbiasnet(); - inxbuild(); - return colorMap(); - } - - /* - * Unbias network to give byte values 0..255 and record position i to prepare - * for sort - * ----------------------------------------------------------------------------------- - */ - public void unbiasnet() { - for (int i = 0; i < netsize; i++) { - network[i][0] >>= netbiasshift; - network[i][1] >>= netbiasshift; - network[i][2] >>= netbiasshift; - network[i][3] = i; /* record colour no */ - } - } - - /* - * Move adjacent neurons by precomputed alpha*(1-((i-j)^2/[r]^2)) in - * radpower[|i-j|] - * --------------------------------------------------------------------------------- - */ - protected void alterneigh(int rad, int i, int b, int g, int r) { - - int j, k, lo, hi, a, m; - int[] p; - - lo = i - rad; - if (lo < -1) - lo = -1; - hi = i + rad; - if (hi > netsize) - hi = netsize; - - j = i + 1; - k = i - 1; - m = 1; - while ((j < hi) || (k > lo)) { - a = radpower[m++]; - if (j < hi) { - p = network[j++]; - try { - p[0] -= (a * (p[0] - b)) / alpharadbias; - p[1] -= (a * (p[1] - g)) / alpharadbias; - p[2] -= (a * (p[2] - r)) / alpharadbias; - } catch (Exception e) { - } // prevents 1.3 miscompilation - } - if (k > lo) { - p = network[k--]; - try { - p[0] -= (a * (p[0] - b)) / alpharadbias; - p[1] -= (a * (p[1] - g)) / alpharadbias; - p[2] -= (a * (p[2] - r)) / alpharadbias; - } catch (Exception e) { - } - } - } - } - - /* - * Move neuron i towards biased (b,g,r) by factor alpha - * ---------------------------------------------------- - */ - protected void altersingle(int alpha, int i, int b, int g, int r) { - - /* alter hit neuron */ - int[] n = network[i]; - n[0] -= (alpha * (n[0] - b)) / initalpha; - n[1] -= (alpha * (n[1] - g)) / initalpha; - n[2] -= (alpha * (n[2] - r)) / initalpha; - } - - /* - * Search for biased BGR values ---------------------------- - */ - protected int contest(int b, int g, int r) { - - /* finds closest neuron (min dist) and updates freq */ - /* finds best neuron (min dist-bias) and returns position */ - /* for frequently chosen neurons, freq[i] is high and bias[i] is negative */ - /* bias[i] = gamma*((1/netsize)-freq[i]) */ - - int i, dist, a, biasdist, betafreq; - int bestpos, bestbiaspos, bestd, bestbiasd; - int[] n; - - bestd = ~(((int) 1) << 31); - bestbiasd = bestd; - bestpos = -1; - bestbiaspos = bestpos; - - for (i = 0; i < netsize; i++) { - n = network[i]; - dist = n[0] - b; - if (dist < 0) - dist = -dist; - a = n[1] - g; - if (a < 0) - a = -a; - dist += a; - a = n[2] - r; - if (a < 0) - a = -a; - dist += a; - if (dist < bestd) { - bestd = dist; - bestpos = i; - } - biasdist = dist - ((bias[i]) >> (intbiasshift - netbiasshift)); - if (biasdist < bestbiasd) { - bestbiasd = biasdist; - bestbiaspos = i; - } - betafreq = (freq[i] >> betashift); - freq[i] -= betafreq; - bias[i] += (betafreq << gammashift); - } - freq[bestpos] += beta; - bias[bestpos] -= betagamma; - return (bestbiaspos); - } -} \ No newline at end of file + + protected static final int netsize = 256; /* number of colours used */ + + /* four primes near 500 - assume no image has a length so large */ + /* that it is divisible by all four primes */ + protected static final int prime1 = 499; + + protected static final int prime2 = 491; + + protected static final int prime3 = 487; + + protected static final int prime4 = 503; + + protected static final int minpicturebytes = (3 * prime4); + + /* minimum size for input image */ + + /* + * Program Skeleton ---------------- [select samplefac in range 1..30] [read + * image from input file] pic = (unsigned char*) malloc(3*width*height); + * initnet(pic,3*width*height,samplefac); learn(); unbiasnet(); [write output + * image header, using writecolourmap(f)] inxbuild(); write output image using + * inxsearch(b,g,r) + */ + + /* + * Network Definitions ------------------- + */ + + protected static final int maxnetpos = (netsize - 1); + + protected static final int netbiasshift = 4; /* bias for colour values */ + + protected static final int ncycles = 100; /* no. of learning cycles */ + + /* defs for freq and bias */ + protected static final int intbiasshift = 16; /* bias for fractions */ + + protected static final int intbias = (((int) 1) << intbiasshift); + protected static final int gammashift = 10; /* gamma = 1024 */ + protected static final int gamma = (((int) 1) << gammashift); + protected static final int betashift = 10; + protected static final int beta = (intbias >> betashift); /* beta = 1/1024 */ + protected static final int betagamma = (intbias << (gammashift - betashift)); + /* defs for decreasing radius factor */ + protected static final int initrad = (netsize >> 3); /* + * for 256 cols, radius + * starts + */ + + protected static final int radiusbiasshift = 6; /* at 32.0 biased by 6 bits */ + + protected static final int radiusbias = (((int) 1) << radiusbiasshift); + + protected static final int initradius = (initrad * radiusbias); /* + * and + * decreases + * by a + */ + + protected static final int radiusdec = 30; /* factor of 1/30 each cycle */ + + /* defs for decreasing alpha factor */ + protected static final int alphabiasshift = 10; /* alpha starts at 1.0 */ + + protected static final int initalpha = (((int) 1) << alphabiasshift); + /* radbias and alpharadbias used for radpower calculation */ + protected static final int radbiasshift = 8; + protected static final int radbias = (((int) 1) << radbiasshift); + protected static final int alpharadbshift = (alphabiasshift + radbiasshift); + protected static final int alpharadbias = (((int) 1) << alpharadbshift); + protected int alphadec; /* biased by 10 bits */ + + /* + * Types and Global Variables -------------------------- + */ + protected byte[] thepicture; /* the input image itself */ + + protected int lengthcount; /* lengthcount = H*W*3 */ + + protected int samplefac; /* sampling factor 1..30 */ + + // typedef int pixel[4]; /* BGRc */ + protected int[][] network; /* the network itself - [netsize][4] */ + + protected int[] netindex = new int[256]; + + /* for network lookup - really 256 */ + + protected int[] bias = new int[netsize]; + + /* bias and freq arrays for learning */ + protected int[] freq = new int[netsize]; + + protected int[] radpower = new int[initrad]; + + /* radpower for precomputation */ + + /* + * Initialise network in range (0,0,0) to (255,255,255) and set parameters + * ----------------------------------------------------------------------- + */ + public NeuQuant(byte[] thepic, int len, int sample) { + + int i; + int[] p; + + thepicture = thepic; + lengthcount = len; + samplefac = sample; + + network = new int[netsize][]; + for (i = 0; i < netsize; i++) { + network[i] = new int[4]; + p = network[i]; + p[0] = p[1] = p[2] = (i << (netbiasshift + 8)) / netsize; + freq[i] = intbias / netsize; /* 1/netsize */ + bias[i] = 0; + } + } + + public byte[] colorMap() { + byte[] map = new byte[3 * netsize]; + int[] index = new int[netsize]; + for (int i = 0; i < netsize; i++) + index[network[i][3]] = i; + int k = 0; + for (int i = 0; i < netsize; i++) { + int j = index[i]; + map[k++] = (byte) (network[j][0]); + map[k++] = (byte) (network[j][1]); + map[k++] = (byte) (network[j][2]); + } + return map; + } + + /* + * Insertion sort of network and building of netindex[0..255] (to do after + * unbias) + * ------------------------------------------------------------------------------- + */ + public void inxbuild() { + + int i, j, smallpos, smallval; + int[] p; + int[] q; + int previouscol, startpos; + + previouscol = 0; + startpos = 0; + for (i = 0; i < netsize; i++) { + p = network[i]; + smallpos = i; + smallval = p[1]; /* index on g */ + /* find smallest in i..netsize-1 */ + for (j = i + 1; j < netsize; j++) { + q = network[j]; + if (q[1] < smallval) { /* index on g */ + smallpos = j; + smallval = q[1]; /* index on g */ + } + } + q = network[smallpos]; + /* swap p (i) and q (smallpos) entries */ + if (i != smallpos) { + j = q[0]; + q[0] = p[0]; + p[0] = j; + j = q[1]; + q[1] = p[1]; + p[1] = j; + j = q[2]; + q[2] = p[2]; + p[2] = j; + j = q[3]; + q[3] = p[3]; + p[3] = j; + } + /* smallval entry is now in position i */ + if (smallval != previouscol) { + netindex[previouscol] = (startpos + i) >> 1; + for (j = previouscol + 1; j < smallval; j++) + netindex[j] = i; + previouscol = smallval; + startpos = i; + } + } + netindex[previouscol] = (startpos + maxnetpos) >> 1; + for (j = previouscol + 1; j < 256; j++) + netindex[j] = maxnetpos; /* really 256 */ + } + + /* + * Main Learning Loop ------------------ + */ + public void learn() { + + int i, j, b, g, r; + int radius, rad, alpha, step, delta, samplepixels; + byte[] p; + int pix, lim; + + if (lengthcount < minpicturebytes) + samplefac = 1; + alphadec = 30 + ((samplefac - 1) / 3); + p = thepicture; + pix = 0; + lim = lengthcount; + samplepixels = lengthcount / (3 * samplefac); + delta = samplepixels / ncycles; + alpha = initalpha; + radius = initradius; + + rad = radius >> radiusbiasshift; + if (rad <= 1) + rad = 0; + for (i = 0; i < rad; i++) + radpower[i] = alpha * (((rad * rad - i * i) * radbias) / (rad * rad)); + + // fprintf(stderr,"beginning 1D learning: initial radius=%d\n", rad); + + if (lengthcount < minpicturebytes) + step = 3; + else if ((lengthcount % prime1) != 0) + step = 3 * prime1; + else { + if ((lengthcount % prime2) != 0) + step = 3 * prime2; + else { + if ((lengthcount % prime3) != 0) + step = 3 * prime3; + else + step = 3 * prime4; + } + } + + i = 0; + while (i < samplepixels) { + b = (p[pix + 0] & 0xff) << netbiasshift; + g = (p[pix + 1] & 0xff) << netbiasshift; + r = (p[pix + 2] & 0xff) << netbiasshift; + j = contest(b, g, r); + + altersingle(alpha, j, b, g, r); + if (rad != 0) + alterneigh(rad, j, b, g, r); /* alter neighbours */ + + pix += step; + if (pix >= lim) + pix -= lengthcount; + + i++; + if (delta == 0) + delta = 1; + if (i % delta == 0) { + alpha -= alpha / alphadec; + radius -= radius / radiusdec; + rad = radius >> radiusbiasshift; + if (rad <= 1) + rad = 0; + for (j = 0; j < rad; j++) + radpower[j] = alpha * (((rad * rad - j * j) * radbias) / (rad * rad)); + } + } + // fprintf(stderr,"finished 1D learning: final alpha=%f + // !\n",((float)alpha)/initalpha); + } + + /* + * Search for BGR values 0..255 (after net is unbiased) and return colour + * index + * ---------------------------------------------------------------------------- + */ + public int map(int b, int g, int r) { + + int i, j, dist, a, bestd; + int[] p; + int best; + + bestd = 1000; /* biggest possible dist is 256*3 */ + best = -1; + i = netindex[g]; /* index on g */ + j = i - 1; /* start at netindex[g] and work outwards */ + + while ((i < netsize) || (j >= 0)) { + if (i < netsize) { + p = network[i]; + dist = p[1] - g; /* inx key */ + if (dist >= bestd) + i = netsize; /* stop iter */ + else { + i++; + if (dist < 0) + dist = -dist; + a = p[0] - b; + if (a < 0) + a = -a; + dist += a; + if (dist < bestd) { + a = p[2] - r; + if (a < 0) + a = -a; + dist += a; + if (dist < bestd) { + bestd = dist; + best = p[3]; + } + } + } + } + if (j >= 0) { + p = network[j]; + dist = g - p[1]; /* inx key - reverse dif */ + if (dist >= bestd) + j = -1; /* stop iter */ + else { + j--; + if (dist < 0) + dist = -dist; + a = p[0] - b; + if (a < 0) + a = -a; + dist += a; + if (dist < bestd) { + a = p[2] - r; + if (a < 0) + a = -a; + dist += a; + if (dist < bestd) { + bestd = dist; + best = p[3]; + } + } + } + } + } + return (best); + } + + public byte[] process() { + learn(); + unbiasnet(); + inxbuild(); + return colorMap(); + } + + /* + * Unbias network to give byte values 0..255 and record position i to prepare + * for sort + * ----------------------------------------------------------------------------------- + */ + public void unbiasnet() { + for (int i = 0; i < netsize; i++) { + network[i][0] >>= netbiasshift; + network[i][1] >>= netbiasshift; + network[i][2] >>= netbiasshift; + network[i][3] = i; /* record colour no */ + } + } + + /* + * Move adjacent neurons by precomputed alpha*(1-((i-j)^2/[r]^2)) in + * radpower[|i-j|] + * --------------------------------------------------------------------------------- + */ + protected void alterneigh(int rad, int i, int b, int g, int r) { + + int j, k, lo, hi, a, m; + int[] p; + + lo = i - rad; + if (lo < -1) + lo = -1; + hi = i + rad; + if (hi > netsize) + hi = netsize; + + j = i + 1; + k = i - 1; + m = 1; + while ((j < hi) || (k > lo)) { + a = radpower[m++]; + if (j < hi) { + p = network[j++]; + try { + p[0] -= (a * (p[0] - b)) / alpharadbias; + p[1] -= (a * (p[1] - g)) / alpharadbias; + p[2] -= (a * (p[2] - r)) / alpharadbias; + } catch (Exception e) { + } // prevents 1.3 miscompilation + } + if (k > lo) { + p = network[k--]; + try { + p[0] -= (a * (p[0] - b)) / alpharadbias; + p[1] -= (a * (p[1] - g)) / alpharadbias; + p[2] -= (a * (p[2] - r)) / alpharadbias; + } catch (Exception e) { + } + } + } + } + + /* + * Move neuron i towards biased (b,g,r) by factor alpha + * ---------------------------------------------------- + */ + protected void altersingle(int alpha, int i, int b, int g, int r) { + + /* alter hit neuron */ + int[] n = network[i]; + n[0] -= (alpha * (n[0] - b)) / initalpha; + n[1] -= (alpha * (n[1] - g)) / initalpha; + n[2] -= (alpha * (n[2] - r)) / initalpha; + } + + /* + * Search for biased BGR values ---------------------------- + */ + protected int contest(int b, int g, int r) { + + /* finds closest neuron (min dist) and updates freq */ + /* finds best neuron (min dist-bias) and returns position */ + /* for frequently chosen neurons, freq[i] is high and bias[i] is negative */ + /* bias[i] = gamma*((1/netsize)-freq[i]) */ + + int i, dist, a, biasdist, betafreq; + int bestpos, bestbiaspos, bestd, bestbiasd; + int[] n; + + bestd = ~(((int) 1) << 31); + bestbiasd = bestd; + bestpos = -1; + bestbiaspos = bestpos; + + for (i = 0; i < netsize; i++) { + n = network[i]; + dist = n[0] - b; + if (dist < 0) + dist = -dist; + a = n[1] - g; + if (a < 0) + a = -a; + dist += a; + a = n[2] - r; + if (a < 0) + a = -a; + dist += a; + if (dist < bestd) { + bestd = dist; + bestpos = i; + } + biasdist = dist - ((bias[i]) >> (intbiasshift - netbiasshift)); + if (biasdist < bestbiasd) { + bestbiasd = biasdist; + bestbiaspos = i; + } + betafreq = (freq[i] >> betashift); + freq[i] -= betafreq; + bias[i] += (betafreq << gammashift); + } + freq[bestpos] += beta; + bias[bestpos] -= betagamma; + return (bestbiaspos); + } +} diff --git a/len-activiti/src/main/java/com/len/util/AssigneeType.java b/len-activiti/src/main/java/com/len/util/AssigneeType.java index 4c25070..349c938 100644 --- a/len-activiti/src/main/java/com/len/util/AssigneeType.java +++ b/len-activiti/src/main/java/com/len/util/AssigneeType.java @@ -4,11 +4,11 @@ package com.len.util; * @author zhuxiaomeng * @date 2018/1/24. * @email lenospmiller@gmail.com - * + *

* 工作流节点绑定类型 */ public class AssigneeType { - public static final int USER_TYPE=1; - public static final int USER_S_TYPE=2; - public static final int GROUP_TYPE=3; + public static final int USER_TYPE = 1; + public static final int USER_S_TYPE = 2; + public static final int GROUP_TYPE = 3; } diff --git a/len-activiti/src/main/java/com/len/util/Base64Utils.java b/len-activiti/src/main/java/com/len/util/Base64Utils.java index 0787b47..dfd5f4b 100644 --- a/len-activiti/src/main/java/com/len/util/Base64Utils.java +++ b/len-activiti/src/main/java/com/len/util/Base64Utils.java @@ -1,11 +1,8 @@ package com.len.util; import org.apache.log4j.Logger; -import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; -import java.io.FileInputStream; -import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; @@ -13,20 +10,20 @@ import java.io.InputStream; * Created by user on 2018/7/12. */ public class Base64Utils { - private static Logger logger = Logger.getLogger(Base64Utils.class); - private static BASE64Encoder encoder = new BASE64Encoder(); + private static Logger logger = Logger.getLogger(Base64Utils.class); + private static BASE64Encoder encoder = new BASE64Encoder(); - public static String ioToBase64(InputStream in) throws IOException { - String strBase64 = null; - try { - byte[] bytes = new byte[in.available()]; - // 将文件中的内容读入到数组中 - in.read(bytes); - strBase64 = encoder.encode(bytes); //将字节流数组转换为字符串 - in.close(); - } catch (IOException ioe) { - logger.error("图片转64编码异常",ioe); - } - return strBase64; - } + public static String ioToBase64(InputStream in) throws IOException { + String strBase64 = null; + try { + byte[] bytes = new byte[in.available()]; + // 将文件中的内容读入到数组中 + in.read(bytes); + strBase64 = encoder.encode(bytes); //将字节流数组转换为字符串 + in.close(); + } catch (IOException ioe) { + logger.error("图片转64编码异常", ioe); + } + return strBase64; + } } diff --git a/len-activiti/src/main/java/org/activiti/FilterServletOutputStream.java b/len-activiti/src/main/java/org/activiti/FilterServletOutputStream.java index a9227a5..d2f8c8f 100644 --- a/len-activiti/src/main/java/org/activiti/FilterServletOutputStream.java +++ b/len-activiti/src/main/java/org/activiti/FilterServletOutputStream.java @@ -1,37 +1,37 @@ package org.activiti; +import javax.servlet.ServletOutputStream; +import javax.servlet.WriteListener; import java.io.DataOutputStream; import java.io.IOException; import java.io.OutputStream; -import javax.servlet.ServletOutputStream; -import javax.servlet.WriteListener; public class FilterServletOutputStream extends ServletOutputStream { - private DataOutputStream stream; - private WriteListener writeListener; + private DataOutputStream stream; + private WriteListener writeListener; - public FilterServletOutputStream(OutputStream output) { - stream = new DataOutputStream(output); - } + public FilterServletOutputStream(OutputStream output) { + stream = new DataOutputStream(output); + } - public void write(int b) throws IOException { - stream.write(b); - } + public void write(int b) throws IOException { + stream.write(b); + } - public void write(byte[] b) throws IOException { - stream.write(b); - } + public void write(byte[] b) throws IOException { + stream.write(b); + } - public void write(byte[] b, int off, int len) throws IOException { - stream.write(b, off, len); - } + public void write(byte[] b, int off, int len) throws IOException { + stream.write(b, off, len); + } - public void setWriteListener(WriteListener writeListener) { - this.writeListener = writeListener; - } + public void setWriteListener(WriteListener writeListener) { + this.writeListener = writeListener; + } - public boolean isReady() { - return true; - } -} \ No newline at end of file + public boolean isReady() { + return true; + } +} diff --git a/len-activiti/src/main/java/org/activiti/GenericResponseWrapper.java b/len-activiti/src/main/java/org/activiti/GenericResponseWrapper.java index 99133b8..2c54b15 100644 --- a/len-activiti/src/main/java/org/activiti/GenericResponseWrapper.java +++ b/len-activiti/src/main/java/org/activiti/GenericResponseWrapper.java @@ -1,48 +1,48 @@ package org.activiti; -import java.io.ByteArrayOutputStream; -import java.io.PrintWriter; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponseWrapper; +import java.io.ByteArrayOutputStream; +import java.io.PrintWriter; public class GenericResponseWrapper extends HttpServletResponseWrapper { - private ByteArrayOutputStream output; - private int contentLength; - private String contentType; - - public GenericResponseWrapper(HttpServletResponse response) { - super(response); - output = new ByteArrayOutputStream(); - } - - public byte[] getData() { - return output.toByteArray(); - } - - public ServletOutputStream getOutputStream() { - return new FilterServletOutputStream(output); - } - - public PrintWriter getWriter() { - return new PrintWriter(getOutputStream(), true); - } - - public void setContentLength(int length) { - this.contentLength = length; - super.setContentLength(length); - } - - public int getContentLength() { - return contentLength; - } - - public void setContentType(String type) { - this.contentType = type; - super.setContentType(type); - } - - public String getContentType() { - return contentType; - } -} + private ByteArrayOutputStream output; + private int contentLength; + private String contentType; + + public GenericResponseWrapper(HttpServletResponse response) { + super(response); + output = new ByteArrayOutputStream(); + } + + public byte[] getData() { + return output.toByteArray(); + } + + public ServletOutputStream getOutputStream() { + return new FilterServletOutputStream(output); + } + + public PrintWriter getWriter() { + return new PrintWriter(getOutputStream(), true); + } + + public int getContentLength() { + return contentLength; + } + + public void setContentLength(int length) { + this.contentLength = length; + super.setContentLength(length); + } + + public String getContentType() { + return contentType; + } + + public void setContentType(String type) { + this.contentType = type; + super.setContentType(type); + } +} diff --git a/len-activiti/src/main/java/org/activiti/JsonpCallbackFilter.java b/len-activiti/src/main/java/org/activiti/JsonpCallbackFilter.java index cff0c49..1e6d01c 100644 --- a/len-activiti/src/main/java/org/activiti/JsonpCallbackFilter.java +++ b/len-activiti/src/main/java/org/activiti/JsonpCallbackFilter.java @@ -1,65 +1,58 @@ package org.activiti; +import lombok.extern.slf4j.Slf4j; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.Map; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.annotation.WebFilter; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import lombok.extern.slf4j.Slf4j; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; @WebFilter("/service/*") @Slf4j public class JsonpCallbackFilter implements Filter { - public void init(FilterConfig fConfig) throws ServletException { - } + public void init(FilterConfig fConfig) throws ServletException { + } - public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { - HttpServletRequest httpRequest = (HttpServletRequest) request; - HttpServletResponse httpResponse = (HttpServletResponse) response; + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { + HttpServletRequest httpRequest = (HttpServletRequest) request; + HttpServletResponse httpResponse = (HttpServletResponse) response; - Map parms = httpRequest.getParameterMap(); + Map parms = httpRequest.getParameterMap(); - if (parms.containsKey("callback")) { - if (log.isDebugEnabled()) - log.debug("Wrapping response with JSONP callback '" + parms.get("callback")[0] + "'"); + if (parms.containsKey("callback")) { + if (log.isDebugEnabled()) + log.debug("Wrapping response with JSONP callback '" + parms.get("callback")[0] + "'"); - OutputStream out = httpResponse.getOutputStream(); + OutputStream out = httpResponse.getOutputStream(); - GenericResponseWrapper wrapper = new GenericResponseWrapper(httpResponse); + GenericResponseWrapper wrapper = new GenericResponseWrapper(httpResponse); - chain.doFilter(request, wrapper); + chain.doFilter(request, wrapper); - //handles the content-size truncation - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - outputStream.write(new String(parms.get("callback")[0] + "(").getBytes()); - outputStream.write(wrapper.getData()); - outputStream.write(new String(");").getBytes()); - byte jsonpResponse[] = outputStream.toByteArray(); + //handles the content-size truncation + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + outputStream.write(new String(parms.get("callback")[0] + "(").getBytes()); + outputStream.write(wrapper.getData()); + outputStream.write(new String(");").getBytes()); + byte jsonpResponse[] = outputStream.toByteArray(); - wrapper.setContentType("text/javascript;charset=UTF-8"); - wrapper.setContentLength(jsonpResponse.length); + wrapper.setContentType("text/javascript;charset=UTF-8"); + wrapper.setContentLength(jsonpResponse.length); - out.write(jsonpResponse); + out.write(jsonpResponse); - out.close(); + out.close(); - } else { - chain.doFilter(request, response); - } - } + } else { + chain.doFilter(request, response); + } + } - public void destroy() { - } + public void destroy() { + } } diff --git a/len-activiti/src/main/java/org/activiti/image/HMProcessDiagramGenerator.java b/len-activiti/src/main/java/org/activiti/image/HMProcessDiagramGenerator.java index 72121b3..da9875e 100644 --- a/len-activiti/src/main/java/org/activiti/image/HMProcessDiagramGenerator.java +++ b/len-activiti/src/main/java/org/activiti/image/HMProcessDiagramGenerator.java @@ -1,9 +1,9 @@ /* Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -12,69 +12,71 @@ */ package org.activiti.image; +import org.activiti.bpmn.model.BpmnModel; + import java.awt.image.BufferedImage; import java.io.InputStream; import java.util.List; -import org.activiti.bpmn.model.BpmnModel; - /** * This interface declares methods to generate process diagram * * @author martin.grofcik * @author Tijs Rademakers */ -public interface HMProcessDiagramGenerator extends ProcessDiagramGenerator{ - - /** - * Generates a diagram of the given process definition, using the - * diagram interchange information of the process. - * @param bpmnModel bpmn model to get diagram for - * @param imageType type of the image to generate. - * @param highLightedActivities activities to highlight - * @param highLightedFlows flows to highlight - * @param activityFontName override the default activity font - * @param labelFontName override the default label font - * @param annotationFontName override the default annotation font - * @param customClassLoader provide a custom classloader for retrieving icon images - */ - public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, List highLightedActivities, List highLightedFlows, - String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader, double scaleFactor); - - - public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, List highLightedActivities, List highLightedFlows, - String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader, double scaleFactor,List currentHighlightdActivities); - - /** - * Generates a diagram of the given process definition, using the - * diagram interchange information of the process. - * @param bpmnModel bpmn model to get diagram for - * @param imageType type of the image to generate. - * @param highLightedActivities activities to highlight - * @param highLightedFlows flows to highlight - */ - public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, List highLightedActivities, List highLightedFlows); - - public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, List highLightedActivities, - List highLightedFlows, double scaleFactor); - - public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, List highLightedActivities); - - public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, List highLightedActivities, double scaleFactor); - - public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader); - - public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, String activityFontName, - String labelFontName, String annotationFontName, ClassLoader customClassLoader, double scaleFactor); - - public InputStream generatePngDiagram(BpmnModel bpmnModel); - - public InputStream generatePngDiagram(BpmnModel bpmnModel, double scaleFactor); - - public InputStream generateJpgDiagram(BpmnModel bpmnModel); - - public InputStream generateJpgDiagram(BpmnModel bpmnModel, double scaleFactor); - - public BufferedImage generatePngImage(BpmnModel bpmnModel, double scaleFactor); +public interface HMProcessDiagramGenerator extends ProcessDiagramGenerator { + + /** + * Generates a diagram of the given process definition, using the + * diagram interchange information of the process. + * + * @param bpmnModel bpmn model to get diagram for + * @param imageType type of the image to generate. + * @param highLightedActivities activities to highlight + * @param highLightedFlows flows to highlight + * @param activityFontName override the default activity font + * @param labelFontName override the default label font + * @param annotationFontName override the default annotation font + * @param customClassLoader provide a custom classloader for retrieving icon images + */ + public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, List highLightedActivities, List highLightedFlows, + String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader, double scaleFactor); + + + public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, List highLightedActivities, List highLightedFlows, + String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader, double scaleFactor, List currentHighlightdActivities); + + /** + * Generates a diagram of the given process definition, using the + * diagram interchange information of the process. + * + * @param bpmnModel bpmn model to get diagram for + * @param imageType type of the image to generate. + * @param highLightedActivities activities to highlight + * @param highLightedFlows flows to highlight + */ + public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, List highLightedActivities, List highLightedFlows); + + public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, List highLightedActivities, + List highLightedFlows, double scaleFactor); + + public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, List highLightedActivities); + + public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, List highLightedActivities, double scaleFactor); + + public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader); + + public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, String activityFontName, + String labelFontName, String annotationFontName, ClassLoader customClassLoader, double scaleFactor); + + public InputStream generatePngDiagram(BpmnModel bpmnModel); + + public InputStream generatePngDiagram(BpmnModel bpmnModel, double scaleFactor); + + public InputStream generateJpgDiagram(BpmnModel bpmnModel); + + public InputStream generateJpgDiagram(BpmnModel bpmnModel, double scaleFactor); + + public BufferedImage generatePngImage(BpmnModel bpmnModel, double scaleFactor); } diff --git a/len-activiti/src/main/java/org/activiti/image/impl/DefaultProcessDiagramCanvas.java b/len-activiti/src/main/java/org/activiti/image/impl/DefaultProcessDiagramCanvas.java index a97f60e..c2a2c80 100644 --- a/len-activiti/src/main/java/org/activiti/image/impl/DefaultProcessDiagramCanvas.java +++ b/len-activiti/src/main/java/org/activiti/image/impl/DefaultProcessDiagramCanvas.java @@ -13,29 +13,20 @@ package org.activiti.image.impl; -import java.awt.BasicStroke; -import java.awt.Color; -import java.awt.Font; -import java.awt.FontMetrics; -import java.awt.Graphics2D; -import java.awt.Paint; -import java.awt.Point; -import java.awt.Polygon; -import java.awt.Rectangle; -import java.awt.RenderingHints; -import java.awt.Shape; -import java.awt.Stroke; +import org.activiti.bpmn.model.AssociationDirection; +import org.activiti.bpmn.model.GraphicInfo; +import org.activiti.image.exception.ActivitiImageException; +import org.activiti.image.util.ReflectUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.imageio.ImageIO; +import java.awt.*; import java.awt.font.FontRenderContext; import java.awt.font.LineBreakMeasurer; import java.awt.font.TextAttribute; import java.awt.font.TextLayout; -import java.awt.geom.AffineTransform; -import java.awt.geom.Ellipse2D; -import java.awt.geom.Line2D; -import java.awt.geom.Path2D; -import java.awt.geom.PathIterator; -import java.awt.geom.Rectangle2D; -import java.awt.geom.RoundRectangle2D; +import java.awt.geom.*; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -46,1306 +37,1288 @@ import java.text.AttributedString; import java.util.ArrayList; import java.util.List; -import javax.imageio.ImageIO; - -import org.activiti.bpmn.model.AssociationDirection; -import org.activiti.bpmn.model.GraphicInfo; -import org.activiti.image.exception.ActivitiImageException; -import org.activiti.image.util.ReflectUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - /** * Represents a canvas on which BPMN 2.0 constructs can be drawn. - * + *

* Some of the icons used are licensed under a Creative Commons Attribution 2.5 * License, see http://www.famfamfam.com/lab/icons/silk/ * - * @see org.activiti.engine.impl.bpmn.diagram.DefaultProcessDiagramGenerator * @author Joram Barrez + * @see org.activiti.engine.impl.bpmn.diagram.DefaultProcessDiagramGenerator */ public class DefaultProcessDiagramCanvas { - protected static final Logger LOGGER = LoggerFactory.getLogger(DefaultProcessDiagramCanvas.class); - public enum SHAPE_TYPE {Rectangle, Rhombus, Ellipse} - - // Predefined sized - protected static final int ARROW_WIDTH = 5; - protected static final int CONDITIONAL_INDICATOR_WIDTH = 16; - protected static final int DEFAULT_INDICATOR_WIDTH = 10; - protected static final int MARKER_WIDTH = 12; - protected static final int FONT_SIZE = 11; - protected static final int FONT_SPACING = 2; - protected static final int TEXT_PADDING = 3; - protected static final int ANNOTATION_TEXT_PADDING = 7; - protected static final int LINE_HEIGHT = FONT_SIZE + FONT_SPACING; - - - // Colors - protected static Color TASK_BOX_COLOR = new Color(249, 249, 249); - protected static Color SUBPROCESS_BOX_COLOR = new Color(255, 255, 255); - protected static Color EVENT_COLOR = new Color(255, 255, 255); - protected static Color CONNECTION_COLOR = new Color(88, 88, 88); - protected static Color CONDITIONAL_INDICATOR_COLOR = new Color(255, 255, 255); - protected static Color HIGHLIGHT_COLOR = Color.GREEN; - protected static Color LABEL_COLOR = new Color(112, 146, 190); - protected static Color TASK_BORDER_COLOR = new Color(187, 187, 187); - protected static Color EVENT_BORDER_COLOR = new Color(88, 88, 88); - protected static Color SUBPROCESS_BORDER_COLOR = new Color(0, 0, 0); - - // Fonts - protected static Font LABEL_FONT = null; - protected static Font ANNOTATION_FONT = null; - - // Strokes - protected static Stroke THICK_TASK_BORDER_STROKE = new BasicStroke(3.0f); - protected static Stroke GATEWAY_TYPE_STROKE = new BasicStroke(3.0f); - protected static Stroke END_EVENT_STROKE = new BasicStroke(3.0f); - protected static Stroke MULTI_INSTANCE_STROKE = new BasicStroke(1.3f); - protected static Stroke EVENT_SUBPROCESS_STROKE = new BasicStroke(1.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 1.0f, new float[] { 1.0f }, 0.0f); - protected static Stroke NON_INTERRUPTING_EVENT_STROKE = new BasicStroke(1.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 1.0f, new float[] { 4.0f, 3.0f }, 0.0f); - protected static Stroke HIGHLIGHT_FLOW_STROKE = new BasicStroke(1.3f); - protected static Stroke ANNOTATION_STROKE = new BasicStroke(2.0f); - protected static Stroke ASSOCIATION_STROKE = new BasicStroke(2.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 1.0f, new float[] { 2.0f, 2.0f }, 0.0f); - - // icons - protected static int ICON_PADDING = 5; - protected static BufferedImage USERTASK_IMAGE; - protected static BufferedImage SCRIPTTASK_IMAGE; - protected static BufferedImage SERVICETASK_IMAGE; - protected static BufferedImage RECEIVETASK_IMAGE; - protected static BufferedImage SENDTASK_IMAGE; - protected static BufferedImage MANUALTASK_IMAGE; - protected static BufferedImage BUSINESS_RULE_TASK_IMAGE; - protected static BufferedImage SHELL_TASK_IMAGE; - protected static BufferedImage MULE_TASK_IMAGE; - protected static BufferedImage CAMEL_TASK_IMAGE; - - protected static BufferedImage TIMER_IMAGE; - protected static BufferedImage COMPENSATE_THROW_IMAGE; - protected static BufferedImage COMPENSATE_CATCH_IMAGE; - protected static BufferedImage ERROR_THROW_IMAGE; - protected static BufferedImage ERROR_CATCH_IMAGE; - protected static BufferedImage MESSAGE_THROW_IMAGE; - protected static BufferedImage MESSAGE_CATCH_IMAGE; - protected static BufferedImage SIGNAL_CATCH_IMAGE; - protected static BufferedImage SIGNAL_THROW_IMAGE; - - protected int canvasWidth = -1; - protected int canvasHeight = -1; - protected int minX = -1; - protected int minY = -1; - protected BufferedImage processDiagram; - protected Graphics2D g; - protected FontMetrics fontMetrics; - protected boolean closed; - protected ClassLoader customClassLoader; - protected String activityFontName = "Arial"; - protected String labelFontName = "Arial"; - protected String annotationFontName = "Arial"; - - /** - * Creates an empty canvas with given width and height. - * - * Allows to specify minimal boundaries on the left and upper side of the - * canvas. This is useful for diagrams that have white space there. - * Everything beneath these minimum values will be cropped. - * It's also possible to pass a specific font name and a class loader for the icon images. - * - */ - public DefaultProcessDiagramCanvas(int width, int height, int minX, int minY, String imageType, - String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader) { - - this.canvasWidth = width; - this.canvasHeight = height; - this.minX = minX; - this.minY = minY; - if (activityFontName != null) { - this.activityFontName = activityFontName; - } - if (labelFontName != null) { - this.labelFontName = labelFontName; - } - if (annotationFontName != null) { - this.annotationFontName = annotationFontName; - } - this.customClassLoader = customClassLoader; - - initialize(imageType); - } - - /** - * Creates an empty canvas with given width and height. - * - * Allows to specify minimal boundaries on the left and upper side of the - * canvas. This is useful for diagrams that have white space there (eg - * Signavio). Everything beneath these minimum values will be cropped. - * - * @param minX - * Hint that will be used when generating the image. Parts that fall - * below minX on the horizontal scale will be cropped. - * @param minY - * Hint that will be used when generating the image. Parts that fall - * below minX on the horizontal scale will be cropped. - */ - public DefaultProcessDiagramCanvas(int width, int height, int minX, int minY, String imageType) { - this.canvasWidth = width; - this.canvasHeight = height; - this.minX = minX; - this.minY = minY; - - initialize(imageType); - } - - public void initialize(String imageType) { - if ("png".equalsIgnoreCase(imageType)) { - this.processDiagram = new BufferedImage(canvasWidth, canvasHeight, BufferedImage.TYPE_INT_ARGB); - } else { - this.processDiagram = new BufferedImage(canvasWidth, canvasHeight, BufferedImage.TYPE_INT_RGB); - } - - this.g = processDiagram.createGraphics(); - if ("png".equalsIgnoreCase(imageType) == false) { - this.g.setBackground(new Color(255, 255, 255, 0)); - this.g.clearRect(0, 0, canvasWidth, canvasHeight); - } - - g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - g.setPaint(Color.black); - - Font font = new Font(activityFontName, Font.BOLD, FONT_SIZE); - g.setFont(font); - this.fontMetrics = g.getFontMetrics(); - - LABEL_FONT = new Font(labelFontName, Font.BOLD, 14); - ANNOTATION_FONT = new Font(annotationFontName, Font.PLAIN, FONT_SIZE); - - try { - USERTASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/userTask.png", customClassLoader)); - SCRIPTTASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/scriptTask.png", customClassLoader)); - SERVICETASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/serviceTask.png", customClassLoader)); - RECEIVETASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/receiveTask.png", customClassLoader)); - SENDTASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/sendTask.png", customClassLoader)); - MANUALTASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/manualTask.png", customClassLoader)); - BUSINESS_RULE_TASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/businessRuleTask.png", customClassLoader)); - SHELL_TASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/shellTask.png", customClassLoader)); - CAMEL_TASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/camelTask.png", customClassLoader)); - MULE_TASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/muleTask.png", customClassLoader)); - - TIMER_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/timer.png", customClassLoader)); - COMPENSATE_THROW_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/compensate-throw.png", customClassLoader)); - COMPENSATE_CATCH_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/compensate.png", customClassLoader)); - ERROR_THROW_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/error-throw.png", customClassLoader)); - ERROR_CATCH_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/error.png", customClassLoader)); - MESSAGE_THROW_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/message-throw.png", customClassLoader)); - MESSAGE_CATCH_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/message.png", customClassLoader)); - SIGNAL_THROW_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/signal-throw.png", customClassLoader)); - SIGNAL_CATCH_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/signal.png", customClassLoader)); - } catch (IOException e) { - LOGGER.warn("Could not load image for process diagram creation: {}", e.getMessage()); - } - } - - /** - * Generates an image of what currently is drawn on the canvas. - * - * Throws an {@link ActivitiException} when {@link #close()} is already - * called. - */ - public InputStream generateImage(String imageType) { - if (closed) { - throw new ActivitiImageException("ProcessDiagramGenerator already closed"); - } - - ByteArrayOutputStream out = new ByteArrayOutputStream(); - try { - ImageIO.write(processDiagram, imageType, out); - - } catch (IOException e) { - throw new ActivitiImageException("Error while generating process image", e); - } finally { - try { - if (out != null) { - out.close(); - } - } catch(IOException ignore) { - // Exception is silently ignored - } - } - return new ByteArrayInputStream(out.toByteArray()); - } - - /** - * Generates an image of what currently is drawn on the canvas. - * - * Throws an {@link ActivitiException} when {@link #close()} is already - * called. - */ - public BufferedImage generateBufferedImage(String imageType) { - if (closed) { - throw new ActivitiImageException("ProcessDiagramGenerator already closed"); - } - - // Try to remove white space - minX = (minX <= 5) ? 5 : minX; - minY = (minY <= 5) ? 5 : minY; - BufferedImage imageToSerialize = processDiagram; - if (minX >= 0 && minY >= 0) { - imageToSerialize = processDiagram.getSubimage(minX - 5, minY - 5, canvasWidth - minX + 5, canvasHeight - minY + 5); - } - return imageToSerialize; - } - - /** - * Closes the canvas which dissallows further drawing and releases graphical - * resources. - */ - public void close() { - g.dispose(); - closed = true; - } - - public void drawNoneStartEvent(GraphicInfo graphicInfo) { - drawStartEvent(graphicInfo, null, 1.0); - } - - public void drawTimerStartEvent(GraphicInfo graphicInfo, double scaleFactor) { - drawStartEvent(graphicInfo, TIMER_IMAGE, scaleFactor); - } - - public void drawSignalStartEvent(GraphicInfo graphicInfo, double scaleFactor) { - drawStartEvent(graphicInfo, SIGNAL_CATCH_IMAGE, scaleFactor); - } - - public void drawMessageStartEvent(GraphicInfo graphicInfo, double scaleFactor) { - drawStartEvent(graphicInfo, MESSAGE_CATCH_IMAGE, scaleFactor); - } - - public void drawStartEvent(GraphicInfo graphicInfo, BufferedImage image, double scaleFactor) { - Paint originalPaint = g.getPaint(); - g.setPaint(EVENT_COLOR); + protected static final Logger LOGGER = LoggerFactory.getLogger(DefaultProcessDiagramCanvas.class); + // Predefined sized + protected static final int ARROW_WIDTH = 5; + protected static final int CONDITIONAL_INDICATOR_WIDTH = 16; + protected static final int DEFAULT_INDICATOR_WIDTH = 10; + protected static final int MARKER_WIDTH = 12; + protected static final int FONT_SIZE = 11; + protected static final int FONT_SPACING = 2; + protected static final int TEXT_PADDING = 3; + protected static final int ANNOTATION_TEXT_PADDING = 7; + protected static final int LINE_HEIGHT = FONT_SIZE + FONT_SPACING; + // Colors + protected static Color TASK_BOX_COLOR = new Color(249, 249, 249); + protected static Color SUBPROCESS_BOX_COLOR = new Color(255, 255, 255); + protected static Color EVENT_COLOR = new Color(255, 255, 255); + protected static Color CONNECTION_COLOR = new Color(88, 88, 88); + protected static Color CONDITIONAL_INDICATOR_COLOR = new Color(255, 255, 255); + protected static Color HIGHLIGHT_COLOR = Color.GREEN; + protected static Color LABEL_COLOR = new Color(112, 146, 190); + protected static Color TASK_BORDER_COLOR = new Color(187, 187, 187); + protected static Color EVENT_BORDER_COLOR = new Color(88, 88, 88); + protected static Color SUBPROCESS_BORDER_COLOR = new Color(0, 0, 0); + // Fonts + protected static Font LABEL_FONT = null; + protected static Font ANNOTATION_FONT = null; + // Strokes + protected static Stroke THICK_TASK_BORDER_STROKE = new BasicStroke(3.0f); + protected static Stroke GATEWAY_TYPE_STROKE = new BasicStroke(3.0f); + protected static Stroke END_EVENT_STROKE = new BasicStroke(3.0f); + protected static Stroke MULTI_INSTANCE_STROKE = new BasicStroke(1.3f); + protected static Stroke EVENT_SUBPROCESS_STROKE = new BasicStroke(1.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 1.0f, new float[]{1.0f}, 0.0f); + protected static Stroke NON_INTERRUPTING_EVENT_STROKE = new BasicStroke(1.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 1.0f, new float[]{4.0f, 3.0f}, 0.0f); + protected static Stroke HIGHLIGHT_FLOW_STROKE = new BasicStroke(1.3f); + protected static Stroke ANNOTATION_STROKE = new BasicStroke(2.0f); + protected static Stroke ASSOCIATION_STROKE = new BasicStroke(2.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 1.0f, new float[]{2.0f, 2.0f}, 0.0f); + // icons + protected static int ICON_PADDING = 5; + protected static BufferedImage USERTASK_IMAGE; + protected static BufferedImage SCRIPTTASK_IMAGE; + protected static BufferedImage SERVICETASK_IMAGE; + protected static BufferedImage RECEIVETASK_IMAGE; + protected static BufferedImage SENDTASK_IMAGE; + protected static BufferedImage MANUALTASK_IMAGE; + protected static BufferedImage BUSINESS_RULE_TASK_IMAGE; + protected static BufferedImage SHELL_TASK_IMAGE; + protected static BufferedImage MULE_TASK_IMAGE; + protected static BufferedImage CAMEL_TASK_IMAGE; + protected static BufferedImage TIMER_IMAGE; + protected static BufferedImage COMPENSATE_THROW_IMAGE; + protected static BufferedImage COMPENSATE_CATCH_IMAGE; + protected static BufferedImage ERROR_THROW_IMAGE; + protected static BufferedImage ERROR_CATCH_IMAGE; + protected static BufferedImage MESSAGE_THROW_IMAGE; + protected static BufferedImage MESSAGE_CATCH_IMAGE; + protected static BufferedImage SIGNAL_CATCH_IMAGE; + protected static BufferedImage SIGNAL_THROW_IMAGE; + protected int canvasWidth = -1; + protected int canvasHeight = -1; + protected int minX = -1; + protected int minY = -1; + protected BufferedImage processDiagram; + protected Graphics2D g; + protected FontMetrics fontMetrics; + protected boolean closed; + protected ClassLoader customClassLoader; + protected String activityFontName = "Arial"; + protected String labelFontName = "Arial"; + protected String annotationFontName = "Arial"; + + /** + * Creates an empty canvas with given width and height. + *

+ * Allows to specify minimal boundaries on the left and upper side of the + * canvas. This is useful for diagrams that have white space there. + * Everything beneath these minimum values will be cropped. + * It's also possible to pass a specific font name and a class loader for the icon images. + */ + public DefaultProcessDiagramCanvas(int width, int height, int minX, int minY, String imageType, + String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader) { + + this.canvasWidth = width; + this.canvasHeight = height; + this.minX = minX; + this.minY = minY; + if (activityFontName != null) { + this.activityFontName = activityFontName; + } + if (labelFontName != null) { + this.labelFontName = labelFontName; + } + if (annotationFontName != null) { + this.annotationFontName = annotationFontName; + } + this.customClassLoader = customClassLoader; + + initialize(imageType); + } + + /** + * Creates an empty canvas with given width and height. + *

+ * Allows to specify minimal boundaries on the left and upper side of the + * canvas. This is useful for diagrams that have white space there (eg + * Signavio). Everything beneath these minimum values will be cropped. + * + * @param minX Hint that will be used when generating the image. Parts that fall + * below minX on the horizontal scale will be cropped. + * @param minY Hint that will be used when generating the image. Parts that fall + * below minX on the horizontal scale will be cropped. + */ + public DefaultProcessDiagramCanvas(int width, int height, int minX, int minY, String imageType) { + this.canvasWidth = width; + this.canvasHeight = height; + this.minX = minX; + this.minY = minY; + + initialize(imageType); + } + + /** + * This method creates shape by type and coordinates. + * + * @param shapeType + * @param graphicInfo + * @return Shape + */ + private static Shape createShape(SHAPE_TYPE shapeType, GraphicInfo graphicInfo) { + if (SHAPE_TYPE.Rectangle.equals(shapeType)) { + // source is rectangle + return new Rectangle2D.Double(graphicInfo.getX(), graphicInfo.getY(), graphicInfo.getWidth(), graphicInfo.getHeight()); + } else if (SHAPE_TYPE.Rhombus.equals(shapeType)) { + // source is rhombus + Path2D.Double rhombus = new Path2D.Double(); + rhombus.moveTo(graphicInfo.getX(), graphicInfo.getY() + graphicInfo.getHeight() / 2); + rhombus.lineTo(graphicInfo.getX() + graphicInfo.getWidth() / 2, graphicInfo.getY() + graphicInfo.getHeight()); + rhombus.lineTo(graphicInfo.getX() + graphicInfo.getWidth(), graphicInfo.getY() + graphicInfo.getHeight() / 2); + rhombus.lineTo(graphicInfo.getX() + graphicInfo.getWidth() / 2, graphicInfo.getY()); + rhombus.lineTo(graphicInfo.getX(), graphicInfo.getY() + graphicInfo.getHeight() / 2); + rhombus.closePath(); + return rhombus; + } else if (SHAPE_TYPE.Ellipse.equals(shapeType)) { + // source is ellipse + return new Ellipse2D.Double(graphicInfo.getX(), graphicInfo.getY(), graphicInfo.getWidth(), graphicInfo.getHeight()); + } else { + // unknown source element, just do not correct coordinates + } + return null; + } + + /** + * This method returns intersection point of shape border and line. + * + * @param shape + * @param line + * @return Point + */ + private static Point getIntersection(Shape shape, Line2D.Double line) { + if (shape instanceof Ellipse2D) { + return getEllipseIntersection(shape, line); + } else if (shape instanceof Rectangle2D || shape instanceof Path2D) { + return getShapeIntersection(shape, line); + } else { + // something strange + return null; + } + } + + /** + * This method calculates ellipse intersection with line + * + * @param shape Bounds of this shape used to calculate parameters of inscribed into this bounds ellipse. + * @param line + * @return Intersection point + */ + private static Point getEllipseIntersection(Shape shape, Line2D.Double line) { + double angle = Math.atan2(line.y2 - line.y1, line.x2 - line.x1); + double x = shape.getBounds2D().getWidth() / 2 * Math.cos(angle) + shape.getBounds2D().getCenterX(); + double y = shape.getBounds2D().getHeight() / 2 * Math.sin(angle) + shape.getBounds2D().getCenterY(); + Point p = new Point(); + p.setLocation(x, y); + return p; + } + + /** + * This method calculates shape intersection with line. + * + * @param shape + * @param line + * @return Intersection point + */ + private static Point getShapeIntersection(Shape shape, Line2D.Double line) { + PathIterator it = shape.getPathIterator(null); + double[] coords = new double[6]; + double[] pos = new double[2]; + Line2D.Double l = new Line2D.Double(); + while (!it.isDone()) { + int type = it.currentSegment(coords); + switch (type) { + case PathIterator.SEG_MOVETO: + pos[0] = coords[0]; + pos[1] = coords[1]; + break; + case PathIterator.SEG_LINETO: + l = new Line2D.Double(pos[0], pos[1], coords[0], coords[1]); + if (line.intersectsLine(l)) { + return getLinesIntersection(line, l); + } + pos[0] = coords[0]; + pos[1] = coords[1]; + break; + case PathIterator.SEG_CLOSE: + break; + default: + // whatever + } + it.next(); + } + return null; + } + + /** + * This method calculates intersections of two lines. + * + * @param a Line 1 + * @param b Line 2 + * @return Intersection point + */ + private static Point getLinesIntersection(Line2D a, Line2D b) { + double d = (a.getX1() - a.getX2()) * (b.getY2() - b.getY1()) - (a.getY1() - a.getY2()) * (b.getX2() - b.getX1()); + double da = (a.getX1() - b.getX1()) * (b.getY2() - b.getY1()) - (a.getY1() - b.getY1()) * (b.getX2() - b.getX1()); + // double db = (a.getX1()-a.getX2())*(a.getY1()-b.getY1()) - (a.getY1()-a.getY2())*(a.getX1()-b.getX1()); + double ta = da / d; + // double tb = db/d; + Point p = new Point(); + p.setLocation(a.getX1() + ta * (a.getX2() - a.getX1()), a.getY1() + ta * (a.getY2() - a.getY1())); + return p; + } + + public void initialize(String imageType) { + if ("png".equalsIgnoreCase(imageType)) { + this.processDiagram = new BufferedImage(canvasWidth, canvasHeight, BufferedImage.TYPE_INT_ARGB); + } else { + this.processDiagram = new BufferedImage(canvasWidth, canvasHeight, BufferedImage.TYPE_INT_RGB); + } + + this.g = processDiagram.createGraphics(); + if ("png".equalsIgnoreCase(imageType) == false) { + this.g.setBackground(new Color(255, 255, 255, 0)); + this.g.clearRect(0, 0, canvasWidth, canvasHeight); + } + + g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g.setPaint(Color.black); + + Font font = new Font(activityFontName, Font.BOLD, FONT_SIZE); + g.setFont(font); + this.fontMetrics = g.getFontMetrics(); + + LABEL_FONT = new Font(labelFontName, Font.BOLD, 14); + ANNOTATION_FONT = new Font(annotationFontName, Font.PLAIN, FONT_SIZE); + + try { + USERTASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/userTask.png", customClassLoader)); + SCRIPTTASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/scriptTask.png", customClassLoader)); + SERVICETASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/serviceTask.png", customClassLoader)); + RECEIVETASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/receiveTask.png", customClassLoader)); + SENDTASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/sendTask.png", customClassLoader)); + MANUALTASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/manualTask.png", customClassLoader)); + BUSINESS_RULE_TASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/businessRuleTask.png", customClassLoader)); + SHELL_TASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/shellTask.png", customClassLoader)); + CAMEL_TASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/camelTask.png", customClassLoader)); + MULE_TASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/muleTask.png", customClassLoader)); + + TIMER_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/timer.png", customClassLoader)); + COMPENSATE_THROW_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/compensate-throw.png", customClassLoader)); + COMPENSATE_CATCH_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/compensate.png", customClassLoader)); + ERROR_THROW_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/error-throw.png", customClassLoader)); + ERROR_CATCH_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/error.png", customClassLoader)); + MESSAGE_THROW_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/message-throw.png", customClassLoader)); + MESSAGE_CATCH_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/message.png", customClassLoader)); + SIGNAL_THROW_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/signal-throw.png", customClassLoader)); + SIGNAL_CATCH_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/signal.png", customClassLoader)); + } catch (IOException e) { + LOGGER.warn("Could not load image for process diagram creation: {}", e.getMessage()); + } + } + + /** + * Generates an image of what currently is drawn on the canvas. + *

+ * Throws an {@link ActivitiException} when {@link #close()} is already + * called. + */ + public InputStream generateImage(String imageType) { + if (closed) { + throw new ActivitiImageException("ProcessDiagramGenerator already closed"); + } + + ByteArrayOutputStream out = new ByteArrayOutputStream(); + try { + ImageIO.write(processDiagram, imageType, out); + + } catch (IOException e) { + throw new ActivitiImageException("Error while generating process image", e); + } finally { + try { + if (out != null) { + out.close(); + } + } catch (IOException ignore) { + // Exception is silently ignored + } + } + return new ByteArrayInputStream(out.toByteArray()); + } + + /** + * Generates an image of what currently is drawn on the canvas. + *

+ * Throws an {@link ActivitiException} when {@link #close()} is already + * called. + */ + public BufferedImage generateBufferedImage(String imageType) { + if (closed) { + throw new ActivitiImageException("ProcessDiagramGenerator already closed"); + } + + // Try to remove white space + minX = (minX <= 5) ? 5 : minX; + minY = (minY <= 5) ? 5 : minY; + BufferedImage imageToSerialize = processDiagram; + if (minX >= 0 && minY >= 0) { + imageToSerialize = processDiagram.getSubimage(minX - 5, minY - 5, canvasWidth - minX + 5, canvasHeight - minY + 5); + } + return imageToSerialize; + } + + /** + * Closes the canvas which dissallows further drawing and releases graphical + * resources. + */ + public void close() { + g.dispose(); + closed = true; + } + + public void drawNoneStartEvent(GraphicInfo graphicInfo) { + drawStartEvent(graphicInfo, null, 1.0); + } + + public void drawTimerStartEvent(GraphicInfo graphicInfo, double scaleFactor) { + drawStartEvent(graphicInfo, TIMER_IMAGE, scaleFactor); + } + + public void drawSignalStartEvent(GraphicInfo graphicInfo, double scaleFactor) { + drawStartEvent(graphicInfo, SIGNAL_CATCH_IMAGE, scaleFactor); + } + + public void drawMessageStartEvent(GraphicInfo graphicInfo, double scaleFactor) { + drawStartEvent(graphicInfo, MESSAGE_CATCH_IMAGE, scaleFactor); + } + + public void drawStartEvent(GraphicInfo graphicInfo, BufferedImage image, double scaleFactor) { + Paint originalPaint = g.getPaint(); + g.setPaint(EVENT_COLOR); // g.setPaint(new Color(36,202,88)); - Ellipse2D circle = new Ellipse2D.Double(graphicInfo.getX(), graphicInfo.getY(), - graphicInfo.getWidth(), graphicInfo.getHeight()); - g.fill(circle); - g.setPaint(EVENT_BORDER_COLOR); - g.draw(circle); - g.setPaint(originalPaint); - if (image != null) { - // calculate coordinates to center image - int imageX = (int) Math.round(graphicInfo.getX() + (graphicInfo.getWidth() / 2) - (image.getWidth() / 2 * scaleFactor)); - int imageY = (int) Math.round(graphicInfo.getY() + (graphicInfo.getHeight() / 2) - (image.getHeight() / 2 * scaleFactor)); - g.drawImage(image, imageX, imageY, - (int) (image.getWidth() / scaleFactor), (int) (image.getHeight() / scaleFactor), null); - } - - } - - public void drawNoneEndEvent(GraphicInfo graphicInfo, double scaleFactor) { - Paint originalPaint = g.getPaint(); - Stroke originalStroke = g.getStroke(); - g.setPaint(new Color(255,255,255)); - Ellipse2D circle = new Ellipse2D.Double(graphicInfo.getX(), graphicInfo.getY(), - graphicInfo.getWidth(), graphicInfo.getHeight()); - g.fill(circle); - g.setPaint(EVENT_BORDER_COLOR); - if (scaleFactor == 1.0) { - g.setStroke(END_EVENT_STROKE); - } else { - g.setStroke(new BasicStroke(2.0f)); - } - g.draw(circle); - g.setStroke(originalStroke); - g.setPaint(originalPaint); - } - - public void drawErrorEndEvent(String name, GraphicInfo graphicInfo, double scaleFactor) { - drawErrorEndEvent(graphicInfo, scaleFactor); - if (scaleFactor == 1.0) { - drawLabel(name, graphicInfo); - } - } - - public void drawErrorEndEvent(GraphicInfo graphicInfo, double scaleFactor) { - drawNoneEndEvent(graphicInfo, scaleFactor); - g.drawImage(ERROR_THROW_IMAGE, (int) (graphicInfo.getX() + (graphicInfo.getWidth() / 4)), - (int) (graphicInfo.getY() + (graphicInfo.getHeight() / 4)), - (int) (ERROR_THROW_IMAGE.getWidth() / scaleFactor), - (int) (ERROR_THROW_IMAGE.getHeight() / scaleFactor), null); - } - - public void drawErrorStartEvent(GraphicInfo graphicInfo, double scaleFactor) { - drawNoneStartEvent(graphicInfo); - g.drawImage(ERROR_CATCH_IMAGE, (int) (graphicInfo.getX() + (graphicInfo.getWidth() / 4)), - (int) (graphicInfo.getY() + (graphicInfo.getHeight() / 4)), - (int) (ERROR_CATCH_IMAGE.getWidth() / scaleFactor), - (int) (ERROR_CATCH_IMAGE.getHeight() / scaleFactor), null); - } - - public void drawCatchingEvent(GraphicInfo graphicInfo, boolean isInterrupting, - BufferedImage image, String eventType, double scaleFactor) { - - // event circles - Ellipse2D outerCircle = new Ellipse2D.Double(graphicInfo.getX(), graphicInfo.getY(), - graphicInfo.getWidth(), graphicInfo.getHeight()); - int innerCircleSize = (int) (4 / scaleFactor); - if (innerCircleSize == 0) { - innerCircleSize = 1; - } - int innerCircleX = (int) graphicInfo.getX() + innerCircleSize; - int innerCircleY = (int) graphicInfo.getY() + innerCircleSize; - int innerCircleWidth = (int) graphicInfo.getWidth() - (2 * innerCircleSize); - int innerCircleHeight = (int) graphicInfo.getHeight() - (2 * innerCircleSize); - Ellipse2D innerCircle = new Ellipse2D.Double(innerCircleX, innerCircleY, innerCircleWidth, innerCircleHeight); - - Paint originalPaint = g.getPaint(); - Stroke originalStroke = g.getStroke(); - g.setPaint(EVENT_COLOR); - g.fill(outerCircle); - - g.setPaint(EVENT_BORDER_COLOR); - if (isInterrupting == false) - g.setStroke(NON_INTERRUPTING_EVENT_STROKE); - g.draw(outerCircle); - g.setStroke(originalStroke); - g.setPaint(originalPaint); - g.draw(innerCircle); - - if (image != null) { - // calculate coordinates to center image - int imageX = (int) (graphicInfo.getX() + (graphicInfo.getWidth() / 2) - (image.getWidth() / 2 * scaleFactor)); - int imageY = (int) (graphicInfo.getY() + (graphicInfo.getHeight() / 2) - (image.getHeight() / 2 * scaleFactor)); - if (scaleFactor == 1.0 && "timer".equals(eventType)) { - // move image one pixel to center timer image - imageX++; - imageY++; - } - g.drawImage(image, imageX, imageY, (int) (image.getWidth() / scaleFactor), - (int) (image.getHeight() / scaleFactor), null); - } - } - - public void drawCatchingCompensateEvent(String name, GraphicInfo graphicInfo, boolean isInterrupting, double scaleFactor) { - drawCatchingCompensateEvent(graphicInfo, isInterrupting, scaleFactor); - drawLabel(name, graphicInfo); - } - - public void drawCatchingCompensateEvent(GraphicInfo graphicInfo, boolean isInterrupting, double scaleFactor) { - drawCatchingEvent(graphicInfo, isInterrupting, COMPENSATE_CATCH_IMAGE, "compensate", scaleFactor); - } - - public void drawCatchingTimerEvent(String name, GraphicInfo graphicInfo, boolean isInterrupting, double scaleFactor) { - drawCatchingTimerEvent(graphicInfo, isInterrupting, scaleFactor); - drawLabel(name, graphicInfo); - } - - public void drawCatchingTimerEvent(GraphicInfo graphicInfo, boolean isInterrupting, double scaleFactor) { - drawCatchingEvent(graphicInfo, isInterrupting, TIMER_IMAGE, "timer", scaleFactor); - } - - public void drawCatchingErrorEvent(String name, GraphicInfo graphicInfo, boolean isInterrupting, double scaleFactor) { - drawCatchingErrorEvent(graphicInfo, isInterrupting, scaleFactor); - drawLabel(name, graphicInfo); - } - - public void drawCatchingErrorEvent(GraphicInfo graphicInfo, boolean isInterrupting, double scaleFactor) { - drawCatchingEvent(graphicInfo, isInterrupting, ERROR_CATCH_IMAGE, "error", scaleFactor); - } - - public void drawCatchingSignalEvent(String name, GraphicInfo graphicInfo, boolean isInterrupting, double scaleFactor) { - drawCatchingSignalEvent(graphicInfo, isInterrupting, scaleFactor); - drawLabel(name, graphicInfo); - } - - public void drawCatchingSignalEvent(GraphicInfo graphicInfo, boolean isInterrupting, double scaleFactor) { - drawCatchingEvent(graphicInfo, isInterrupting, SIGNAL_CATCH_IMAGE, "signal", scaleFactor); - } - - public void drawCatchingMessageEvent(GraphicInfo graphicInfo, boolean isInterrupting, double scaleFactor) { - drawCatchingEvent(graphicInfo, isInterrupting, MESSAGE_CATCH_IMAGE, "message", scaleFactor); - } - - public void drawCatchingMessageEvent(String name, GraphicInfo graphicInfo, boolean isInterrupting, double scaleFactor) { - drawCatchingEvent(graphicInfo, isInterrupting, MESSAGE_CATCH_IMAGE, "message", scaleFactor); - drawLabel(name, graphicInfo); - } - - public void drawThrowingCompensateEvent(GraphicInfo graphicInfo, double scaleFactor) { - drawCatchingEvent(graphicInfo, true, COMPENSATE_THROW_IMAGE, "compensate", scaleFactor); - } - - public void drawThrowingSignalEvent(GraphicInfo graphicInfo, double scaleFactor) { - drawCatchingEvent(graphicInfo, true, SIGNAL_THROW_IMAGE, "signal", scaleFactor); - } - - public void drawThrowingNoneEvent(GraphicInfo graphicInfo, double scaleFactor) { - drawCatchingEvent(graphicInfo, true, null, "none", scaleFactor); - } - - public void drawSequenceflow(int srcX, int srcY, int targetX, int targetY, boolean conditional, double scaleFactor) { - drawSequenceflow(srcX, srcY, targetX, targetY, conditional, false, scaleFactor); - } - - public void drawSequenceflow(int srcX, int srcY, int targetX, int targetY, boolean conditional, boolean highLighted, double scaleFactor) { - Paint originalPaint = g.getPaint(); - if (highLighted) - g.setPaint(HIGHLIGHT_COLOR); - - Line2D.Double line = new Line2D.Double(srcX, srcY, targetX, targetY); - g.draw(line); - drawArrowHead(line, scaleFactor); - - if (conditional) { - drawConditionalSequenceFlowIndicator(line, scaleFactor); - } - - if (highLighted) - g.setPaint(originalPaint); - } - - public void drawAssociation(int[] xPoints, int[] yPoints, AssociationDirection associationDirection, boolean highLighted, double scaleFactor) { - boolean conditional = false, isDefault = false; - drawConnection(xPoints, yPoints, conditional, isDefault, "association", associationDirection, highLighted, scaleFactor); - } - - public void drawSequenceflow(int[] xPoints, int[] yPoints, boolean conditional, boolean isDefault, boolean highLighted, double scaleFactor) { - drawConnection(xPoints, yPoints, conditional, isDefault, "sequenceFlow", AssociationDirection.ONE, highLighted, scaleFactor); - } - - public void drawConnection(int[] xPoints, int[] yPoints, boolean conditional, boolean isDefault, String connectionType, - AssociationDirection associationDirection, boolean highLighted, double scaleFactor) { - - Paint originalPaint = g.getPaint(); - Stroke originalStroke = g.getStroke(); - - g.setPaint(CONNECTION_COLOR); - if (connectionType.equals("association")) { - g.setStroke(ASSOCIATION_STROKE); - } else if (highLighted) { - g.setPaint(HIGHLIGHT_COLOR); - g.setStroke(HIGHLIGHT_FLOW_STROKE); - } - - for (int i=1; i 1.0) return; - int horizontal = (int) (CONDITIONAL_INDICATOR_WIDTH * 0.7); - int halfOfHorizontal = horizontal / 2; - int halfOfVertical = CONDITIONAL_INDICATOR_WIDTH / 2; - - Polygon conditionalIndicator = new Polygon(); - conditionalIndicator.addPoint(0, 0); - conditionalIndicator.addPoint(-halfOfHorizontal, halfOfVertical); - conditionalIndicator.addPoint(0, CONDITIONAL_INDICATOR_WIDTH); - conditionalIndicator.addPoint(halfOfHorizontal, halfOfVertical); - - AffineTransform transformation = new AffineTransform(); - transformation.setToIdentity(); - double angle = Math.atan2(line.y2 - line.y1, line.x2 - line.x1); - transformation.translate(line.x1, line.y1); - transformation.rotate((angle - Math.PI / 2d)); - - AffineTransform originalTransformation = g.getTransform(); - g.setTransform(transformation); - g.draw(conditionalIndicator); - - Paint originalPaint = g.getPaint(); - g.setPaint(CONDITIONAL_INDICATOR_COLOR); - g.fill(conditionalIndicator); - - g.setPaint(originalPaint); - g.setTransform(originalTransformation); - } - - public void drawTask(BufferedImage icon, String name, GraphicInfo graphicInfo, double scaleFactor) { - drawTask(name, graphicInfo); - g.drawImage(icon, (int) (graphicInfo.getX() + ICON_PADDING / scaleFactor), - (int) (graphicInfo.getY() + ICON_PADDING / scaleFactor), - (int) (icon.getWidth() / scaleFactor), (int) (icon.getHeight() / scaleFactor), null); - } - - public void drawTask(String name, GraphicInfo graphicInfo) { - drawTask(name, graphicInfo, false); - } - - public void drawPoolOrLane(String name, GraphicInfo graphicInfo) { - int x = (int) graphicInfo.getX(); - int y = (int) graphicInfo.getY(); - int width = (int) graphicInfo.getWidth(); - int height = (int) graphicInfo.getHeight(); - g.drawRect(x, y, width, height); - - // Add the name as text, vertical - if(name != null && name.length() > 0) { - // Include some padding - int availableTextSpace = height - 6; - - // Create rotation for derived font - AffineTransform transformation = new AffineTransform(); - transformation.setToIdentity(); - transformation.rotate(270 * Math.PI/180); - - Font currentFont = g.getFont(); - Font theDerivedFont = currentFont.deriveFont(transformation); - g.setFont(theDerivedFont); - - String truncated = fitTextToWidth(name, availableTextSpace); - int realWidth = fontMetrics.stringWidth(truncated); - - g.drawString(truncated, x + 2 + fontMetrics.getHeight(), 3 + y + availableTextSpace - (availableTextSpace - realWidth) / 2); - g.setFont(currentFont); - } - } - - protected void drawTask(String name, GraphicInfo graphicInfo, boolean thickBorder) { - Paint originalPaint = g.getPaint(); - int x = (int) graphicInfo.getX(); - int y = (int) graphicInfo.getY(); - int width = (int) graphicInfo.getWidth(); - int height = (int) graphicInfo.getHeight(); - - // Create a new gradient paint for every task box, gradient depends on x and y and is not relative + Ellipse2D circle = new Ellipse2D.Double(graphicInfo.getX(), graphicInfo.getY(), + graphicInfo.getWidth(), graphicInfo.getHeight()); + g.fill(circle); + g.setPaint(EVENT_BORDER_COLOR); + g.draw(circle); + g.setPaint(originalPaint); + if (image != null) { + // calculate coordinates to center image + int imageX = (int) Math.round(graphicInfo.getX() + (graphicInfo.getWidth() / 2) - (image.getWidth() / 2 * scaleFactor)); + int imageY = (int) Math.round(graphicInfo.getY() + (graphicInfo.getHeight() / 2) - (image.getHeight() / 2 * scaleFactor)); + g.drawImage(image, imageX, imageY, + (int) (image.getWidth() / scaleFactor), (int) (image.getHeight() / scaleFactor), null); + } + + } + + public void drawNoneEndEvent(GraphicInfo graphicInfo, double scaleFactor) { + Paint originalPaint = g.getPaint(); + Stroke originalStroke = g.getStroke(); + g.setPaint(new Color(255, 255, 255)); + Ellipse2D circle = new Ellipse2D.Double(graphicInfo.getX(), graphicInfo.getY(), + graphicInfo.getWidth(), graphicInfo.getHeight()); + g.fill(circle); + g.setPaint(EVENT_BORDER_COLOR); + if (scaleFactor == 1.0) { + g.setStroke(END_EVENT_STROKE); + } else { + g.setStroke(new BasicStroke(2.0f)); + } + g.draw(circle); + g.setStroke(originalStroke); + g.setPaint(originalPaint); + } + + public void drawErrorEndEvent(String name, GraphicInfo graphicInfo, double scaleFactor) { + drawErrorEndEvent(graphicInfo, scaleFactor); + if (scaleFactor == 1.0) { + drawLabel(name, graphicInfo); + } + } + + public void drawErrorEndEvent(GraphicInfo graphicInfo, double scaleFactor) { + drawNoneEndEvent(graphicInfo, scaleFactor); + g.drawImage(ERROR_THROW_IMAGE, (int) (graphicInfo.getX() + (graphicInfo.getWidth() / 4)), + (int) (graphicInfo.getY() + (graphicInfo.getHeight() / 4)), + (int) (ERROR_THROW_IMAGE.getWidth() / scaleFactor), + (int) (ERROR_THROW_IMAGE.getHeight() / scaleFactor), null); + } + + public void drawErrorStartEvent(GraphicInfo graphicInfo, double scaleFactor) { + drawNoneStartEvent(graphicInfo); + g.drawImage(ERROR_CATCH_IMAGE, (int) (graphicInfo.getX() + (graphicInfo.getWidth() / 4)), + (int) (graphicInfo.getY() + (graphicInfo.getHeight() / 4)), + (int) (ERROR_CATCH_IMAGE.getWidth() / scaleFactor), + (int) (ERROR_CATCH_IMAGE.getHeight() / scaleFactor), null); + } + + public void drawCatchingEvent(GraphicInfo graphicInfo, boolean isInterrupting, + BufferedImage image, String eventType, double scaleFactor) { + + // event circles + Ellipse2D outerCircle = new Ellipse2D.Double(graphicInfo.getX(), graphicInfo.getY(), + graphicInfo.getWidth(), graphicInfo.getHeight()); + int innerCircleSize = (int) (4 / scaleFactor); + if (innerCircleSize == 0) { + innerCircleSize = 1; + } + int innerCircleX = (int) graphicInfo.getX() + innerCircleSize; + int innerCircleY = (int) graphicInfo.getY() + innerCircleSize; + int innerCircleWidth = (int) graphicInfo.getWidth() - (2 * innerCircleSize); + int innerCircleHeight = (int) graphicInfo.getHeight() - (2 * innerCircleSize); + Ellipse2D innerCircle = new Ellipse2D.Double(innerCircleX, innerCircleY, innerCircleWidth, innerCircleHeight); + + Paint originalPaint = g.getPaint(); + Stroke originalStroke = g.getStroke(); + g.setPaint(EVENT_COLOR); + g.fill(outerCircle); + + g.setPaint(EVENT_BORDER_COLOR); + if (isInterrupting == false) + g.setStroke(NON_INTERRUPTING_EVENT_STROKE); + g.draw(outerCircle); + g.setStroke(originalStroke); + g.setPaint(originalPaint); + g.draw(innerCircle); + + if (image != null) { + // calculate coordinates to center image + int imageX = (int) (graphicInfo.getX() + (graphicInfo.getWidth() / 2) - (image.getWidth() / 2 * scaleFactor)); + int imageY = (int) (graphicInfo.getY() + (graphicInfo.getHeight() / 2) - (image.getHeight() / 2 * scaleFactor)); + if (scaleFactor == 1.0 && "timer".equals(eventType)) { + // move image one pixel to center timer image + imageX++; + imageY++; + } + g.drawImage(image, imageX, imageY, (int) (image.getWidth() / scaleFactor), + (int) (image.getHeight() / scaleFactor), null); + } + } + + public void drawCatchingCompensateEvent(String name, GraphicInfo graphicInfo, boolean isInterrupting, double scaleFactor) { + drawCatchingCompensateEvent(graphicInfo, isInterrupting, scaleFactor); + drawLabel(name, graphicInfo); + } + + public void drawCatchingCompensateEvent(GraphicInfo graphicInfo, boolean isInterrupting, double scaleFactor) { + drawCatchingEvent(graphicInfo, isInterrupting, COMPENSATE_CATCH_IMAGE, "compensate", scaleFactor); + } + + public void drawCatchingTimerEvent(String name, GraphicInfo graphicInfo, boolean isInterrupting, double scaleFactor) { + drawCatchingTimerEvent(graphicInfo, isInterrupting, scaleFactor); + drawLabel(name, graphicInfo); + } + + public void drawCatchingTimerEvent(GraphicInfo graphicInfo, boolean isInterrupting, double scaleFactor) { + drawCatchingEvent(graphicInfo, isInterrupting, TIMER_IMAGE, "timer", scaleFactor); + } + + public void drawCatchingErrorEvent(String name, GraphicInfo graphicInfo, boolean isInterrupting, double scaleFactor) { + drawCatchingErrorEvent(graphicInfo, isInterrupting, scaleFactor); + drawLabel(name, graphicInfo); + } + + public void drawCatchingErrorEvent(GraphicInfo graphicInfo, boolean isInterrupting, double scaleFactor) { + drawCatchingEvent(graphicInfo, isInterrupting, ERROR_CATCH_IMAGE, "error", scaleFactor); + } + + public void drawCatchingSignalEvent(String name, GraphicInfo graphicInfo, boolean isInterrupting, double scaleFactor) { + drawCatchingSignalEvent(graphicInfo, isInterrupting, scaleFactor); + drawLabel(name, graphicInfo); + } + + public void drawCatchingSignalEvent(GraphicInfo graphicInfo, boolean isInterrupting, double scaleFactor) { + drawCatchingEvent(graphicInfo, isInterrupting, SIGNAL_CATCH_IMAGE, "signal", scaleFactor); + } + + public void drawCatchingMessageEvent(GraphicInfo graphicInfo, boolean isInterrupting, double scaleFactor) { + drawCatchingEvent(graphicInfo, isInterrupting, MESSAGE_CATCH_IMAGE, "message", scaleFactor); + } + + public void drawCatchingMessageEvent(String name, GraphicInfo graphicInfo, boolean isInterrupting, double scaleFactor) { + drawCatchingEvent(graphicInfo, isInterrupting, MESSAGE_CATCH_IMAGE, "message", scaleFactor); + drawLabel(name, graphicInfo); + } + + public void drawThrowingCompensateEvent(GraphicInfo graphicInfo, double scaleFactor) { + drawCatchingEvent(graphicInfo, true, COMPENSATE_THROW_IMAGE, "compensate", scaleFactor); + } + + public void drawThrowingSignalEvent(GraphicInfo graphicInfo, double scaleFactor) { + drawCatchingEvent(graphicInfo, true, SIGNAL_THROW_IMAGE, "signal", scaleFactor); + } + + public void drawThrowingNoneEvent(GraphicInfo graphicInfo, double scaleFactor) { + drawCatchingEvent(graphicInfo, true, null, "none", scaleFactor); + } + + public void drawSequenceflow(int srcX, int srcY, int targetX, int targetY, boolean conditional, double scaleFactor) { + drawSequenceflow(srcX, srcY, targetX, targetY, conditional, false, scaleFactor); + } + + public void drawSequenceflow(int srcX, int srcY, int targetX, int targetY, boolean conditional, boolean highLighted, double scaleFactor) { + Paint originalPaint = g.getPaint(); + if (highLighted) + g.setPaint(HIGHLIGHT_COLOR); + + Line2D.Double line = new Line2D.Double(srcX, srcY, targetX, targetY); + g.draw(line); + drawArrowHead(line, scaleFactor); + + if (conditional) { + drawConditionalSequenceFlowIndicator(line, scaleFactor); + } + + if (highLighted) + g.setPaint(originalPaint); + } + + public void drawAssociation(int[] xPoints, int[] yPoints, AssociationDirection associationDirection, boolean highLighted, double scaleFactor) { + boolean conditional = false, isDefault = false; + drawConnection(xPoints, yPoints, conditional, isDefault, "association", associationDirection, highLighted, scaleFactor); + } + + public void drawSequenceflow(int[] xPoints, int[] yPoints, boolean conditional, boolean isDefault, boolean highLighted, double scaleFactor) { + drawConnection(xPoints, yPoints, conditional, isDefault, "sequenceFlow", AssociationDirection.ONE, highLighted, scaleFactor); + } + + public void drawConnection(int[] xPoints, int[] yPoints, boolean conditional, boolean isDefault, String connectionType, + AssociationDirection associationDirection, boolean highLighted, double scaleFactor) { + + Paint originalPaint = g.getPaint(); + Stroke originalStroke = g.getStroke(); + + g.setPaint(CONNECTION_COLOR); + if (connectionType.equals("association")) { + g.setStroke(ASSOCIATION_STROKE); + } else if (highLighted) { + g.setPaint(HIGHLIGHT_COLOR); + g.setStroke(HIGHLIGHT_FLOW_STROKE); + } + + for (int i = 1; i < xPoints.length; i++) { + Integer sourceX = xPoints[i - 1]; + Integer sourceY = yPoints[i - 1]; + Integer targetX = xPoints[i]; + Integer targetY = yPoints[i]; + Line2D.Double line = new Line2D.Double(sourceX, sourceY, targetX, targetY); + g.draw(line); + } + + if (isDefault) { + Line2D.Double line = new Line2D.Double(xPoints[0], yPoints[0], xPoints[1], yPoints[1]); + drawDefaultSequenceFlowIndicator(line, scaleFactor); + } + + if (conditional) { + Line2D.Double line = new Line2D.Double(xPoints[0], yPoints[0], xPoints[1], yPoints[1]); + drawConditionalSequenceFlowIndicator(line, scaleFactor); + } + + if (associationDirection.equals(AssociationDirection.ONE) || associationDirection.equals(AssociationDirection.BOTH)) { + Line2D.Double line = new Line2D.Double(xPoints[xPoints.length - 2], yPoints[xPoints.length - 2], xPoints[xPoints.length - 1], yPoints[xPoints.length - 1]); + drawArrowHead(line, scaleFactor); + } + if (associationDirection.equals(AssociationDirection.BOTH)) { + Line2D.Double line = new Line2D.Double(xPoints[1], yPoints[1], xPoints[0], yPoints[0]); + drawArrowHead(line, scaleFactor); + } + g.setPaint(originalPaint); + g.setStroke(originalStroke); + } + + public void drawSequenceflowWithoutArrow(int srcX, int srcY, int targetX, int targetY, boolean conditional, double scaleFactor) { + drawSequenceflowWithoutArrow(srcX, srcY, targetX, targetY, conditional, false, scaleFactor); + } + + public void drawSequenceflowWithoutArrow(int srcX, int srcY, int targetX, int targetY, boolean conditional, boolean highLighted, double scaleFactor) { + Paint originalPaint = g.getPaint(); + if (highLighted) + g.setPaint(HIGHLIGHT_COLOR); + + Line2D.Double line = new Line2D.Double(srcX, srcY, targetX, targetY); + g.draw(line); + + if (conditional) { + drawConditionalSequenceFlowIndicator(line, scaleFactor); + } + + if (highLighted) + g.setPaint(originalPaint); + } + + public void drawArrowHead(Line2D.Double line, double scaleFactor) { + int doubleArrowWidth = (int) (2 * ARROW_WIDTH / scaleFactor); + if (doubleArrowWidth == 0) { + doubleArrowWidth = 2; + } + Polygon arrowHead = new Polygon(); + arrowHead.addPoint(0, 0); + int arrowHeadPoint = (int) (-ARROW_WIDTH / scaleFactor); + if (arrowHeadPoint == 0) { + arrowHeadPoint = -1; + } + arrowHead.addPoint(arrowHeadPoint, -doubleArrowWidth); + arrowHeadPoint = (int) (ARROW_WIDTH / scaleFactor); + if (arrowHeadPoint == 0) { + arrowHeadPoint = 1; + } + arrowHead.addPoint(arrowHeadPoint, -doubleArrowWidth); + + AffineTransform transformation = new AffineTransform(); + transformation.setToIdentity(); + double angle = Math.atan2(line.y2 - line.y1, line.x2 - line.x1); + transformation.translate(line.x2, line.y2); + transformation.rotate((angle - Math.PI / 2d)); + + AffineTransform originalTransformation = g.getTransform(); + g.setTransform(transformation); + g.fill(arrowHead); + g.setTransform(originalTransformation); + } + + public void drawDefaultSequenceFlowIndicator(Line2D.Double line, double scaleFactor) { + double length = DEFAULT_INDICATOR_WIDTH / scaleFactor, halfOfLength = length / 2, f = 8; + Line2D.Double defaultIndicator = new Line2D.Double(-halfOfLength, 0, halfOfLength, 0); + + double angle = Math.atan2(line.y2 - line.y1, line.x2 - line.x1); + double dx = f * Math.cos(angle), dy = f * Math.sin(angle), + x1 = line.x1 + dx, y1 = line.y1 + dy; + + AffineTransform transformation = new AffineTransform(); + transformation.setToIdentity(); + transformation.translate(x1, y1); + transformation.rotate((angle - 3 * Math.PI / 4)); + + AffineTransform originalTransformation = g.getTransform(); + g.setTransform(transformation); + g.draw(defaultIndicator); + + g.setTransform(originalTransformation); + } + + public void drawConditionalSequenceFlowIndicator(Line2D.Double line, double scaleFactor) { + if (scaleFactor > 1.0) return; + int horizontal = (int) (CONDITIONAL_INDICATOR_WIDTH * 0.7); + int halfOfHorizontal = horizontal / 2; + int halfOfVertical = CONDITIONAL_INDICATOR_WIDTH / 2; + + Polygon conditionalIndicator = new Polygon(); + conditionalIndicator.addPoint(0, 0); + conditionalIndicator.addPoint(-halfOfHorizontal, halfOfVertical); + conditionalIndicator.addPoint(0, CONDITIONAL_INDICATOR_WIDTH); + conditionalIndicator.addPoint(halfOfHorizontal, halfOfVertical); + + AffineTransform transformation = new AffineTransform(); + transformation.setToIdentity(); + double angle = Math.atan2(line.y2 - line.y1, line.x2 - line.x1); + transformation.translate(line.x1, line.y1); + transformation.rotate((angle - Math.PI / 2d)); + + AffineTransform originalTransformation = g.getTransform(); + g.setTransform(transformation); + g.draw(conditionalIndicator); + + Paint originalPaint = g.getPaint(); + g.setPaint(CONDITIONAL_INDICATOR_COLOR); + g.fill(conditionalIndicator); + + g.setPaint(originalPaint); + g.setTransform(originalTransformation); + } + + public void drawTask(BufferedImage icon, String name, GraphicInfo graphicInfo, double scaleFactor) { + drawTask(name, graphicInfo); + g.drawImage(icon, (int) (graphicInfo.getX() + ICON_PADDING / scaleFactor), + (int) (graphicInfo.getY() + ICON_PADDING / scaleFactor), + (int) (icon.getWidth() / scaleFactor), (int) (icon.getHeight() / scaleFactor), null); + } + + public void drawTask(String name, GraphicInfo graphicInfo) { + drawTask(name, graphicInfo, false); + } + + public void drawPoolOrLane(String name, GraphicInfo graphicInfo) { + int x = (int) graphicInfo.getX(); + int y = (int) graphicInfo.getY(); + int width = (int) graphicInfo.getWidth(); + int height = (int) graphicInfo.getHeight(); + g.drawRect(x, y, width, height); + + // Add the name as text, vertical + if (name != null && name.length() > 0) { + // Include some padding + int availableTextSpace = height - 6; + + // Create rotation for derived font + AffineTransform transformation = new AffineTransform(); + transformation.setToIdentity(); + transformation.rotate(270 * Math.PI / 180); + + Font currentFont = g.getFont(); + Font theDerivedFont = currentFont.deriveFont(transformation); + g.setFont(theDerivedFont); + + String truncated = fitTextToWidth(name, availableTextSpace); + int realWidth = fontMetrics.stringWidth(truncated); + + g.drawString(truncated, x + 2 + fontMetrics.getHeight(), 3 + y + availableTextSpace - (availableTextSpace - realWidth) / 2); + g.setFont(currentFont); + } + } + + protected void drawTask(String name, GraphicInfo graphicInfo, boolean thickBorder) { + Paint originalPaint = g.getPaint(); + int x = (int) graphicInfo.getX(); + int y = (int) graphicInfo.getY(); + int width = (int) graphicInfo.getWidth(); + int height = (int) graphicInfo.getHeight(); + + // Create a new gradient paint for every task box, gradient depends on x and y and is not relative // g.setPaint(TASK_BOX_COLOR); - g.setPaint(new Color(144,238,144)); - int arcR = 6; - if (thickBorder) - arcR = 3; - - // shape - RoundRectangle2D rect = new RoundRectangle2D.Double(x, y, width, height, arcR, arcR); - g.fill(rect); - g.setPaint(TASK_BORDER_COLOR); - - if (thickBorder) { - Stroke originalStroke = g.getStroke(); - g.setStroke(THICK_TASK_BORDER_STROKE); - g.draw(rect); - g.setStroke(originalStroke); - } else { - g.draw(rect); - } - - g.setPaint(originalPaint); - // text - if (name != null && name.length() > 0) { - int boxWidth = width - (2 * TEXT_PADDING); - int boxHeight = height - 16 - ICON_PADDING - ICON_PADDING - MARKER_WIDTH - 2 - 2; - int boxX = x + width/2 - boxWidth/2; - int boxY = y + height/2 - boxHeight/2 + ICON_PADDING + ICON_PADDING - 2 - 2; - - drawMultilineCentredText(name, boxX, boxY, boxWidth, boxHeight); - } - } - - protected void drawMultilineCentredText(String text, int x, int y, int boxWidth, int boxHeight) { - drawMultilineText(text, x, y, boxWidth, boxHeight, true); - } - - protected void drawMultilineAnnotationText(String text, int x, int y, int boxWidth, int boxHeight) { - drawMultilineText(text, x, y, boxWidth, boxHeight, false); - } - - protected void drawMultilineText(String text, int x, int y, int boxWidth, int boxHeight, boolean centered) { - // Create an attributed string based in input text - AttributedString attributedString = new AttributedString(text); - attributedString.addAttribute(TextAttribute.FONT, g.getFont()); - attributedString.addAttribute(TextAttribute.FOREGROUND, Color.black); - - AttributedCharacterIterator characterIterator = attributedString.getIterator(); - - int currentHeight = 0; - // Prepare a list of lines of text we'll be drawing - List layouts = new ArrayList(); - String lastLine = null; - - LineBreakMeasurer measurer = new LineBreakMeasurer(characterIterator, g.getFontRenderContext()); - - TextLayout layout = null; - while (measurer.getPosition() < characterIterator.getEndIndex() && currentHeight <= boxHeight) { - - int previousPosition = measurer.getPosition(); - - // Request next layout - layout = measurer.nextLayout(boxWidth); - - int height = ((Float)(layout.getDescent() + layout.getAscent() + layout.getLeading())).intValue(); - - if(currentHeight + height > boxHeight) { - // The line we're about to add should NOT be added anymore, append three dots to previous one instead - // to indicate more text is truncated - if (!layouts.isEmpty()) { - layouts.remove(layouts.size() - 1); - - if(lastLine.length() >= 4) { - lastLine = lastLine.substring(0, lastLine.length() - 4) + "..."; - } - layouts.add(new TextLayout(lastLine, g.getFont(), g.getFontRenderContext())); - } - break; - } else { - layouts.add(layout); - lastLine = text.substring(previousPosition, measurer.getPosition()); - currentHeight += height; - } - } - - - int currentY = y + (centered ? ((boxHeight - currentHeight) /2) : 0); - int currentX = 0; - - // Actually draw the lines - for(TextLayout textLayout : layouts) { - - currentY += textLayout.getAscent(); - currentX = x + (centered ? ((boxWidth - ((Double)textLayout.getBounds().getWidth()).intValue()) /2) : 0); - - textLayout.draw(g, currentX, currentY); - currentY += textLayout.getDescent() + textLayout.getLeading(); - } - - } - - - protected String fitTextToWidth(String original, int width) { - String text = original; - - // remove length for "..." - int maxWidth = width - 10; - - while (fontMetrics.stringWidth(text + "...") > maxWidth && text.length() > 0) { - text = text.substring(0, text.length() - 1); - } - - if (!text.equals(original)) { - text = text + "..."; - } - - return text; - } - - public void drawUserTask(String name, GraphicInfo graphicInfo, double scaleFactor) { - drawTask(USERTASK_IMAGE, name, graphicInfo, scaleFactor); - } - - public void drawScriptTask(String name, GraphicInfo graphicInfo, double scaleFactor) { - drawTask(SCRIPTTASK_IMAGE, name, graphicInfo, scaleFactor); - } - - public void drawServiceTask(String name, GraphicInfo graphicInfo, double scaleFactor) { - drawTask(SERVICETASK_IMAGE, name, graphicInfo, scaleFactor); - } - - public void drawReceiveTask(String name, GraphicInfo graphicInfo, double scaleFactor) { - drawTask(RECEIVETASK_IMAGE, name, graphicInfo, scaleFactor); - } - - public void drawSendTask(String name, GraphicInfo graphicInfo, double scaleFactor) { - drawTask(SENDTASK_IMAGE, name, graphicInfo, scaleFactor); - } - - public void drawManualTask(String name, GraphicInfo graphicInfo, double scaleFactor) { - drawTask(MANUALTASK_IMAGE, name, graphicInfo, scaleFactor); - } - - public void drawBusinessRuleTask(String name, GraphicInfo graphicInfo, double scaleFactor) { - drawTask(BUSINESS_RULE_TASK_IMAGE, name, graphicInfo, scaleFactor); - } - - public void drawCamelTask(String name, GraphicInfo graphicInfo, double scaleFactor) { - drawTask(CAMEL_TASK_IMAGE, name, graphicInfo, scaleFactor); - } - - public void drawMuleTask(String name, GraphicInfo graphicInfo, double scaleFactor) { - drawTask(MULE_TASK_IMAGE, name, graphicInfo, scaleFactor); - } - - public void drawExpandedSubProcess(String name, GraphicInfo graphicInfo, Boolean isTriggeredByEvent, double scaleFactor) { - RoundRectangle2D rect = new RoundRectangle2D.Double(graphicInfo.getX(), graphicInfo.getY(), - graphicInfo.getWidth(), graphicInfo.getHeight(), 8, 8); - - // Use different stroke (dashed) - if (isTriggeredByEvent) { - Stroke originalStroke = g.getStroke(); - g.setStroke(EVENT_SUBPROCESS_STROKE); - g.draw(rect); - g.setStroke(originalStroke); - } else { - Paint originalPaint = g.getPaint(); - g.setPaint(SUBPROCESS_BOX_COLOR); - g.fill(rect); - g.setPaint(SUBPROCESS_BORDER_COLOR); - g.draw(rect); - g.setPaint(originalPaint); - } - - if (scaleFactor == 1.0 && name != null && !name.isEmpty()) { - String text = fitTextToWidth(name, (int) graphicInfo.getWidth()); - g.drawString(text, (int) graphicInfo.getX() + 10, (int) graphicInfo.getY() + 15); - } - } - - public void drawCollapsedSubProcess(String name, GraphicInfo graphicInfo, Boolean isTriggeredByEvent) { - drawCollapsedTask(name, graphicInfo, false); - } - - public void drawCollapsedCallActivity(String name, GraphicInfo graphicInfo) { - drawCollapsedTask(name, graphicInfo, true); - } - - protected void drawCollapsedTask(String name, GraphicInfo graphicInfo, boolean thickBorder) { - // The collapsed marker is now visualized separately - drawTask(name, graphicInfo, thickBorder); - } - - public void drawCollapsedMarker(int x, int y, int width, int height) { - // rectangle - int rectangleWidth = MARKER_WIDTH; - int rectangleHeight = MARKER_WIDTH; - Rectangle rect = new Rectangle(x + (width - rectangleWidth) / 2, y + height - rectangleHeight - 3, rectangleWidth, rectangleHeight); - g.draw(rect); - - // plus inside rectangle - Line2D.Double line = new Line2D.Double(rect.getCenterX(), rect.getY() + 2, rect.getCenterX(), rect.getMaxY() - 2); - g.draw(line); - line = new Line2D.Double(rect.getMinX() + 2, rect.getCenterY(), rect.getMaxX() - 2, rect.getCenterY()); - g.draw(line); - } - - public void drawActivityMarkers(int x, int y, int width, int height, boolean multiInstanceSequential, boolean multiInstanceParallel, boolean collapsed) { - if (collapsed) { - if (!multiInstanceSequential && !multiInstanceParallel) { - drawCollapsedMarker(x, y, width, height); - } else { - drawCollapsedMarker(x - MARKER_WIDTH / 2 - 2, y, width, height); - if (multiInstanceSequential) { - drawMultiInstanceMarker(true, x + MARKER_WIDTH / 2 + 2, y, width, height); - } else { - drawMultiInstanceMarker(false, x + MARKER_WIDTH / 2 + 2, y, width, height); - } - } - } else { - if (multiInstanceSequential) { - drawMultiInstanceMarker(true, x, y, width, height); - } else if (multiInstanceParallel) { - drawMultiInstanceMarker(false, x, y, width, height); - } - } - } - - public void drawGateway(GraphicInfo graphicInfo) { - Polygon rhombus = new Polygon(); - int x = (int) graphicInfo.getX(); - int y = (int) graphicInfo.getY(); - int width = (int) graphicInfo.getWidth(); - int height = (int) graphicInfo.getHeight(); - - rhombus.addPoint(x, y + (height / 2)); - rhombus.addPoint(x + (width / 2), y + height); - rhombus.addPoint(x + width, y + (height / 2)); - rhombus.addPoint(x + (width / 2), y); - g.draw(rhombus); - } - - public void drawParallelGateway(GraphicInfo graphicInfo, double scaleFactor) { - // rhombus - drawGateway(graphicInfo); - int x = (int) graphicInfo.getX(); - int y = (int) graphicInfo.getY(); - int width = (int) graphicInfo.getWidth(); - int height = (int) graphicInfo.getHeight(); - - if (scaleFactor == 1.0) { - // plus inside rhombus - Stroke orginalStroke = g.getStroke(); - g.setStroke(GATEWAY_TYPE_STROKE); - Line2D.Double line = new Line2D.Double(x + 10, y + height / 2, x + width - 10, y + height / 2); // horizontal - g.draw(line); - line = new Line2D.Double(x + width / 2, y + height - 10, x + width / 2, y + 10); // vertical - g.draw(line); - g.setStroke(orginalStroke); - } - } - - public void drawExclusiveGateway(GraphicInfo graphicInfo, double scaleFactor) { - // rhombus - drawGateway(graphicInfo); - int x = (int) graphicInfo.getX(); - int y = (int) graphicInfo.getY(); - int width = (int) graphicInfo.getWidth(); - int height = (int) graphicInfo.getHeight(); - - int quarterWidth = width / 4; - int quarterHeight = height / 4; - - if (scaleFactor == 1.0) { - // X inside rhombus - Stroke orginalStroke = g.getStroke(); - g.setStroke(GATEWAY_TYPE_STROKE); - Line2D.Double line = new Line2D.Double(x + quarterWidth + 3, y + quarterHeight + 3, x + 3 * quarterWidth - 3, y + 3 * quarterHeight - 3); - g.draw(line); - line = new Line2D.Double(x + quarterWidth + 3, y + 3 * quarterHeight - 3, x + 3 * quarterWidth - 3, y + quarterHeight + 3); - g.draw(line); - g.setStroke(orginalStroke); - } - } - - public void drawInclusiveGateway(GraphicInfo graphicInfo, double scaleFactor) { - // rhombus - drawGateway(graphicInfo); - int x = (int) graphicInfo.getX(); - int y = (int) graphicInfo.getY(); - int width = (int) graphicInfo.getWidth(); - int height = (int) graphicInfo.getHeight(); - - int diameter = width / 2; - - if (scaleFactor == 1.0) { - // circle inside rhombus - Stroke orginalStroke = g.getStroke(); - g.setStroke(GATEWAY_TYPE_STROKE); - Ellipse2D.Double circle = new Ellipse2D.Double(((width - diameter) / 2) + x, ((height - diameter) / 2) + y, diameter, diameter); - g.draw(circle); - g.setStroke(orginalStroke); - } - } - - public void drawEventBasedGateway(GraphicInfo graphicInfo, double scaleFactor) { - // rhombus - drawGateway(graphicInfo); - - if (scaleFactor == 1.0) { - int x = (int) graphicInfo.getX(); - int y = (int) graphicInfo.getY(); - int width = (int) graphicInfo.getWidth(); - int height = (int) graphicInfo.getHeight(); - - double scale = .6; - - GraphicInfo eventInfo = new GraphicInfo(); - eventInfo.setX(x + width*(1-scale)/2); - eventInfo.setY(y + height*(1-scale)/2); - eventInfo.setWidth(width*scale); - eventInfo.setHeight(height*scale); - drawCatchingEvent(eventInfo, true, null, "eventGateway", scaleFactor); - - double r = width / 6.; - - // create pentagon (coords with respect to center) - int topX = (int)(.95 * r); // top right corner - int topY = (int)(-.31 * r); - int bottomX = (int)(.59 * r); // bottom right corner - int bottomY = (int)(.81 * r); - - int[] xPoints = new int[]{ 0, topX, bottomX, -bottomX, -topX }; - int[] yPoints = new int[]{ -(int)r, topY, bottomY, bottomY, topY }; - Polygon pentagon = new Polygon(xPoints, yPoints, 5); - pentagon.translate(x+width/2, y+width/2); - - // draw - g.drawPolygon(pentagon); - } - } - - public void drawMultiInstanceMarker(boolean sequential, int x, int y, int width, int height) { - int rectangleWidth = MARKER_WIDTH; - int rectangleHeight = MARKER_WIDTH; - int lineX = x + (width - rectangleWidth) / 2; - int lineY = y + height - rectangleHeight - 3; - - Stroke orginalStroke = g.getStroke(); - g.setStroke(MULTI_INSTANCE_STROKE); - - if (sequential) { - g.draw(new Line2D.Double(lineX, lineY, lineX + rectangleWidth, lineY)); - g.draw(new Line2D.Double(lineX, lineY + rectangleHeight / 2, lineX + rectangleWidth, lineY + rectangleHeight / 2)); - g.draw(new Line2D.Double(lineX, lineY + rectangleHeight, lineX + rectangleWidth, lineY + rectangleHeight)); - } else { - g.draw(new Line2D.Double(lineX, lineY, lineX, lineY + rectangleHeight)); - g.draw(new Line2D.Double(lineX + rectangleWidth / 2, lineY, lineX + rectangleWidth / 2, lineY + rectangleHeight)); - g.draw(new Line2D.Double(lineX + rectangleWidth, lineY, lineX + rectangleWidth, lineY + rectangleHeight)); - } - - g.setStroke(orginalStroke); - } - - public void drawHighLight(int x, int y, int width, int height) { - Paint originalPaint = g.getPaint(); - Stroke originalStroke = g.getStroke(); - - g.setPaint(HIGHLIGHT_COLOR); + g.setPaint(new Color(144, 238, 144)); + int arcR = 6; + if (thickBorder) + arcR = 3; + + // shape + RoundRectangle2D rect = new RoundRectangle2D.Double(x, y, width, height, arcR, arcR); + g.fill(rect); + g.setPaint(TASK_BORDER_COLOR); + + if (thickBorder) { + Stroke originalStroke = g.getStroke(); + g.setStroke(THICK_TASK_BORDER_STROKE); + g.draw(rect); + g.setStroke(originalStroke); + } else { + g.draw(rect); + } + + g.setPaint(originalPaint); + // text + if (name != null && name.length() > 0) { + int boxWidth = width - (2 * TEXT_PADDING); + int boxHeight = height - 16 - ICON_PADDING - ICON_PADDING - MARKER_WIDTH - 2 - 2; + int boxX = x + width / 2 - boxWidth / 2; + int boxY = y + height / 2 - boxHeight / 2 + ICON_PADDING + ICON_PADDING - 2 - 2; + + drawMultilineCentredText(name, boxX, boxY, boxWidth, boxHeight); + } + } + + protected void drawMultilineCentredText(String text, int x, int y, int boxWidth, int boxHeight) { + drawMultilineText(text, x, y, boxWidth, boxHeight, true); + } + + protected void drawMultilineAnnotationText(String text, int x, int y, int boxWidth, int boxHeight) { + drawMultilineText(text, x, y, boxWidth, boxHeight, false); + } + + protected void drawMultilineText(String text, int x, int y, int boxWidth, int boxHeight, boolean centered) { + // Create an attributed string based in input text + AttributedString attributedString = new AttributedString(text); + attributedString.addAttribute(TextAttribute.FONT, g.getFont()); + attributedString.addAttribute(TextAttribute.FOREGROUND, Color.black); + + AttributedCharacterIterator characterIterator = attributedString.getIterator(); + + int currentHeight = 0; + // Prepare a list of lines of text we'll be drawing + List layouts = new ArrayList(); + String lastLine = null; + + LineBreakMeasurer measurer = new LineBreakMeasurer(characterIterator, g.getFontRenderContext()); + + TextLayout layout = null; + while (measurer.getPosition() < characterIterator.getEndIndex() && currentHeight <= boxHeight) { + + int previousPosition = measurer.getPosition(); + + // Request next layout + layout = measurer.nextLayout(boxWidth); + + int height = ((Float) (layout.getDescent() + layout.getAscent() + layout.getLeading())).intValue(); + + if (currentHeight + height > boxHeight) { + // The line we're about to add should NOT be added anymore, append three dots to previous one instead + // to indicate more text is truncated + if (!layouts.isEmpty()) { + layouts.remove(layouts.size() - 1); + + if (lastLine.length() >= 4) { + lastLine = lastLine.substring(0, lastLine.length() - 4) + "..."; + } + layouts.add(new TextLayout(lastLine, g.getFont(), g.getFontRenderContext())); + } + break; + } else { + layouts.add(layout); + lastLine = text.substring(previousPosition, measurer.getPosition()); + currentHeight += height; + } + } + + + int currentY = y + (centered ? ((boxHeight - currentHeight) / 2) : 0); + int currentX = 0; + + // Actually draw the lines + for (TextLayout textLayout : layouts) { + + currentY += textLayout.getAscent(); + currentX = x + (centered ? ((boxWidth - ((Double) textLayout.getBounds().getWidth()).intValue()) / 2) : 0); + + textLayout.draw(g, currentX, currentY); + currentY += textLayout.getDescent() + textLayout.getLeading(); + } + + } + + protected String fitTextToWidth(String original, int width) { + String text = original; + + // remove length for "..." + int maxWidth = width - 10; + + while (fontMetrics.stringWidth(text + "...") > maxWidth && text.length() > 0) { + text = text.substring(0, text.length() - 1); + } + + if (!text.equals(original)) { + text = text + "..."; + } + + return text; + } + + public void drawUserTask(String name, GraphicInfo graphicInfo, double scaleFactor) { + drawTask(USERTASK_IMAGE, name, graphicInfo, scaleFactor); + } + + public void drawScriptTask(String name, GraphicInfo graphicInfo, double scaleFactor) { + drawTask(SCRIPTTASK_IMAGE, name, graphicInfo, scaleFactor); + } + + public void drawServiceTask(String name, GraphicInfo graphicInfo, double scaleFactor) { + drawTask(SERVICETASK_IMAGE, name, graphicInfo, scaleFactor); + } + + public void drawReceiveTask(String name, GraphicInfo graphicInfo, double scaleFactor) { + drawTask(RECEIVETASK_IMAGE, name, graphicInfo, scaleFactor); + } + + public void drawSendTask(String name, GraphicInfo graphicInfo, double scaleFactor) { + drawTask(SENDTASK_IMAGE, name, graphicInfo, scaleFactor); + } + + public void drawManualTask(String name, GraphicInfo graphicInfo, double scaleFactor) { + drawTask(MANUALTASK_IMAGE, name, graphicInfo, scaleFactor); + } + + public void drawBusinessRuleTask(String name, GraphicInfo graphicInfo, double scaleFactor) { + drawTask(BUSINESS_RULE_TASK_IMAGE, name, graphicInfo, scaleFactor); + } + + public void drawCamelTask(String name, GraphicInfo graphicInfo, double scaleFactor) { + drawTask(CAMEL_TASK_IMAGE, name, graphicInfo, scaleFactor); + } + + public void drawMuleTask(String name, GraphicInfo graphicInfo, double scaleFactor) { + drawTask(MULE_TASK_IMAGE, name, graphicInfo, scaleFactor); + } + + public void drawExpandedSubProcess(String name, GraphicInfo graphicInfo, Boolean isTriggeredByEvent, double scaleFactor) { + RoundRectangle2D rect = new RoundRectangle2D.Double(graphicInfo.getX(), graphicInfo.getY(), + graphicInfo.getWidth(), graphicInfo.getHeight(), 8, 8); + + // Use different stroke (dashed) + if (isTriggeredByEvent) { + Stroke originalStroke = g.getStroke(); + g.setStroke(EVENT_SUBPROCESS_STROKE); + g.draw(rect); + g.setStroke(originalStroke); + } else { + Paint originalPaint = g.getPaint(); + g.setPaint(SUBPROCESS_BOX_COLOR); + g.fill(rect); + g.setPaint(SUBPROCESS_BORDER_COLOR); + g.draw(rect); + g.setPaint(originalPaint); + } + + if (scaleFactor == 1.0 && name != null && !name.isEmpty()) { + String text = fitTextToWidth(name, (int) graphicInfo.getWidth()); + g.drawString(text, (int) graphicInfo.getX() + 10, (int) graphicInfo.getY() + 15); + } + } + + public void drawCollapsedSubProcess(String name, GraphicInfo graphicInfo, Boolean isTriggeredByEvent) { + drawCollapsedTask(name, graphicInfo, false); + } + + public void drawCollapsedCallActivity(String name, GraphicInfo graphicInfo) { + drawCollapsedTask(name, graphicInfo, true); + } + + protected void drawCollapsedTask(String name, GraphicInfo graphicInfo, boolean thickBorder) { + // The collapsed marker is now visualized separately + drawTask(name, graphicInfo, thickBorder); + } + + public void drawCollapsedMarker(int x, int y, int width, int height) { + // rectangle + int rectangleWidth = MARKER_WIDTH; + int rectangleHeight = MARKER_WIDTH; + Rectangle rect = new Rectangle(x + (width - rectangleWidth) / 2, y + height - rectangleHeight - 3, rectangleWidth, rectangleHeight); + g.draw(rect); + + // plus inside rectangle + Line2D.Double line = new Line2D.Double(rect.getCenterX(), rect.getY() + 2, rect.getCenterX(), rect.getMaxY() - 2); + g.draw(line); + line = new Line2D.Double(rect.getMinX() + 2, rect.getCenterY(), rect.getMaxX() - 2, rect.getCenterY()); + g.draw(line); + } + + public void drawActivityMarkers(int x, int y, int width, int height, boolean multiInstanceSequential, boolean multiInstanceParallel, boolean collapsed) { + if (collapsed) { + if (!multiInstanceSequential && !multiInstanceParallel) { + drawCollapsedMarker(x, y, width, height); + } else { + drawCollapsedMarker(x - MARKER_WIDTH / 2 - 2, y, width, height); + if (multiInstanceSequential) { + drawMultiInstanceMarker(true, x + MARKER_WIDTH / 2 + 2, y, width, height); + } else { + drawMultiInstanceMarker(false, x + MARKER_WIDTH / 2 + 2, y, width, height); + } + } + } else { + if (multiInstanceSequential) { + drawMultiInstanceMarker(true, x, y, width, height); + } else if (multiInstanceParallel) { + drawMultiInstanceMarker(false, x, y, width, height); + } + } + } + + public void drawGateway(GraphicInfo graphicInfo) { + Polygon rhombus = new Polygon(); + int x = (int) graphicInfo.getX(); + int y = (int) graphicInfo.getY(); + int width = (int) graphicInfo.getWidth(); + int height = (int) graphicInfo.getHeight(); + + rhombus.addPoint(x, y + (height / 2)); + rhombus.addPoint(x + (width / 2), y + height); + rhombus.addPoint(x + width, y + (height / 2)); + rhombus.addPoint(x + (width / 2), y); + g.draw(rhombus); + } + + public void drawParallelGateway(GraphicInfo graphicInfo, double scaleFactor) { + // rhombus + drawGateway(graphicInfo); + int x = (int) graphicInfo.getX(); + int y = (int) graphicInfo.getY(); + int width = (int) graphicInfo.getWidth(); + int height = (int) graphicInfo.getHeight(); + + if (scaleFactor == 1.0) { + // plus inside rhombus + Stroke orginalStroke = g.getStroke(); + g.setStroke(GATEWAY_TYPE_STROKE); + Line2D.Double line = new Line2D.Double(x + 10, y + height / 2, x + width - 10, y + height / 2); // horizontal + g.draw(line); + line = new Line2D.Double(x + width / 2, y + height - 10, x + width / 2, y + 10); // vertical + g.draw(line); + g.setStroke(orginalStroke); + } + } + + public void drawExclusiveGateway(GraphicInfo graphicInfo, double scaleFactor) { + // rhombus + drawGateway(graphicInfo); + int x = (int) graphicInfo.getX(); + int y = (int) graphicInfo.getY(); + int width = (int) graphicInfo.getWidth(); + int height = (int) graphicInfo.getHeight(); + + int quarterWidth = width / 4; + int quarterHeight = height / 4; + + if (scaleFactor == 1.0) { + // X inside rhombus + Stroke orginalStroke = g.getStroke(); + g.setStroke(GATEWAY_TYPE_STROKE); + Line2D.Double line = new Line2D.Double(x + quarterWidth + 3, y + quarterHeight + 3, x + 3 * quarterWidth - 3, y + 3 * quarterHeight - 3); + g.draw(line); + line = new Line2D.Double(x + quarterWidth + 3, y + 3 * quarterHeight - 3, x + 3 * quarterWidth - 3, y + quarterHeight + 3); + g.draw(line); + g.setStroke(orginalStroke); + } + } + + public void drawInclusiveGateway(GraphicInfo graphicInfo, double scaleFactor) { + // rhombus + drawGateway(graphicInfo); + int x = (int) graphicInfo.getX(); + int y = (int) graphicInfo.getY(); + int width = (int) graphicInfo.getWidth(); + int height = (int) graphicInfo.getHeight(); + + int diameter = width / 2; + + if (scaleFactor == 1.0) { + // circle inside rhombus + Stroke orginalStroke = g.getStroke(); + g.setStroke(GATEWAY_TYPE_STROKE); + Ellipse2D.Double circle = new Ellipse2D.Double(((width - diameter) / 2) + x, ((height - diameter) / 2) + y, diameter, diameter); + g.draw(circle); + g.setStroke(orginalStroke); + } + } + + public void drawEventBasedGateway(GraphicInfo graphicInfo, double scaleFactor) { + // rhombus + drawGateway(graphicInfo); + + if (scaleFactor == 1.0) { + int x = (int) graphicInfo.getX(); + int y = (int) graphicInfo.getY(); + int width = (int) graphicInfo.getWidth(); + int height = (int) graphicInfo.getHeight(); + + double scale = .6; + + GraphicInfo eventInfo = new GraphicInfo(); + eventInfo.setX(x + width * (1 - scale) / 2); + eventInfo.setY(y + height * (1 - scale) / 2); + eventInfo.setWidth(width * scale); + eventInfo.setHeight(height * scale); + drawCatchingEvent(eventInfo, true, null, "eventGateway", scaleFactor); + + double r = width / 6.; + + // create pentagon (coords with respect to center) + int topX = (int) (.95 * r); // top right corner + int topY = (int) (-.31 * r); + int bottomX = (int) (.59 * r); // bottom right corner + int bottomY = (int) (.81 * r); + + int[] xPoints = new int[]{0, topX, bottomX, -bottomX, -topX}; + int[] yPoints = new int[]{-(int) r, topY, bottomY, bottomY, topY}; + Polygon pentagon = new Polygon(xPoints, yPoints, 5); + pentagon.translate(x + width / 2, y + width / 2); + + // draw + g.drawPolygon(pentagon); + } + } + + public void drawMultiInstanceMarker(boolean sequential, int x, int y, int width, int height) { + int rectangleWidth = MARKER_WIDTH; + int rectangleHeight = MARKER_WIDTH; + int lineX = x + (width - rectangleWidth) / 2; + int lineY = y + height - rectangleHeight - 3; + + Stroke orginalStroke = g.getStroke(); + g.setStroke(MULTI_INSTANCE_STROKE); + + if (sequential) { + g.draw(new Line2D.Double(lineX, lineY, lineX + rectangleWidth, lineY)); + g.draw(new Line2D.Double(lineX, lineY + rectangleHeight / 2, lineX + rectangleWidth, lineY + rectangleHeight / 2)); + g.draw(new Line2D.Double(lineX, lineY + rectangleHeight, lineX + rectangleWidth, lineY + rectangleHeight)); + } else { + g.draw(new Line2D.Double(lineX, lineY, lineX, lineY + rectangleHeight)); + g.draw(new Line2D.Double(lineX + rectangleWidth / 2, lineY, lineX + rectangleWidth / 2, lineY + rectangleHeight)); + g.draw(new Line2D.Double(lineX + rectangleWidth, lineY, lineX + rectangleWidth, lineY + rectangleHeight)); + } + + g.setStroke(orginalStroke); + } + + public void drawHighLight(int x, int y, int width, int height) { + Paint originalPaint = g.getPaint(); + Stroke originalStroke = g.getStroke(); + + g.setPaint(HIGHLIGHT_COLOR); // g.setPaint(Color.GREEN); - g.setStroke(THICK_TASK_BORDER_STROKE); - - RoundRectangle2D rect = new RoundRectangle2D.Double(x, y, width, height, 20, 20); - g.draw(rect); + g.setStroke(THICK_TASK_BORDER_STROKE); - g.setPaint(originalPaint); - g.setStroke(originalStroke); - } + RoundRectangle2D rect = new RoundRectangle2D.Double(x, y, width, height, 20, 20); + g.draw(rect); + g.setPaint(originalPaint); + g.setStroke(originalStroke); + } - public void drawHighLight(int x, int y, int width, int height,Color color) { - Paint originalPaint = g.getPaint(); - Stroke originalStroke = g.getStroke(); + public void drawHighLight(int x, int y, int width, int height, Color color) { + Paint originalPaint = g.getPaint(); + Stroke originalStroke = g.getStroke(); - g.setPaint(color); + g.setPaint(color); // g.setPaint(Color.GREEN); - g.setStroke(THICK_TASK_BORDER_STROKE); - - RoundRectangle2D rect = new RoundRectangle2D.Double(x, y, width, height, 20, 20); - g.draw(rect); - - g.setPaint(originalPaint); - g.setStroke(originalStroke); - } - - public void drawTextAnnotation(String text, GraphicInfo graphicInfo) { - int x = (int) graphicInfo.getX(); - int y = (int) graphicInfo.getY(); - int width = (int) graphicInfo.getWidth(); - int height = (int) graphicInfo.getHeight(); - - Font originalFont = g.getFont(); - Stroke originalStroke = g.getStroke(); - - g.setFont(ANNOTATION_FONT); - - Path2D path = new Path2D.Double(); - x += .5; - int lineLength = 18; - path.moveTo(x + lineLength, y); - path.lineTo(x, y); - path.lineTo(x, y + height); - path.lineTo(x + lineLength, y + height); - - path.lineTo(x + lineLength, y + height -1); - path.lineTo(x + 1, y + height -1); - path.lineTo(x + 1, y + 1); - path.lineTo(x + lineLength, y + 1); - path.closePath(); - - g.draw(path); - - int boxWidth = width - (2 * ANNOTATION_TEXT_PADDING); - int boxHeight = height - (2 * ANNOTATION_TEXT_PADDING); - int boxX = x + width/2 - boxWidth/2; - int boxY = y + height/2 - boxHeight/2; - - if (text != null && text.isEmpty() == false) { - drawMultilineAnnotationText(text, boxX, boxY, boxWidth, boxHeight); - } - - // restore originals - g.setFont(originalFont); - g.setStroke(originalStroke); - } - - public void drawLabel(String text, GraphicInfo graphicInfo){ - drawLabel(text, graphicInfo, true); - } - public void drawLabel(String text, GraphicInfo graphicInfo, boolean centered){ - float interline = 1.0f; - - // text - if (text != null && text.length()>0) { - Paint originalPaint = g.getPaint(); - Font originalFont = g.getFont(); - - g.setPaint(LABEL_COLOR); - g.setFont(LABEL_FONT); - - int wrapWidth = 100; - int textY = (int) graphicInfo.getY(); - - // TODO: use drawMultilineText() - AttributedString as = new AttributedString(text); - as.addAttribute(TextAttribute.FOREGROUND, g.getPaint()); - as.addAttribute(TextAttribute.FONT, g.getFont()); - AttributedCharacterIterator aci = as.getIterator(); - FontRenderContext frc = new FontRenderContext(null, true, false); - LineBreakMeasurer lbm = new LineBreakMeasurer(aci, frc); - - while (lbm.getPosition() < text.length()) { - TextLayout tl = lbm.nextLayout(wrapWidth); - textY += tl.getAscent(); - Rectangle2D bb = tl.getBounds(); - double tX = graphicInfo.getX(); - if (centered) { - tX += (int) (graphicInfo.getWidth() / 2 - bb.getWidth() / 2); - } - tl.draw(g, (float) tX, textY); - textY += tl.getDescent() + tl.getLeading() + (interline - 1.0f) * tl.getAscent(); - } - - // restore originals - g.setFont(originalFont); - g.setPaint(originalPaint); - } - } - - /** - * This method makes coordinates of connection flow better. - * @param sourceShapeType - * @param targetShapeType - * @param sourceGraphicInfo - * @param targetGraphicInfo - * @param graphicInfoList - * - */ - public List connectionPerfectionizer(SHAPE_TYPE sourceShapeType, SHAPE_TYPE targetShapeType, GraphicInfo sourceGraphicInfo, GraphicInfo targetGraphicInfo, List graphicInfoList) { - Shape shapeFirst = createShape(sourceShapeType, sourceGraphicInfo); - Shape shapeLast = createShape(targetShapeType, targetGraphicInfo); - - if (graphicInfoList != null && graphicInfoList.size() > 0) { - GraphicInfo graphicInfoFirst = graphicInfoList.get(0); - GraphicInfo graphicInfoLast = graphicInfoList.get(graphicInfoList.size()-1); - if (shapeFirst != null) { - graphicInfoFirst.setX(shapeFirst.getBounds2D().getCenterX()); - graphicInfoFirst.setY(shapeFirst.getBounds2D().getCenterY()); - } - if (shapeLast != null) { - graphicInfoLast.setX(shapeLast.getBounds2D().getCenterX()); - graphicInfoLast.setY(shapeLast.getBounds2D().getCenterY()); - } - - Point p = null; - - if (shapeFirst != null) { - Line2D.Double lineFirst = new Line2D.Double(graphicInfoFirst.getX(), graphicInfoFirst.getY(), graphicInfoList.get(1).getX(), graphicInfoList.get(1).getY()); - p = getIntersection(shapeFirst, lineFirst); - if (p != null) { - graphicInfoFirst.setX(p.getX()); - graphicInfoFirst.setY(p.getY()); - } - } - - if (shapeLast != null) { - Line2D.Double lineLast = new Line2D.Double(graphicInfoLast.getX(), graphicInfoLast.getY(), graphicInfoList.get(graphicInfoList.size()-2).getX(), graphicInfoList.get(graphicInfoList.size()-2).getY()); - p = getIntersection(shapeLast, lineLast); - if (p != null) { - graphicInfoLast.setX(p.getX()); - graphicInfoLast.setY(p.getY()); - } - } - } - - return graphicInfoList; - } - - /** - * This method creates shape by type and coordinates. - * @param shapeType - * @param graphicInfo - * @return Shape - */ - private static Shape createShape(SHAPE_TYPE shapeType, GraphicInfo graphicInfo) { - if (SHAPE_TYPE.Rectangle.equals(shapeType)) { - // source is rectangle - return new Rectangle2D.Double(graphicInfo.getX(), graphicInfo.getY(), graphicInfo.getWidth(), graphicInfo.getHeight()); - } else if (SHAPE_TYPE.Rhombus.equals(shapeType)) { - // source is rhombus - Path2D.Double rhombus = new Path2D.Double(); - rhombus.moveTo(graphicInfo.getX(), graphicInfo.getY() + graphicInfo.getHeight() / 2); - rhombus.lineTo(graphicInfo.getX() + graphicInfo.getWidth() / 2, graphicInfo.getY() + graphicInfo.getHeight()); - rhombus.lineTo(graphicInfo.getX() + graphicInfo.getWidth(), graphicInfo.getY() + graphicInfo.getHeight() / 2); - rhombus.lineTo(graphicInfo.getX() + graphicInfo.getWidth() / 2, graphicInfo.getY()); - rhombus.lineTo(graphicInfo.getX(), graphicInfo.getY() + graphicInfo.getHeight() / 2); - rhombus.closePath(); - return rhombus; - } else if (SHAPE_TYPE.Ellipse.equals(shapeType)) { - // source is ellipse - return new Ellipse2D.Double(graphicInfo.getX(), graphicInfo.getY(), graphicInfo.getWidth(), graphicInfo.getHeight()); - } else { - // unknown source element, just do not correct coordinates - } - return null; - } - - /** - * This method returns intersection point of shape border and line. - * - * @param shape - * @param line - * @return Point - */ - private static Point getIntersection(Shape shape, Line2D.Double line) { - if (shape instanceof Ellipse2D) { - return getEllipseIntersection(shape, line); - } else if (shape instanceof Rectangle2D || shape instanceof Path2D) { - return getShapeIntersection(shape, line); - } else { - // something strange - return null; - } - } - - /** - * This method calculates ellipse intersection with line - * @param shape - * Bounds of this shape used to calculate parameters of inscribed into this bounds ellipse. - * @param line - * @return Intersection point - */ - private static Point getEllipseIntersection(Shape shape, Line2D.Double line) { - double angle = Math.atan2(line.y2 - line.y1, line.x2 - line.x1); - double x = shape.getBounds2D().getWidth()/2 * Math.cos(angle) + shape.getBounds2D().getCenterX(); - double y = shape.getBounds2D().getHeight()/2 * Math.sin(angle) + shape.getBounds2D().getCenterY(); - Point p = new Point(); - p.setLocation(x, y); - return p; - } - - /** - * This method calculates shape intersection with line. - * - * @param shape - * @param line - * @return Intersection point - */ - private static Point getShapeIntersection(Shape shape, Line2D.Double line) { - PathIterator it = shape.getPathIterator(null); - double[] coords = new double[6]; - double[] pos = new double[2]; - Line2D.Double l = new Line2D.Double(); - while (!it.isDone()) { - int type = it.currentSegment(coords); - switch (type) { - case PathIterator.SEG_MOVETO: - pos[0] = coords[0]; - pos[1] = coords[1]; - break; - case PathIterator.SEG_LINETO: - l = new Line2D.Double(pos[0], pos[1], coords[0], coords[1]); - if (line.intersectsLine(l)) { - return getLinesIntersection(line, l); - } - pos[0] = coords[0]; - pos[1] = coords[1]; - break; - case PathIterator.SEG_CLOSE: - break; - default: - // whatever - } - it.next(); - } - return null; - } - - /** - * This method calculates intersections of two lines. - * @param a Line 1 - * @param b Line 2 - * @return Intersection point - */ - private static Point getLinesIntersection(Line2D a, Line2D b) { - double d = (a.getX1()-a.getX2())*(b.getY2()-b.getY1()) - (a.getY1()-a.getY2())*(b.getX2()-b.getX1()); - double da = (a.getX1()-b.getX1())*(b.getY2()-b.getY1()) - (a.getY1()-b.getY1())*(b.getX2()-b.getX1()); - // double db = (a.getX1()-a.getX2())*(a.getY1()-b.getY1()) - (a.getY1()-a.getY2())*(a.getX1()-b.getX1()); - double ta = da/d; - // double tb = db/d; - Point p = new Point(); - p.setLocation(a.getX1()+ta*(a.getX2()-a.getX1()), a.getY1()+ta*(a.getY2()-a.getY1())); - return p; - } + g.setStroke(THICK_TASK_BORDER_STROKE); + + RoundRectangle2D rect = new RoundRectangle2D.Double(x, y, width, height, 20, 20); + g.draw(rect); + + g.setPaint(originalPaint); + g.setStroke(originalStroke); + } + + public void drawTextAnnotation(String text, GraphicInfo graphicInfo) { + int x = (int) graphicInfo.getX(); + int y = (int) graphicInfo.getY(); + int width = (int) graphicInfo.getWidth(); + int height = (int) graphicInfo.getHeight(); + + Font originalFont = g.getFont(); + Stroke originalStroke = g.getStroke(); + + g.setFont(ANNOTATION_FONT); + + Path2D path = new Path2D.Double(); + x += .5; + int lineLength = 18; + path.moveTo(x + lineLength, y); + path.lineTo(x, y); + path.lineTo(x, y + height); + path.lineTo(x + lineLength, y + height); + + path.lineTo(x + lineLength, y + height - 1); + path.lineTo(x + 1, y + height - 1); + path.lineTo(x + 1, y + 1); + path.lineTo(x + lineLength, y + 1); + path.closePath(); + + g.draw(path); + + int boxWidth = width - (2 * ANNOTATION_TEXT_PADDING); + int boxHeight = height - (2 * ANNOTATION_TEXT_PADDING); + int boxX = x + width / 2 - boxWidth / 2; + int boxY = y + height / 2 - boxHeight / 2; + + if (text != null && text.isEmpty() == false) { + drawMultilineAnnotationText(text, boxX, boxY, boxWidth, boxHeight); + } + + // restore originals + g.setFont(originalFont); + g.setStroke(originalStroke); + } + + public void drawLabel(String text, GraphicInfo graphicInfo) { + drawLabel(text, graphicInfo, true); + } + + public void drawLabel(String text, GraphicInfo graphicInfo, boolean centered) { + float interline = 1.0f; + + // text + if (text != null && text.length() > 0) { + Paint originalPaint = g.getPaint(); + Font originalFont = g.getFont(); + + g.setPaint(LABEL_COLOR); + g.setFont(LABEL_FONT); + + int wrapWidth = 100; + int textY = (int) graphicInfo.getY(); + + // TODO: use drawMultilineText() + AttributedString as = new AttributedString(text); + as.addAttribute(TextAttribute.FOREGROUND, g.getPaint()); + as.addAttribute(TextAttribute.FONT, g.getFont()); + AttributedCharacterIterator aci = as.getIterator(); + FontRenderContext frc = new FontRenderContext(null, true, false); + LineBreakMeasurer lbm = new LineBreakMeasurer(aci, frc); + + while (lbm.getPosition() < text.length()) { + TextLayout tl = lbm.nextLayout(wrapWidth); + textY += tl.getAscent(); + Rectangle2D bb = tl.getBounds(); + double tX = graphicInfo.getX(); + if (centered) { + tX += (int) (graphicInfo.getWidth() / 2 - bb.getWidth() / 2); + } + tl.draw(g, (float) tX, textY); + textY += tl.getDescent() + tl.getLeading() + (interline - 1.0f) * tl.getAscent(); + } + + // restore originals + g.setFont(originalFont); + g.setPaint(originalPaint); + } + } + + /** + * This method makes coordinates of connection flow better. + * + * @param sourceShapeType + * @param targetShapeType + * @param sourceGraphicInfo + * @param targetGraphicInfo + * @param graphicInfoList + */ + public List connectionPerfectionizer(SHAPE_TYPE sourceShapeType, SHAPE_TYPE targetShapeType, GraphicInfo sourceGraphicInfo, GraphicInfo targetGraphicInfo, List graphicInfoList) { + Shape shapeFirst = createShape(sourceShapeType, sourceGraphicInfo); + Shape shapeLast = createShape(targetShapeType, targetGraphicInfo); + + if (graphicInfoList != null && graphicInfoList.size() > 0) { + GraphicInfo graphicInfoFirst = graphicInfoList.get(0); + GraphicInfo graphicInfoLast = graphicInfoList.get(graphicInfoList.size() - 1); + if (shapeFirst != null) { + graphicInfoFirst.setX(shapeFirst.getBounds2D().getCenterX()); + graphicInfoFirst.setY(shapeFirst.getBounds2D().getCenterY()); + } + if (shapeLast != null) { + graphicInfoLast.setX(shapeLast.getBounds2D().getCenterX()); + graphicInfoLast.setY(shapeLast.getBounds2D().getCenterY()); + } + + Point p = null; + + if (shapeFirst != null) { + Line2D.Double lineFirst = new Line2D.Double(graphicInfoFirst.getX(), graphicInfoFirst.getY(), graphicInfoList.get(1).getX(), graphicInfoList.get(1).getY()); + p = getIntersection(shapeFirst, lineFirst); + if (p != null) { + graphicInfoFirst.setX(p.getX()); + graphicInfoFirst.setY(p.getY()); + } + } + + if (shapeLast != null) { + Line2D.Double lineLast = new Line2D.Double(graphicInfoLast.getX(), graphicInfoLast.getY(), graphicInfoList.get(graphicInfoList.size() - 2).getX(), graphicInfoList.get(graphicInfoList.size() - 2).getY()); + p = getIntersection(shapeLast, lineLast); + if (p != null) { + graphicInfoLast.setX(p.getX()); + graphicInfoLast.setY(p.getY()); + } + } + } + + return graphicInfoList; + } + + public enum SHAPE_TYPE {Rectangle, Rhombus, Ellipse} } diff --git a/len-activiti/src/main/java/org/activiti/image/impl/DefaultProcessDiagramGenerator.java b/len-activiti/src/main/java/org/activiti/image/impl/DefaultProcessDiagramGenerator.java index c4a72ab..ebbc987 100644 --- a/len-activiti/src/main/java/org/activiti/image/impl/DefaultProcessDiagramGenerator.java +++ b/len-activiti/src/main/java/org/activiti/image/impl/DefaultProcessDiagramGenerator.java @@ -1,9 +1,9 @@ /* Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -13,1133 +13,1084 @@ package org.activiti.image.impl; +import org.activiti.bpmn.model.Event; +import org.activiti.bpmn.model.Process; +import org.activiti.bpmn.model.*; +import org.activiti.image.HMProcessDiagramGenerator; + import java.awt.*; import java.awt.image.BufferedImage; import java.io.InputStream; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; import java.util.List; -import java.util.Map; - -import org.activiti.bpmn.model.Activity; -import org.activiti.bpmn.model.Artifact; -import org.activiti.bpmn.model.Association; -import org.activiti.bpmn.model.AssociationDirection; -import org.activiti.bpmn.model.BaseElement; -import org.activiti.bpmn.model.BoundaryEvent; -import org.activiti.bpmn.model.BpmnModel; -import org.activiti.bpmn.model.BusinessRuleTask; -import org.activiti.bpmn.model.CallActivity; -import org.activiti.bpmn.model.CompensateEventDefinition; -import org.activiti.bpmn.model.EndEvent; -import org.activiti.bpmn.model.ErrorEventDefinition; -import org.activiti.bpmn.model.Event; -import org.activiti.bpmn.model.EventDefinition; -import org.activiti.bpmn.model.EventGateway; -import org.activiti.bpmn.model.EventSubProcess; -import org.activiti.bpmn.model.ExclusiveGateway; -import org.activiti.bpmn.model.FlowElement; -import org.activiti.bpmn.model.FlowElementsContainer; -import org.activiti.bpmn.model.FlowNode; -import org.activiti.bpmn.model.Gateway; -import org.activiti.bpmn.model.GraphicInfo; -import org.activiti.bpmn.model.InclusiveGateway; -import org.activiti.bpmn.model.IntermediateCatchEvent; -import org.activiti.bpmn.model.Lane; -import org.activiti.bpmn.model.ManualTask; -import org.activiti.bpmn.model.MessageEventDefinition; -import org.activiti.bpmn.model.MultiInstanceLoopCharacteristics; -import org.activiti.bpmn.model.ParallelGateway; -import org.activiti.bpmn.model.Pool; -import org.activiti.bpmn.model.Process; -import org.activiti.bpmn.model.ReceiveTask; -import org.activiti.bpmn.model.ScriptTask; -import org.activiti.bpmn.model.SendTask; -import org.activiti.bpmn.model.SequenceFlow; -import org.activiti.bpmn.model.ServiceTask; -import org.activiti.bpmn.model.SignalEventDefinition; -import org.activiti.bpmn.model.StartEvent; -import org.activiti.bpmn.model.SubProcess; -import org.activiti.bpmn.model.Task; -import org.activiti.bpmn.model.TextAnnotation; -import org.activiti.bpmn.model.ThrowEvent; -import org.activiti.bpmn.model.TimerEventDefinition; -import org.activiti.bpmn.model.UserTask; -import org.activiti.image.HMProcessDiagramGenerator; -import org.activiti.image.ProcessDiagramGenerator; +import java.util.*; /** * Class to generate an image based the diagram interchange information in a * BPMN 2.0 process. - * + * * @author Joram Barrez * @author Tijs Rademakers */ public class DefaultProcessDiagramGenerator implements HMProcessDiagramGenerator { - protected Map, ActivityDrawInstruction> activityDrawInstructions = new HashMap, ActivityDrawInstruction>(); - protected Map, ArtifactDrawInstruction> artifactDrawInstructions = new HashMap, ArtifactDrawInstruction>(); - - public DefaultProcessDiagramGenerator() { - this(1.0); - } - - // The instructions on how to draw a certain construct is - // created statically and stored in a map for performance. - public DefaultProcessDiagramGenerator(final double scaleFactor) { - // start event - activityDrawInstructions.put(StartEvent.class, new ActivityDrawInstruction() { - - public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); - StartEvent startEvent = (StartEvent) flowNode; - if (startEvent.getEventDefinitions() != null && !startEvent.getEventDefinitions().isEmpty()) { - EventDefinition eventDefinition = startEvent.getEventDefinitions().get(0); - if (eventDefinition instanceof TimerEventDefinition) { - processDiagramCanvas.drawTimerStartEvent(graphicInfo, scaleFactor); - } else if (eventDefinition instanceof ErrorEventDefinition) { - processDiagramCanvas.drawErrorStartEvent(graphicInfo, scaleFactor); - } else if (eventDefinition instanceof SignalEventDefinition) { - processDiagramCanvas.drawSignalStartEvent(graphicInfo, scaleFactor); - } else if (eventDefinition instanceof MessageEventDefinition) { - processDiagramCanvas.drawMessageStartEvent(graphicInfo, scaleFactor); - } else { - processDiagramCanvas.drawNoneStartEvent(graphicInfo); - } - } else { - processDiagramCanvas.drawNoneStartEvent(graphicInfo); - } - } - }); - - // signal catch - activityDrawInstructions.put(IntermediateCatchEvent.class, new ActivityDrawInstruction() { - - public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); - IntermediateCatchEvent intermediateCatchEvent = (IntermediateCatchEvent) flowNode; - if (intermediateCatchEvent.getEventDefinitions() != null && !intermediateCatchEvent.getEventDefinitions() - .isEmpty()) { - if (intermediateCatchEvent.getEventDefinitions().get(0) instanceof SignalEventDefinition) { - processDiagramCanvas.drawCatchingSignalEvent(flowNode.getName(), graphicInfo, true, scaleFactor); - } else if (intermediateCatchEvent.getEventDefinitions().get(0) instanceof TimerEventDefinition) { - processDiagramCanvas.drawCatchingTimerEvent(flowNode.getName(), graphicInfo, true, scaleFactor); - } else if (intermediateCatchEvent.getEventDefinitions().get(0) instanceof MessageEventDefinition) { - processDiagramCanvas.drawCatchingMessageEvent(flowNode.getName(), graphicInfo, true, scaleFactor); - } - } - } - }); - - // signal throw - activityDrawInstructions.put(ThrowEvent.class, new ActivityDrawInstruction() { - - public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); - ThrowEvent throwEvent = (ThrowEvent) flowNode; - if (throwEvent.getEventDefinitions() != null && !throwEvent.getEventDefinitions().isEmpty()) { - if (throwEvent.getEventDefinitions().get(0) instanceof SignalEventDefinition) { - processDiagramCanvas.drawThrowingSignalEvent(graphicInfo, scaleFactor); - } else if (throwEvent.getEventDefinitions().get(0) instanceof CompensateEventDefinition) { - processDiagramCanvas.drawThrowingCompensateEvent(graphicInfo, scaleFactor); - } else { - processDiagramCanvas.drawThrowingNoneEvent(graphicInfo, scaleFactor); - } - } else { - processDiagramCanvas.drawThrowingNoneEvent(graphicInfo, scaleFactor); - } - } - }); - - // end event - activityDrawInstructions.put(EndEvent.class, new ActivityDrawInstruction() { - - public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); - EndEvent endEvent = (EndEvent) flowNode; - if (endEvent.getEventDefinitions() != null && !endEvent.getEventDefinitions().isEmpty()) { - if (endEvent.getEventDefinitions().get(0) instanceof ErrorEventDefinition) { - processDiagramCanvas.drawErrorEndEvent(flowNode.getName(), graphicInfo, scaleFactor); - } else { - processDiagramCanvas.drawNoneEndEvent(graphicInfo, scaleFactor); - } - } else { - processDiagramCanvas.drawNoneEndEvent(graphicInfo, scaleFactor); - } - } - }); - - // task - activityDrawInstructions.put(Task.class, new ActivityDrawInstruction() { - - public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); - processDiagramCanvas.drawTask(flowNode.getName(), graphicInfo); - } - }); - - // user task - activityDrawInstructions.put(UserTask.class, new ActivityDrawInstruction() { - - public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); - processDiagramCanvas.drawUserTask(flowNode.getName(), graphicInfo, scaleFactor); - } - }); - - // script task - activityDrawInstructions.put(ScriptTask.class, new ActivityDrawInstruction() { - - public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); - processDiagramCanvas.drawScriptTask(flowNode.getName(), graphicInfo, scaleFactor); - } - }); - - // service task - activityDrawInstructions.put(ServiceTask.class, new ActivityDrawInstruction() { - - public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); - ServiceTask serviceTask = (ServiceTask) flowNode; - if ("camel".equalsIgnoreCase(serviceTask.getType())) { - processDiagramCanvas.drawCamelTask(serviceTask.getName(), graphicInfo, scaleFactor); - } else if ("mule".equalsIgnoreCase(serviceTask.getType())) { - processDiagramCanvas.drawMuleTask(serviceTask.getName(), graphicInfo, scaleFactor); - } else { - processDiagramCanvas.drawServiceTask(serviceTask.getName(), graphicInfo, scaleFactor); - } - } - }); - - // receive task - activityDrawInstructions.put(ReceiveTask.class, new ActivityDrawInstruction() { - - public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); - processDiagramCanvas.drawReceiveTask(flowNode.getName(), graphicInfo, scaleFactor); - } - }); - - // send task - activityDrawInstructions.put(SendTask.class, new ActivityDrawInstruction() { - - public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); - processDiagramCanvas.drawSendTask(flowNode.getName(), graphicInfo, scaleFactor); - } - }); - - // manual task - activityDrawInstructions.put(ManualTask.class, new ActivityDrawInstruction() { - - public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); - processDiagramCanvas.drawManualTask(flowNode.getName(), graphicInfo, scaleFactor); - } - }); - - // businessRuleTask task - activityDrawInstructions.put(BusinessRuleTask.class, new ActivityDrawInstruction() { - - public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); - processDiagramCanvas.drawBusinessRuleTask(flowNode.getName(), graphicInfo, scaleFactor); - } - }); - - // exclusive gateway - activityDrawInstructions.put(ExclusiveGateway.class, new ActivityDrawInstruction() { - - public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); - processDiagramCanvas.drawExclusiveGateway(graphicInfo, scaleFactor); - } - }); - - // inclusive gateway - activityDrawInstructions.put(InclusiveGateway.class, new ActivityDrawInstruction() { - - public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); - processDiagramCanvas.drawInclusiveGateway(graphicInfo, scaleFactor); - } - }); - - // parallel gateway - activityDrawInstructions.put(ParallelGateway.class, new ActivityDrawInstruction() { - - public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); - processDiagramCanvas.drawParallelGateway(graphicInfo, scaleFactor); - } - }); - - // event based gateway - activityDrawInstructions.put(EventGateway.class, new ActivityDrawInstruction() { - - public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); - processDiagramCanvas.drawEventBasedGateway(graphicInfo, scaleFactor); - } - }); - - - // Boundary timer - activityDrawInstructions.put(BoundaryEvent.class, new ActivityDrawInstruction() { - - public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); - BoundaryEvent boundaryEvent = (BoundaryEvent) flowNode; - if (boundaryEvent.getEventDefinitions() != null && !boundaryEvent.getEventDefinitions().isEmpty()) { - if (boundaryEvent.getEventDefinitions().get(0) instanceof TimerEventDefinition) { - - processDiagramCanvas.drawCatchingTimerEvent(flowNode.getName(), graphicInfo, boundaryEvent.isCancelActivity(), scaleFactor); - - } else if (boundaryEvent.getEventDefinitions().get(0) instanceof ErrorEventDefinition) { - - processDiagramCanvas.drawCatchingErrorEvent(graphicInfo, boundaryEvent.isCancelActivity(), scaleFactor); - - } else if (boundaryEvent.getEventDefinitions().get(0) instanceof SignalEventDefinition) { - processDiagramCanvas.drawCatchingSignalEvent(flowNode.getName(), graphicInfo, boundaryEvent.isCancelActivity(), scaleFactor); - - } else if (boundaryEvent.getEventDefinitions().get(0) instanceof MessageEventDefinition) { - processDiagramCanvas.drawCatchingMessageEvent(flowNode.getName(), graphicInfo, boundaryEvent.isCancelActivity(), scaleFactor); - - } else if (boundaryEvent.getEventDefinitions().get(0) instanceof CompensateEventDefinition) { - processDiagramCanvas.drawCatchingCompensateEvent(graphicInfo, boundaryEvent.isCancelActivity(), scaleFactor); - } - } - - } - }); - - // subprocess - activityDrawInstructions.put(SubProcess.class, new ActivityDrawInstruction() { - - public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); - if (graphicInfo.getExpanded() != null && !graphicInfo.getExpanded()) { - processDiagramCanvas.drawCollapsedSubProcess(flowNode.getName(), graphicInfo, false); - } else { - processDiagramCanvas.drawExpandedSubProcess(flowNode.getName(), graphicInfo, false, scaleFactor); - } - } - }); - - // Event subprocess - activityDrawInstructions.put(EventSubProcess.class, new ActivityDrawInstruction() { - - public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); - if (graphicInfo.getExpanded() != null && !graphicInfo.getExpanded()) { - processDiagramCanvas.drawCollapsedSubProcess(flowNode.getName(), graphicInfo, true); - } else { - processDiagramCanvas.drawExpandedSubProcess(flowNode.getName(), graphicInfo, true, scaleFactor); - } - } - }); - - // call activity - activityDrawInstructions.put(CallActivity.class, new ActivityDrawInstruction() { - - public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); - processDiagramCanvas.drawCollapsedCallActivity(flowNode.getName(), graphicInfo); - } - }); - - // text annotation - artifactDrawInstructions.put(TextAnnotation.class, new ArtifactDrawInstruction() { - - public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, Artifact artifact) { - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(artifact.getId()); - TextAnnotation textAnnotation = (TextAnnotation) artifact; - processDiagramCanvas.drawTextAnnotation(textAnnotation.getText(), graphicInfo); - } - }); - - // association - artifactDrawInstructions.put(Association.class, new ArtifactDrawInstruction() { - - public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, Artifact artifact) { - Association association = (Association) artifact; - String sourceRef = association.getSourceRef(); - String targetRef = association.getTargetRef(); - - // source and target can be instance of FlowElement or Artifact - BaseElement sourceElement = bpmnModel.getFlowElement(sourceRef); - BaseElement targetElement = bpmnModel.getFlowElement(targetRef); - if (sourceElement == null) { - sourceElement = bpmnModel.getArtifact(sourceRef); - } - if (targetElement == null) { - targetElement = bpmnModel.getArtifact(targetRef); - } - List graphicInfoList = bpmnModel.getFlowLocationGraphicInfo(artifact.getId()); - graphicInfoList = connectionPerfectionizer(processDiagramCanvas, bpmnModel, sourceElement, targetElement, graphicInfoList); - int xPoints[]= new int[graphicInfoList.size()]; - int yPoints[]= new int[graphicInfoList.size()]; - for (int i=1; i highLightedActivities, List highLightedFlows, - String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader, double scaleFactor) { - - return generateProcessDiagram(bpmnModel, imageType, highLightedActivities, highLightedFlows, - activityFontName, labelFontName, annotationFontName, customClassLoader, scaleFactor).generateImage(imageType); - } - - public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, List highLightedActivities, List highLightedFlows, - String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader, double scaleFactor, - List highLightedCurrentActivities) { - - return generateProcessDiagram(bpmnModel, imageType, highLightedActivities, highLightedFlows, - activityFontName, labelFontName, annotationFontName, customClassLoader, scaleFactor,highLightedCurrentActivities).generateImage(imageType); - } - - public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, List highLightedActivities, List highLightedFlows) { - return generateDiagram(bpmnModel, imageType, highLightedActivities, highLightedFlows, null, null, null, null, 1.0); - } - - public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, - List highLightedActivities, List highLightedFlows, double scaleFactor) { - return generateDiagram(bpmnModel, imageType, highLightedActivities, highLightedFlows, null, null, null, null, scaleFactor); - } - - public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, List highLightedActivities) { - return generateDiagram(bpmnModel, imageType, highLightedActivities, Collections.emptyList()); - } - - public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, List highLightedActivities, double scaleFactor) { - return generateDiagram(bpmnModel, imageType, highLightedActivities, Collections.emptyList(), scaleFactor); - } - - public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader) { - return generateDiagram(bpmnModel, imageType, Collections.emptyList(), Collections.emptyList(), - activityFontName, labelFontName, annotationFontName, customClassLoader, 1.0); - } - - public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, String activityFontName, - String labelFontName, String annotationFontName, ClassLoader customClassLoader, double scaleFactor) { - - return generateDiagram(bpmnModel, imageType, Collections.emptyList(), Collections.emptyList(), - activityFontName, labelFontName, annotationFontName, customClassLoader, scaleFactor); - } - - public InputStream generatePngDiagram(BpmnModel bpmnModel) { - return generatePngDiagram(bpmnModel, 1.0); - } - - public InputStream generatePngDiagram(BpmnModel bpmnModel, double scaleFactor) { - return generateDiagram(bpmnModel, "png", Collections.emptyList(), Collections.emptyList(), scaleFactor); - } - - public InputStream generateJpgDiagram(BpmnModel bpmnModel) { - return generateJpgDiagram(bpmnModel, 1.0); - } - - public InputStream generateJpgDiagram(BpmnModel bpmnModel, double scaleFactor) { - return generateDiagram(bpmnModel, "jpg", Collections.emptyList(), Collections.emptyList()); - } - - public BufferedImage generateImage(BpmnModel bpmnModel, String imageType, List highLightedActivities, List highLightedFlows, - String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader, double scaleFactor) { - - return generateProcessDiagram(bpmnModel, imageType, highLightedActivities, highLightedFlows, - activityFontName, labelFontName, annotationFontName, customClassLoader, scaleFactor).generateBufferedImage(imageType); - } - - public BufferedImage generateImage(BpmnModel bpmnModel, String imageType, - List highLightedActivities, List highLightedFlows, double scaleFactor) { - - return generateImage(bpmnModel, imageType, highLightedActivities, highLightedFlows, null, null, null, null, scaleFactor); - } - - public BufferedImage generatePngImage(BpmnModel bpmnModel, double scaleFactor) { - return generateImage(bpmnModel, "png", Collections.emptyList(), Collections.emptyList(), scaleFactor); - } - - protected DefaultProcessDiagramCanvas generateProcessDiagram(BpmnModel bpmnModel, String imageType, - List highLightedActivities, List highLightedFlows, - String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader, double scaleFactor) { - - prepareBpmnModel(bpmnModel); - - DefaultProcessDiagramCanvas processDiagramCanvas = initProcessDiagramCanvas(bpmnModel, imageType, activityFontName, labelFontName, annotationFontName, customClassLoader); - - // Draw pool shape, if process is participant in collaboration - for (Pool pool : bpmnModel.getPools()) { - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(pool.getId()); - processDiagramCanvas.drawPoolOrLane(pool.getName(), graphicInfo); - } - - // Draw lanes - for (Process process : bpmnModel.getProcesses()) { - for (Lane lane : process.getLanes()) { - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(lane.getId()); - processDiagramCanvas.drawPoolOrLane(lane.getName(), graphicInfo); - } - } - - // Draw activities and their sequence-flows - for (Process process: bpmnModel.getProcesses()) { - for (FlowNode flowNode : process.findFlowElementsOfType(FlowNode.class)) { - drawActivity(processDiagramCanvas, bpmnModel, flowNode, highLightedActivities, highLightedFlows, scaleFactor); - } - } - - // Draw artifacts - for (Process process : bpmnModel.getProcesses()) { - - for (Artifact artifact : process.getArtifacts()) { - drawArtifact(processDiagramCanvas, bpmnModel, artifact); - } - - List subProcesses = process.findFlowElementsOfType(SubProcess.class, true); - if (subProcesses != null) { - for (SubProcess subProcess : subProcesses) { - for (Artifact subProcessArtifact : subProcess.getArtifacts()) { - drawArtifact(processDiagramCanvas, bpmnModel, subProcessArtifact); - } - } - } - } - - return processDiagramCanvas; - } - - - protected DefaultProcessDiagramCanvas generateProcessDiagram(BpmnModel bpmnModel, String imageType, - List highLightedActivities, List highLightedFlows, - String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader, double scaleFactor, - List highCurrentLightedActivities) { - - prepareBpmnModel(bpmnModel); - - DefaultProcessDiagramCanvas processDiagramCanvas = initProcessDiagramCanvas(bpmnModel, imageType, activityFontName, labelFontName, annotationFontName, customClassLoader); - - // Draw pool shape, if process is participant in collaboration - for (Pool pool : bpmnModel.getPools()) { - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(pool.getId()); - processDiagramCanvas.drawPoolOrLane(pool.getName(), graphicInfo); - } - - // Draw lanes - for (Process process : bpmnModel.getProcesses()) { - for (Lane lane : process.getLanes()) { - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(lane.getId()); - processDiagramCanvas.drawPoolOrLane(lane.getName(), graphicInfo); - } - } - - // Draw activities and their sequence-flows - for (Process process: bpmnModel.getProcesses()) { - for (FlowNode flowNode : process.findFlowElementsOfType(FlowNode.class)) { - drawActivity(processDiagramCanvas, bpmnModel, flowNode, highLightedActivities, highLightedFlows, scaleFactor,highCurrentLightedActivities); - } - } - - // Draw artifacts - for (Process process : bpmnModel.getProcesses()) { - - for (Artifact artifact : process.getArtifacts()) { - drawArtifact(processDiagramCanvas, bpmnModel, artifact); - } - - List subProcesses = process.findFlowElementsOfType(SubProcess.class, true); - if (subProcesses != null) { - for (SubProcess subProcess : subProcesses) { - for (Artifact subProcessArtifact : subProcess.getArtifacts()) { - drawArtifact(processDiagramCanvas, bpmnModel, subProcessArtifact); - } - } - } - } - - return processDiagramCanvas; - } - - protected void prepareBpmnModel(BpmnModel bpmnModel) { - - // Need to make sure all elements have positive x and y. - // Check all graphicInfo and update the elements accordingly - - List allGraphicInfos = new ArrayList(); - if (bpmnModel.getLocationMap() != null) { - allGraphicInfos.addAll(bpmnModel.getLocationMap().values()); - } - if (bpmnModel.getLabelLocationMap() != null) { - allGraphicInfos.addAll(bpmnModel.getLabelLocationMap().values()); - } - if (bpmnModel.getFlowLocationMap() != null) { - for (List flowGraphicInfos : bpmnModel.getFlowLocationMap().values()) { - allGraphicInfos.addAll(flowGraphicInfos); - } - } - - if (allGraphicInfos.size() > 0) { - - boolean needsTranslationX = false; - boolean needsTranslationY = false; - - double lowestX = 0.0; - double lowestY = 0.0; - - // Collect lowest x and y - for (GraphicInfo graphicInfo : allGraphicInfos) { - - double x = graphicInfo.getX(); - double y = graphicInfo.getY(); - - if (x < lowestX) { - needsTranslationX = true; - lowestX = x; - } - if (y < lowestY) { - needsTranslationY = true; - lowestY = y; - } - - } - - // Update all graphicInfo objects - if (needsTranslationX || needsTranslationY) { - - double translationX = Math.abs(lowestX); - double translationY = Math.abs(lowestY); - - for (GraphicInfo graphicInfo : allGraphicInfos) { - if (needsTranslationX) { - graphicInfo.setX(graphicInfo.getX() + translationX); - } - if(needsTranslationY) { - graphicInfo.setY(graphicInfo.getY() + translationY); - } - } - } - - } - - } - - protected void drawActivity(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, - FlowNode flowNode, List highLightedActivities, List highLightedFlows, double scaleFactor) { - - ActivityDrawInstruction drawInstruction = activityDrawInstructions.get(flowNode.getClass()); - if (drawInstruction != null) { - - drawInstruction.draw(processDiagramCanvas, bpmnModel, flowNode); - - // Gather info on the multi instance marker - boolean multiInstanceSequential = false, multiInstanceParallel = false, collapsed = false; - if (flowNode instanceof Activity) { - Activity activity = (Activity) flowNode; - MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics = activity.getLoopCharacteristics(); - if (multiInstanceLoopCharacteristics != null) { - multiInstanceSequential = multiInstanceLoopCharacteristics.isSequential(); - multiInstanceParallel = !multiInstanceSequential; - } - } - - // Gather info on the collapsed marker - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); - if (flowNode instanceof SubProcess) { - collapsed = graphicInfo.getExpanded() != null && !graphicInfo.getExpanded(); - } else if (flowNode instanceof CallActivity) { - collapsed = true; - } - - if (scaleFactor == 1.0) { - // Actually draw the markers - processDiagramCanvas.drawActivityMarkers((int) graphicInfo.getX(), (int) graphicInfo.getY(),(int) graphicInfo.getWidth(), (int) graphicInfo.getHeight(), - multiInstanceSequential, multiInstanceParallel, collapsed); - } - - // Draw highlighted activities - if (highLightedActivities.contains(flowNode.getId())) { - drawHighLight(processDiagramCanvas, bpmnModel.getGraphicInfo(flowNode.getId())); - } - - } - - // Outgoing transitions of activity - for (SequenceFlow sequenceFlow : flowNode.getOutgoingFlows()) { - boolean highLighted = (highLightedFlows.contains(sequenceFlow.getId())); - String defaultFlow = null; - if (flowNode instanceof Activity) { - defaultFlow = ((Activity) flowNode).getDefaultFlow(); - } else if (flowNode instanceof Gateway) { - defaultFlow = ((Gateway) flowNode).getDefaultFlow(); - } - - boolean isDefault = false; - if (defaultFlow != null && defaultFlow.equalsIgnoreCase(sequenceFlow.getId())) { - isDefault = true; - } - boolean drawConditionalIndicator = sequenceFlow.getConditionExpression() != null && !(flowNode instanceof Gateway); - - String sourceRef = sequenceFlow.getSourceRef(); - String targetRef = sequenceFlow.getTargetRef(); - FlowElement sourceElement = bpmnModel.getFlowElement(sourceRef); - FlowElement targetElement = bpmnModel.getFlowElement(targetRef); - List graphicInfoList = bpmnModel.getFlowLocationGraphicInfo(sequenceFlow.getId()); - if (graphicInfoList != null && graphicInfoList.size() > 0) { - graphicInfoList = connectionPerfectionizer(processDiagramCanvas, bpmnModel, sourceElement, targetElement, graphicInfoList); - int xPoints[]= new int[graphicInfoList.size()]; - int yPoints[]= new int[graphicInfoList.size()]; - - for (int i=1; i highLightedActivities, List highLightedFlows, double scaleFactor, List highLightedExecutedActivities) { - - ActivityDrawInstruction drawInstruction = activityDrawInstructions.get(flowNode.getClass()); - if (drawInstruction != null) { - - drawInstruction.draw(processDiagramCanvas, bpmnModel, flowNode); - - // Gather info on the multi instance marker - boolean multiInstanceSequential = false, multiInstanceParallel = false, collapsed = false; - if (flowNode instanceof Activity) { - Activity activity = (Activity) flowNode; - MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics = activity.getLoopCharacteristics(); - if (multiInstanceLoopCharacteristics != null) { - multiInstanceSequential = multiInstanceLoopCharacteristics.isSequential(); - multiInstanceParallel = !multiInstanceSequential; - } - } - - // Gather info on the collapsed marker - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); - if (flowNode instanceof SubProcess) { - collapsed = graphicInfo.getExpanded() != null && !graphicInfo.getExpanded(); - } else if (flowNode instanceof CallActivity) { - collapsed = true; - } - - if (scaleFactor == 1.0) { - // Actually draw the markers - processDiagramCanvas.drawActivityMarkers((int) graphicInfo.getX(), (int) graphicInfo.getY(),(int) graphicInfo.getWidth(), (int) graphicInfo.getHeight(), - multiInstanceSequential, multiInstanceParallel, collapsed); - } - - // Draw highlighted activities - if (highLightedActivities.contains(flowNode.getId())) { - drawHighLight(processDiagramCanvas, bpmnModel.getGraphicInfo(flowNode.getId())); - } - - if (highLightedExecutedActivities.contains(flowNode.getId())) { - processDiagramCanvas.HIGHLIGHT_COLOR = Color.RED; - drawColorHighLight(processDiagramCanvas, bpmnModel.getGraphicInfo(flowNode.getId()),Color.RED); - processDiagramCanvas.HIGHLIGHT_COLOR = Color.GREEN; - } - - } - - // Outgoing transitions of activity - for (SequenceFlow sequenceFlow : flowNode.getOutgoingFlows()) { - boolean highLighted = (highLightedFlows.contains(sequenceFlow.getId())); - String defaultFlow = null; - if (flowNode instanceof Activity) { - defaultFlow = ((Activity) flowNode).getDefaultFlow(); - } else if (flowNode instanceof Gateway) { - defaultFlow = ((Gateway) flowNode).getDefaultFlow(); - } - - boolean isDefault = false; - if (defaultFlow != null && defaultFlow.equalsIgnoreCase(sequenceFlow.getId())) { - isDefault = true; - } - boolean drawConditionalIndicator = sequenceFlow.getConditionExpression() != null && !(flowNode instanceof Gateway); - - String sourceRef = sequenceFlow.getSourceRef(); - String targetRef = sequenceFlow.getTargetRef(); - FlowElement sourceElement = bpmnModel.getFlowElement(sourceRef); - FlowElement targetElement = bpmnModel.getFlowElement(targetRef); - List graphicInfoList = bpmnModel.getFlowLocationGraphicInfo(sequenceFlow.getId()); - if (graphicInfoList != null && graphicInfoList.size() > 0) { - graphicInfoList = connectionPerfectionizer(processDiagramCanvas, bpmnModel, sourceElement, targetElement, graphicInfoList); - int xPoints[]= new int[graphicInfoList.size()]; - int yPoints[]= new int[graphicInfoList.size()]; - - for (int i=1; i connectionPerfectionizer(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, BaseElement sourceElement, BaseElement targetElement, List graphicInfoList) { - GraphicInfo sourceGraphicInfo = bpmnModel.getGraphicInfo(sourceElement.getId()); - GraphicInfo targetGraphicInfo = bpmnModel.getGraphicInfo(targetElement.getId()); - - DefaultProcessDiagramCanvas.SHAPE_TYPE sourceShapeType = getShapeType(sourceElement); - DefaultProcessDiagramCanvas.SHAPE_TYPE targetShapeType = getShapeType(targetElement); - - return processDiagramCanvas.connectionPerfectionizer(sourceShapeType, targetShapeType, sourceGraphicInfo, targetGraphicInfo, graphicInfoList); - } - - /** - * This method returns shape type of base element.
- * Each element can be presented as rectangle, rhombus, or ellipse. - * @param baseElement - * @return DefaultProcessDiagramCanvas.SHAPE_TYPE - */ - protected static DefaultProcessDiagramCanvas.SHAPE_TYPE getShapeType(BaseElement baseElement) { - if (baseElement instanceof Task || baseElement instanceof Activity || baseElement instanceof TextAnnotation) { - return DefaultProcessDiagramCanvas.SHAPE_TYPE.Rectangle; - } else if (baseElement instanceof Gateway) { - return DefaultProcessDiagramCanvas.SHAPE_TYPE.Rhombus; - } else if (baseElement instanceof Event) { - return DefaultProcessDiagramCanvas.SHAPE_TYPE.Ellipse; - } else { - // unknown source element, just do not correct coordinates - } - return null; - } - - protected static GraphicInfo getLineCenter(List graphicInfoList) { - GraphicInfo gi = new GraphicInfo(); - - int xPoints[]= new int[graphicInfoList.size()]; - int yPoints[]= new int[graphicInfoList.size()]; - - double length = 0; - double[] lengths = new double[graphicInfoList.size()]; - lengths[0] = 0; - double m; - for (int i=1; i, ActivityDrawInstruction> activityDrawInstructions = new HashMap, ActivityDrawInstruction>(); + protected Map, ArtifactDrawInstruction> artifactDrawInstructions = new HashMap, ArtifactDrawInstruction>(); + + public DefaultProcessDiagramGenerator() { + this(1.0); + } + + // The instructions on how to draw a certain construct is + // created statically and stored in a map for performance. + public DefaultProcessDiagramGenerator(final double scaleFactor) { + // start event + activityDrawInstructions.put(StartEvent.class, new ActivityDrawInstruction() { + + public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); + StartEvent startEvent = (StartEvent) flowNode; + if (startEvent.getEventDefinitions() != null && !startEvent.getEventDefinitions().isEmpty()) { + EventDefinition eventDefinition = startEvent.getEventDefinitions().get(0); + if (eventDefinition instanceof TimerEventDefinition) { + processDiagramCanvas.drawTimerStartEvent(graphicInfo, scaleFactor); + } else if (eventDefinition instanceof ErrorEventDefinition) { + processDiagramCanvas.drawErrorStartEvent(graphicInfo, scaleFactor); + } else if (eventDefinition instanceof SignalEventDefinition) { + processDiagramCanvas.drawSignalStartEvent(graphicInfo, scaleFactor); + } else if (eventDefinition instanceof MessageEventDefinition) { + processDiagramCanvas.drawMessageStartEvent(graphicInfo, scaleFactor); + } else { + processDiagramCanvas.drawNoneStartEvent(graphicInfo); + } + } else { + processDiagramCanvas.drawNoneStartEvent(graphicInfo); + } + } + }); + + // signal catch + activityDrawInstructions.put(IntermediateCatchEvent.class, new ActivityDrawInstruction() { + + public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); + IntermediateCatchEvent intermediateCatchEvent = (IntermediateCatchEvent) flowNode; + if (intermediateCatchEvent.getEventDefinitions() != null && !intermediateCatchEvent.getEventDefinitions() + .isEmpty()) { + if (intermediateCatchEvent.getEventDefinitions().get(0) instanceof SignalEventDefinition) { + processDiagramCanvas.drawCatchingSignalEvent(flowNode.getName(), graphicInfo, true, scaleFactor); + } else if (intermediateCatchEvent.getEventDefinitions().get(0) instanceof TimerEventDefinition) { + processDiagramCanvas.drawCatchingTimerEvent(flowNode.getName(), graphicInfo, true, scaleFactor); + } else if (intermediateCatchEvent.getEventDefinitions().get(0) instanceof MessageEventDefinition) { + processDiagramCanvas.drawCatchingMessageEvent(flowNode.getName(), graphicInfo, true, scaleFactor); + } + } + } + }); + + // signal throw + activityDrawInstructions.put(ThrowEvent.class, new ActivityDrawInstruction() { + + public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); + ThrowEvent throwEvent = (ThrowEvent) flowNode; + if (throwEvent.getEventDefinitions() != null && !throwEvent.getEventDefinitions().isEmpty()) { + if (throwEvent.getEventDefinitions().get(0) instanceof SignalEventDefinition) { + processDiagramCanvas.drawThrowingSignalEvent(graphicInfo, scaleFactor); + } else if (throwEvent.getEventDefinitions().get(0) instanceof CompensateEventDefinition) { + processDiagramCanvas.drawThrowingCompensateEvent(graphicInfo, scaleFactor); + } else { + processDiagramCanvas.drawThrowingNoneEvent(graphicInfo, scaleFactor); + } + } else { + processDiagramCanvas.drawThrowingNoneEvent(graphicInfo, scaleFactor); + } + } + }); + + // end event + activityDrawInstructions.put(EndEvent.class, new ActivityDrawInstruction() { + + public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); + EndEvent endEvent = (EndEvent) flowNode; + if (endEvent.getEventDefinitions() != null && !endEvent.getEventDefinitions().isEmpty()) { + if (endEvent.getEventDefinitions().get(0) instanceof ErrorEventDefinition) { + processDiagramCanvas.drawErrorEndEvent(flowNode.getName(), graphicInfo, scaleFactor); + } else { + processDiagramCanvas.drawNoneEndEvent(graphicInfo, scaleFactor); + } + } else { + processDiagramCanvas.drawNoneEndEvent(graphicInfo, scaleFactor); + } + } + }); + + // task + activityDrawInstructions.put(Task.class, new ActivityDrawInstruction() { + + public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); + processDiagramCanvas.drawTask(flowNode.getName(), graphicInfo); + } + }); + + // user task + activityDrawInstructions.put(UserTask.class, new ActivityDrawInstruction() { + + public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); + processDiagramCanvas.drawUserTask(flowNode.getName(), graphicInfo, scaleFactor); + } + }); + + // script task + activityDrawInstructions.put(ScriptTask.class, new ActivityDrawInstruction() { + + public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); + processDiagramCanvas.drawScriptTask(flowNode.getName(), graphicInfo, scaleFactor); + } + }); + + // service task + activityDrawInstructions.put(ServiceTask.class, new ActivityDrawInstruction() { + + public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); + ServiceTask serviceTask = (ServiceTask) flowNode; + if ("camel".equalsIgnoreCase(serviceTask.getType())) { + processDiagramCanvas.drawCamelTask(serviceTask.getName(), graphicInfo, scaleFactor); + } else if ("mule".equalsIgnoreCase(serviceTask.getType())) { + processDiagramCanvas.drawMuleTask(serviceTask.getName(), graphicInfo, scaleFactor); + } else { + processDiagramCanvas.drawServiceTask(serviceTask.getName(), graphicInfo, scaleFactor); + } + } + }); + + // receive task + activityDrawInstructions.put(ReceiveTask.class, new ActivityDrawInstruction() { + + public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); + processDiagramCanvas.drawReceiveTask(flowNode.getName(), graphicInfo, scaleFactor); + } + }); + + // send task + activityDrawInstructions.put(SendTask.class, new ActivityDrawInstruction() { + + public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); + processDiagramCanvas.drawSendTask(flowNode.getName(), graphicInfo, scaleFactor); + } + }); + + // manual task + activityDrawInstructions.put(ManualTask.class, new ActivityDrawInstruction() { + + public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); + processDiagramCanvas.drawManualTask(flowNode.getName(), graphicInfo, scaleFactor); + } + }); + + // businessRuleTask task + activityDrawInstructions.put(BusinessRuleTask.class, new ActivityDrawInstruction() { + + public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); + processDiagramCanvas.drawBusinessRuleTask(flowNode.getName(), graphicInfo, scaleFactor); + } + }); + + // exclusive gateway + activityDrawInstructions.put(ExclusiveGateway.class, new ActivityDrawInstruction() { + + public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); + processDiagramCanvas.drawExclusiveGateway(graphicInfo, scaleFactor); + } + }); + + // inclusive gateway + activityDrawInstructions.put(InclusiveGateway.class, new ActivityDrawInstruction() { + + public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); + processDiagramCanvas.drawInclusiveGateway(graphicInfo, scaleFactor); + } + }); + + // parallel gateway + activityDrawInstructions.put(ParallelGateway.class, new ActivityDrawInstruction() { + + public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); + processDiagramCanvas.drawParallelGateway(graphicInfo, scaleFactor); + } + }); + + // event based gateway + activityDrawInstructions.put(EventGateway.class, new ActivityDrawInstruction() { + + public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); + processDiagramCanvas.drawEventBasedGateway(graphicInfo, scaleFactor); + } + }); + + + // Boundary timer + activityDrawInstructions.put(BoundaryEvent.class, new ActivityDrawInstruction() { + + public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); + BoundaryEvent boundaryEvent = (BoundaryEvent) flowNode; + if (boundaryEvent.getEventDefinitions() != null && !boundaryEvent.getEventDefinitions().isEmpty()) { + if (boundaryEvent.getEventDefinitions().get(0) instanceof TimerEventDefinition) { + + processDiagramCanvas.drawCatchingTimerEvent(flowNode.getName(), graphicInfo, boundaryEvent.isCancelActivity(), scaleFactor); + + } else if (boundaryEvent.getEventDefinitions().get(0) instanceof ErrorEventDefinition) { + + processDiagramCanvas.drawCatchingErrorEvent(graphicInfo, boundaryEvent.isCancelActivity(), scaleFactor); + + } else if (boundaryEvent.getEventDefinitions().get(0) instanceof SignalEventDefinition) { + processDiagramCanvas.drawCatchingSignalEvent(flowNode.getName(), graphicInfo, boundaryEvent.isCancelActivity(), scaleFactor); + + } else if (boundaryEvent.getEventDefinitions().get(0) instanceof MessageEventDefinition) { + processDiagramCanvas.drawCatchingMessageEvent(flowNode.getName(), graphicInfo, boundaryEvent.isCancelActivity(), scaleFactor); + + } else if (boundaryEvent.getEventDefinitions().get(0) instanceof CompensateEventDefinition) { + processDiagramCanvas.drawCatchingCompensateEvent(graphicInfo, boundaryEvent.isCancelActivity(), scaleFactor); + } + } + + } + }); + + // subprocess + activityDrawInstructions.put(SubProcess.class, new ActivityDrawInstruction() { + + public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); + if (graphicInfo.getExpanded() != null && !graphicInfo.getExpanded()) { + processDiagramCanvas.drawCollapsedSubProcess(flowNode.getName(), graphicInfo, false); + } else { + processDiagramCanvas.drawExpandedSubProcess(flowNode.getName(), graphicInfo, false, scaleFactor); + } + } + }); + + // Event subprocess + activityDrawInstructions.put(EventSubProcess.class, new ActivityDrawInstruction() { + + public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); + if (graphicInfo.getExpanded() != null && !graphicInfo.getExpanded()) { + processDiagramCanvas.drawCollapsedSubProcess(flowNode.getName(), graphicInfo, true); + } else { + processDiagramCanvas.drawExpandedSubProcess(flowNode.getName(), graphicInfo, true, scaleFactor); + } + } + }); + + // call activity + activityDrawInstructions.put(CallActivity.class, new ActivityDrawInstruction() { + + public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); + processDiagramCanvas.drawCollapsedCallActivity(flowNode.getName(), graphicInfo); + } + }); + + // text annotation + artifactDrawInstructions.put(TextAnnotation.class, new ArtifactDrawInstruction() { + + public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, Artifact artifact) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(artifact.getId()); + TextAnnotation textAnnotation = (TextAnnotation) artifact; + processDiagramCanvas.drawTextAnnotation(textAnnotation.getText(), graphicInfo); + } + }); + + // association + artifactDrawInstructions.put(Association.class, new ArtifactDrawInstruction() { + + public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, Artifact artifact) { + Association association = (Association) artifact; + String sourceRef = association.getSourceRef(); + String targetRef = association.getTargetRef(); + + // source and target can be instance of FlowElement or Artifact + BaseElement sourceElement = bpmnModel.getFlowElement(sourceRef); + BaseElement targetElement = bpmnModel.getFlowElement(targetRef); + if (sourceElement == null) { + sourceElement = bpmnModel.getArtifact(sourceRef); + } + if (targetElement == null) { + targetElement = bpmnModel.getArtifact(targetRef); + } + List graphicInfoList = bpmnModel.getFlowLocationGraphicInfo(artifact.getId()); + graphicInfoList = connectionPerfectionizer(processDiagramCanvas, bpmnModel, sourceElement, targetElement, graphicInfoList); + int xPoints[] = new int[graphicInfoList.size()]; + int yPoints[] = new int[graphicInfoList.size()]; + for (int i = 1; i < graphicInfoList.size(); i++) { + GraphicInfo graphicInfo = graphicInfoList.get(i); + GraphicInfo previousGraphicInfo = graphicInfoList.get(i - 1); + + if (i == 1) { + xPoints[0] = (int) previousGraphicInfo.getX(); + yPoints[0] = (int) previousGraphicInfo.getY(); + } + xPoints[i] = (int) graphicInfo.getX(); + yPoints[i] = (int) graphicInfo.getY(); + } + + AssociationDirection associationDirection = association.getAssociationDirection(); + processDiagramCanvas.drawAssociation(xPoints, yPoints, associationDirection, false, scaleFactor); + } + }); + } + + /** + * This method makes coordinates of connection flow better. + * + * @param processDiagramCanvas + * @param bpmnModel + * @param sourceElement + * @param targetElement + * @param graphicInfoList + * @return + */ + protected static List connectionPerfectionizer(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, BaseElement sourceElement, BaseElement targetElement, List graphicInfoList) { + GraphicInfo sourceGraphicInfo = bpmnModel.getGraphicInfo(sourceElement.getId()); + GraphicInfo targetGraphicInfo = bpmnModel.getGraphicInfo(targetElement.getId()); + + DefaultProcessDiagramCanvas.SHAPE_TYPE sourceShapeType = getShapeType(sourceElement); + DefaultProcessDiagramCanvas.SHAPE_TYPE targetShapeType = getShapeType(targetElement); + + return processDiagramCanvas.connectionPerfectionizer(sourceShapeType, targetShapeType, sourceGraphicInfo, targetGraphicInfo, graphicInfoList); + } + + /** + * This method returns shape type of base element.
+ * Each element can be presented as rectangle, rhombus, or ellipse. + * + * @param baseElement + * @return DefaultProcessDiagramCanvas.SHAPE_TYPE + */ + protected static DefaultProcessDiagramCanvas.SHAPE_TYPE getShapeType(BaseElement baseElement) { + if (baseElement instanceof Task || baseElement instanceof Activity || baseElement instanceof TextAnnotation) { + return DefaultProcessDiagramCanvas.SHAPE_TYPE.Rectangle; + } else if (baseElement instanceof Gateway) { + return DefaultProcessDiagramCanvas.SHAPE_TYPE.Rhombus; + } else if (baseElement instanceof Event) { + return DefaultProcessDiagramCanvas.SHAPE_TYPE.Ellipse; + } else { + // unknown source element, just do not correct coordinates + } + return null; + } + + protected static GraphicInfo getLineCenter(List graphicInfoList) { + GraphicInfo gi = new GraphicInfo(); + + int xPoints[] = new int[graphicInfoList.size()]; + int yPoints[] = new int[graphicInfoList.size()]; + + double length = 0; + double[] lengths = new double[graphicInfoList.size()]; + lengths[0] = 0; + double m; + for (int i = 1; i < graphicInfoList.size(); i++) { + GraphicInfo graphicInfo = graphicInfoList.get(i); + GraphicInfo previousGraphicInfo = graphicInfoList.get(i - 1); + + if (i == 1) { + xPoints[0] = (int) previousGraphicInfo.getX(); + yPoints[0] = (int) previousGraphicInfo.getY(); + } + xPoints[i] = (int) graphicInfo.getX(); + yPoints[i] = (int) graphicInfo.getY(); + + length += Math.sqrt( + Math.pow((int) graphicInfo.getX() - (int) previousGraphicInfo.getX(), 2) + + Math.pow((int) graphicInfo.getY() - (int) previousGraphicInfo.getY(), 2) + ); + lengths[i] = length; + } + m = length / 2; + int p1 = 0, p2 = 1; + for (int i = 1; i < lengths.length; i++) { double len = lengths[i]; - p1 = i-1; + p1 = i - 1; p2 = i; if (len > m) { break; } } - - GraphicInfo graphicInfo1 = graphicInfoList.get(p1); - GraphicInfo graphicInfo2 = graphicInfoList.get(p2); - - double AB = (int)graphicInfo2.getX() - (int)graphicInfo1.getX(); - double OA = (int)graphicInfo2.getY() - (int)graphicInfo1.getY(); - double OB = lengths[p2] - lengths[p1]; - double ob = m - lengths[p1]; - double ab = AB * ob / OB; - double oa = OA * ob / OB; - - double mx = graphicInfo1.getX() + ab; - double my = graphicInfo1.getY() + oa; - - gi.setX(mx); - gi.setY(my); - return gi; - } - - protected void drawArtifact(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, Artifact artifact) { - ArtifactDrawInstruction drawInstruction = artifactDrawInstructions.get(artifact.getClass()); - if (drawInstruction != null) { - drawInstruction.draw(processDiagramCanvas, bpmnModel, artifact); - } - } - - private static void drawHighLight(DefaultProcessDiagramCanvas processDiagramCanvas, GraphicInfo graphicInfo) { - processDiagramCanvas.drawHighLight((int) graphicInfo.getX(), (int) graphicInfo.getY(), (int) graphicInfo.getWidth(), (int) graphicInfo.getHeight()); - - } - - - private static void drawColorHighLight(DefaultProcessDiagramCanvas processDiagramCanvas, GraphicInfo graphicInfo,Color color) { - processDiagramCanvas.drawHighLight((int) graphicInfo.getX(), (int) graphicInfo.getY(), (int) graphicInfo.getWidth(), (int) graphicInfo.getHeight(),color); - - } - - protected static DefaultProcessDiagramCanvas initProcessDiagramCanvas(BpmnModel bpmnModel, String imageType, - String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader) { - - // We need to calculate maximum values to know how big the image will be in its entirety - double minX = Double.MAX_VALUE; - double maxX = 0; - double minY = Double.MAX_VALUE; - double maxY = 0; - - for (Pool pool : bpmnModel.getPools()) { - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(pool.getId()); - minX = graphicInfo.getX(); - maxX = graphicInfo.getX() + graphicInfo.getWidth(); - minY = graphicInfo.getY(); - maxY = graphicInfo.getY() + graphicInfo.getHeight(); - } - - List flowNodes = gatherAllFlowNodes(bpmnModel); - for (FlowNode flowNode : flowNodes) { - - GraphicInfo flowNodeGraphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); - - // width - if (flowNodeGraphicInfo.getX() + flowNodeGraphicInfo.getWidth() > maxX) { - maxX = flowNodeGraphicInfo.getX() + flowNodeGraphicInfo.getWidth(); - } - if (flowNodeGraphicInfo.getX() < minX) { - minX = flowNodeGraphicInfo.getX(); - } - // height - if (flowNodeGraphicInfo.getY() + flowNodeGraphicInfo.getHeight() > maxY) { - maxY = flowNodeGraphicInfo.getY() + flowNodeGraphicInfo.getHeight(); - } - if (flowNodeGraphicInfo.getY() < minY) { - minY = flowNodeGraphicInfo.getY(); - } - - for (SequenceFlow sequenceFlow : flowNode.getOutgoingFlows()) { - List graphicInfoList = bpmnModel.getFlowLocationGraphicInfo(sequenceFlow.getId()); - if (graphicInfoList != null) { - for (GraphicInfo graphicInfo : graphicInfoList) { - // width - if (graphicInfo.getX() > maxX) { - maxX = graphicInfo.getX(); - } - if (graphicInfo.getX() < minX) { - minX = graphicInfo.getX(); - } - // height - if (graphicInfo.getY() > maxY) { - maxY = graphicInfo.getY(); - } - if (graphicInfo.getY()< minY) { - minY = graphicInfo.getY(); - } - } - } - } - } - - List artifacts = gatherAllArtifacts(bpmnModel); - for (Artifact artifact : artifacts) { - - GraphicInfo artifactGraphicInfo = bpmnModel.getGraphicInfo(artifact.getId()); - - if (artifactGraphicInfo != null) { - // width - if (artifactGraphicInfo.getX() + artifactGraphicInfo.getWidth() > maxX) { - maxX = artifactGraphicInfo.getX() + artifactGraphicInfo.getWidth(); - } - if (artifactGraphicInfo.getX() < minX) { - minX = artifactGraphicInfo.getX(); - } - // height - if (artifactGraphicInfo.getY() + artifactGraphicInfo.getHeight() > maxY) { - maxY = artifactGraphicInfo.getY() + artifactGraphicInfo.getHeight(); - } - if (artifactGraphicInfo.getY() < minY) { - minY = artifactGraphicInfo.getY(); - } - } - - List graphicInfoList = bpmnModel.getFlowLocationGraphicInfo(artifact.getId()); - if (graphicInfoList != null) { - for (GraphicInfo graphicInfo : graphicInfoList) { - // width - if (graphicInfo.getX() > maxX) { - maxX = graphicInfo.getX(); - } - if (graphicInfo.getX() < minX) { - minX = graphicInfo.getX(); - } - // height - if (graphicInfo.getY() > maxY) { - maxY = graphicInfo.getY(); - } - if (graphicInfo.getY()< minY) { - minY = graphicInfo.getY(); - } - } - } - } - - int nrOfLanes = 0; - for (Process process : bpmnModel.getProcesses()) { - for (Lane l : process.getLanes()) { - - nrOfLanes++; - - GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(l.getId()); - // // width - if (graphicInfo.getX() + graphicInfo.getWidth() > maxX) { - maxX = graphicInfo.getX() + graphicInfo.getWidth(); - } - if (graphicInfo.getX() < minX) { - minX = graphicInfo.getX(); - } - // height - if (graphicInfo.getY() + graphicInfo.getHeight() > maxY) { - maxY = graphicInfo.getY() + graphicInfo.getHeight(); - } - if (graphicInfo.getY() < minY) { - minY = graphicInfo.getY(); - } - } - } - - // Special case, see https://activiti.atlassian.net/browse/ACT-1431 - if (flowNodes.isEmpty() && bpmnModel.getPools().isEmpty() && nrOfLanes == 0) { - // Nothing to show - minX = 0; - minY = 0; - } - - return new DefaultProcessDiagramCanvas((int) maxX + 10,(int) maxY + 10, (int) minX, (int) minY, - imageType, activityFontName, labelFontName, annotationFontName, customClassLoader); - } - - - protected static List gatherAllArtifacts(BpmnModel bpmnModel) { - List artifacts = new ArrayList(); - for (Process process : bpmnModel.getProcesses()) { - artifacts.addAll(process.getArtifacts()); - } - return artifacts; - } - - protected static List gatherAllFlowNodes(BpmnModel bpmnModel) { - List flowNodes = new ArrayList(); - for (Process process : bpmnModel.getProcesses()) { - flowNodes.addAll(gatherAllFlowNodes(process)); - } - return flowNodes; - } - - protected static List gatherAllFlowNodes(FlowElementsContainer flowElementsContainer) { - List flowNodes = new ArrayList(); - for (FlowElement flowElement : flowElementsContainer.getFlowElements()) { - if (flowElement instanceof FlowNode) { - flowNodes.add((FlowNode) flowElement); - } - if (flowElement instanceof FlowElementsContainer) { - flowNodes.addAll(gatherAllFlowNodes((FlowElementsContainer) flowElement)); - } - } - return flowNodes; - } - - public Map, ActivityDrawInstruction> getActivityDrawInstructions() { + + GraphicInfo graphicInfo1 = graphicInfoList.get(p1); + GraphicInfo graphicInfo2 = graphicInfoList.get(p2); + + double AB = (int) graphicInfo2.getX() - (int) graphicInfo1.getX(); + double OA = (int) graphicInfo2.getY() - (int) graphicInfo1.getY(); + double OB = lengths[p2] - lengths[p1]; + double ob = m - lengths[p1]; + double ab = AB * ob / OB; + double oa = OA * ob / OB; + + double mx = graphicInfo1.getX() + ab; + double my = graphicInfo1.getY() + oa; + + gi.setX(mx); + gi.setY(my); + return gi; + } + + private static void drawHighLight(DefaultProcessDiagramCanvas processDiagramCanvas, GraphicInfo graphicInfo) { + processDiagramCanvas.drawHighLight((int) graphicInfo.getX(), (int) graphicInfo.getY(), (int) graphicInfo.getWidth(), (int) graphicInfo.getHeight()); + + } + + private static void drawColorHighLight(DefaultProcessDiagramCanvas processDiagramCanvas, GraphicInfo graphicInfo, Color color) { + processDiagramCanvas.drawHighLight((int) graphicInfo.getX(), (int) graphicInfo.getY(), (int) graphicInfo.getWidth(), (int) graphicInfo.getHeight(), color); + + } + + protected static DefaultProcessDiagramCanvas initProcessDiagramCanvas(BpmnModel bpmnModel, String imageType, + String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader) { + + // We need to calculate maximum values to know how big the image will be in its entirety + double minX = Double.MAX_VALUE; + double maxX = 0; + double minY = Double.MAX_VALUE; + double maxY = 0; + + for (Pool pool : bpmnModel.getPools()) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(pool.getId()); + minX = graphicInfo.getX(); + maxX = graphicInfo.getX() + graphicInfo.getWidth(); + minY = graphicInfo.getY(); + maxY = graphicInfo.getY() + graphicInfo.getHeight(); + } + + List flowNodes = gatherAllFlowNodes(bpmnModel); + for (FlowNode flowNode : flowNodes) { + + GraphicInfo flowNodeGraphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); + + // width + if (flowNodeGraphicInfo.getX() + flowNodeGraphicInfo.getWidth() > maxX) { + maxX = flowNodeGraphicInfo.getX() + flowNodeGraphicInfo.getWidth(); + } + if (flowNodeGraphicInfo.getX() < minX) { + minX = flowNodeGraphicInfo.getX(); + } + // height + if (flowNodeGraphicInfo.getY() + flowNodeGraphicInfo.getHeight() > maxY) { + maxY = flowNodeGraphicInfo.getY() + flowNodeGraphicInfo.getHeight(); + } + if (flowNodeGraphicInfo.getY() < minY) { + minY = flowNodeGraphicInfo.getY(); + } + + for (SequenceFlow sequenceFlow : flowNode.getOutgoingFlows()) { + List graphicInfoList = bpmnModel.getFlowLocationGraphicInfo(sequenceFlow.getId()); + if (graphicInfoList != null) { + for (GraphicInfo graphicInfo : graphicInfoList) { + // width + if (graphicInfo.getX() > maxX) { + maxX = graphicInfo.getX(); + } + if (graphicInfo.getX() < minX) { + minX = graphicInfo.getX(); + } + // height + if (graphicInfo.getY() > maxY) { + maxY = graphicInfo.getY(); + } + if (graphicInfo.getY() < minY) { + minY = graphicInfo.getY(); + } + } + } + } + } + + List artifacts = gatherAllArtifacts(bpmnModel); + for (Artifact artifact : artifacts) { + + GraphicInfo artifactGraphicInfo = bpmnModel.getGraphicInfo(artifact.getId()); + + if (artifactGraphicInfo != null) { + // width + if (artifactGraphicInfo.getX() + artifactGraphicInfo.getWidth() > maxX) { + maxX = artifactGraphicInfo.getX() + artifactGraphicInfo.getWidth(); + } + if (artifactGraphicInfo.getX() < minX) { + minX = artifactGraphicInfo.getX(); + } + // height + if (artifactGraphicInfo.getY() + artifactGraphicInfo.getHeight() > maxY) { + maxY = artifactGraphicInfo.getY() + artifactGraphicInfo.getHeight(); + } + if (artifactGraphicInfo.getY() < minY) { + minY = artifactGraphicInfo.getY(); + } + } + + List graphicInfoList = bpmnModel.getFlowLocationGraphicInfo(artifact.getId()); + if (graphicInfoList != null) { + for (GraphicInfo graphicInfo : graphicInfoList) { + // width + if (graphicInfo.getX() > maxX) { + maxX = graphicInfo.getX(); + } + if (graphicInfo.getX() < minX) { + minX = graphicInfo.getX(); + } + // height + if (graphicInfo.getY() > maxY) { + maxY = graphicInfo.getY(); + } + if (graphicInfo.getY() < minY) { + minY = graphicInfo.getY(); + } + } + } + } + + int nrOfLanes = 0; + for (Process process : bpmnModel.getProcesses()) { + for (Lane l : process.getLanes()) { + + nrOfLanes++; + + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(l.getId()); + // // width + if (graphicInfo.getX() + graphicInfo.getWidth() > maxX) { + maxX = graphicInfo.getX() + graphicInfo.getWidth(); + } + if (graphicInfo.getX() < minX) { + minX = graphicInfo.getX(); + } + // height + if (graphicInfo.getY() + graphicInfo.getHeight() > maxY) { + maxY = graphicInfo.getY() + graphicInfo.getHeight(); + } + if (graphicInfo.getY() < minY) { + minY = graphicInfo.getY(); + } + } + } + + // Special case, see https://activiti.atlassian.net/browse/ACT-1431 + if (flowNodes.isEmpty() && bpmnModel.getPools().isEmpty() && nrOfLanes == 0) { + // Nothing to show + minX = 0; + minY = 0; + } + + return new DefaultProcessDiagramCanvas((int) maxX + 10, (int) maxY + 10, (int) minX, (int) minY, + imageType, activityFontName, labelFontName, annotationFontName, customClassLoader); + } + + protected static List gatherAllArtifacts(BpmnModel bpmnModel) { + List artifacts = new ArrayList(); + for (Process process : bpmnModel.getProcesses()) { + artifacts.addAll(process.getArtifacts()); + } + return artifacts; + } + + protected static List gatherAllFlowNodes(BpmnModel bpmnModel) { + List flowNodes = new ArrayList(); + for (Process process : bpmnModel.getProcesses()) { + flowNodes.addAll(gatherAllFlowNodes(process)); + } + return flowNodes; + } + + protected static List gatherAllFlowNodes(FlowElementsContainer flowElementsContainer) { + List flowNodes = new ArrayList(); + for (FlowElement flowElement : flowElementsContainer.getFlowElements()) { + if (flowElement instanceof FlowNode) { + flowNodes.add((FlowNode) flowElement); + } + if (flowElement instanceof FlowElementsContainer) { + flowNodes.addAll(gatherAllFlowNodes((FlowElementsContainer) flowElement)); + } + } + return flowNodes; + } + + public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, List highLightedActivities, List highLightedFlows, + String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader, double scaleFactor) { + + return generateProcessDiagram(bpmnModel, imageType, highLightedActivities, highLightedFlows, + activityFontName, labelFontName, annotationFontName, customClassLoader, scaleFactor).generateImage(imageType); + } + + public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, List highLightedActivities, List highLightedFlows, + String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader, double scaleFactor, + List highLightedCurrentActivities) { + + return generateProcessDiagram(bpmnModel, imageType, highLightedActivities, highLightedFlows, + activityFontName, labelFontName, annotationFontName, customClassLoader, scaleFactor, highLightedCurrentActivities).generateImage(imageType); + } + + public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, List highLightedActivities, List highLightedFlows) { + return generateDiagram(bpmnModel, imageType, highLightedActivities, highLightedFlows, null, null, null, null, 1.0); + } + + public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, + List highLightedActivities, List highLightedFlows, double scaleFactor) { + return generateDiagram(bpmnModel, imageType, highLightedActivities, highLightedFlows, null, null, null, null, scaleFactor); + } + + public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, List highLightedActivities) { + return generateDiagram(bpmnModel, imageType, highLightedActivities, Collections.emptyList()); + } + + public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, List highLightedActivities, double scaleFactor) { + return generateDiagram(bpmnModel, imageType, highLightedActivities, Collections.emptyList(), scaleFactor); + } + + public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader) { + return generateDiagram(bpmnModel, imageType, Collections.emptyList(), Collections.emptyList(), + activityFontName, labelFontName, annotationFontName, customClassLoader, 1.0); + } + + public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, String activityFontName, + String labelFontName, String annotationFontName, ClassLoader customClassLoader, double scaleFactor) { + + return generateDiagram(bpmnModel, imageType, Collections.emptyList(), Collections.emptyList(), + activityFontName, labelFontName, annotationFontName, customClassLoader, scaleFactor); + } + + public InputStream generatePngDiagram(BpmnModel bpmnModel) { + return generatePngDiagram(bpmnModel, 1.0); + } + + public InputStream generatePngDiagram(BpmnModel bpmnModel, double scaleFactor) { + return generateDiagram(bpmnModel, "png", Collections.emptyList(), Collections.emptyList(), scaleFactor); + } + + public InputStream generateJpgDiagram(BpmnModel bpmnModel) { + return generateJpgDiagram(bpmnModel, 1.0); + } + + public InputStream generateJpgDiagram(BpmnModel bpmnModel, double scaleFactor) { + return generateDiagram(bpmnModel, "jpg", Collections.emptyList(), Collections.emptyList()); + } + + public BufferedImage generateImage(BpmnModel bpmnModel, String imageType, List highLightedActivities, List highLightedFlows, + String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader, double scaleFactor) { + + return generateProcessDiagram(bpmnModel, imageType, highLightedActivities, highLightedFlows, + activityFontName, labelFontName, annotationFontName, customClassLoader, scaleFactor).generateBufferedImage(imageType); + } + + public BufferedImage generateImage(BpmnModel bpmnModel, String imageType, + List highLightedActivities, List highLightedFlows, double scaleFactor) { + + return generateImage(bpmnModel, imageType, highLightedActivities, highLightedFlows, null, null, null, null, scaleFactor); + } + + public BufferedImage generatePngImage(BpmnModel bpmnModel, double scaleFactor) { + return generateImage(bpmnModel, "png", Collections.emptyList(), Collections.emptyList(), scaleFactor); + } + + protected DefaultProcessDiagramCanvas generateProcessDiagram(BpmnModel bpmnModel, String imageType, + List highLightedActivities, List highLightedFlows, + String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader, double scaleFactor) { + + prepareBpmnModel(bpmnModel); + + DefaultProcessDiagramCanvas processDiagramCanvas = initProcessDiagramCanvas(bpmnModel, imageType, activityFontName, labelFontName, annotationFontName, customClassLoader); + + // Draw pool shape, if process is participant in collaboration + for (Pool pool : bpmnModel.getPools()) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(pool.getId()); + processDiagramCanvas.drawPoolOrLane(pool.getName(), graphicInfo); + } + + // Draw lanes + for (Process process : bpmnModel.getProcesses()) { + for (Lane lane : process.getLanes()) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(lane.getId()); + processDiagramCanvas.drawPoolOrLane(lane.getName(), graphicInfo); + } + } + + // Draw activities and their sequence-flows + for (Process process : bpmnModel.getProcesses()) { + for (FlowNode flowNode : process.findFlowElementsOfType(FlowNode.class)) { + drawActivity(processDiagramCanvas, bpmnModel, flowNode, highLightedActivities, highLightedFlows, scaleFactor); + } + } + + // Draw artifacts + for (Process process : bpmnModel.getProcesses()) { + + for (Artifact artifact : process.getArtifacts()) { + drawArtifact(processDiagramCanvas, bpmnModel, artifact); + } + + List subProcesses = process.findFlowElementsOfType(SubProcess.class, true); + if (subProcesses != null) { + for (SubProcess subProcess : subProcesses) { + for (Artifact subProcessArtifact : subProcess.getArtifacts()) { + drawArtifact(processDiagramCanvas, bpmnModel, subProcessArtifact); + } + } + } + } + + return processDiagramCanvas; + } + + protected DefaultProcessDiagramCanvas generateProcessDiagram(BpmnModel bpmnModel, String imageType, + List highLightedActivities, List highLightedFlows, + String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader, double scaleFactor, + List highCurrentLightedActivities) { + + prepareBpmnModel(bpmnModel); + + DefaultProcessDiagramCanvas processDiagramCanvas = initProcessDiagramCanvas(bpmnModel, imageType, activityFontName, labelFontName, annotationFontName, customClassLoader); + + // Draw pool shape, if process is participant in collaboration + for (Pool pool : bpmnModel.getPools()) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(pool.getId()); + processDiagramCanvas.drawPoolOrLane(pool.getName(), graphicInfo); + } + + // Draw lanes + for (Process process : bpmnModel.getProcesses()) { + for (Lane lane : process.getLanes()) { + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(lane.getId()); + processDiagramCanvas.drawPoolOrLane(lane.getName(), graphicInfo); + } + } + + // Draw activities and their sequence-flows + for (Process process : bpmnModel.getProcesses()) { + for (FlowNode flowNode : process.findFlowElementsOfType(FlowNode.class)) { + drawActivity(processDiagramCanvas, bpmnModel, flowNode, highLightedActivities, highLightedFlows, scaleFactor, highCurrentLightedActivities); + } + } + + // Draw artifacts + for (Process process : bpmnModel.getProcesses()) { + + for (Artifact artifact : process.getArtifacts()) { + drawArtifact(processDiagramCanvas, bpmnModel, artifact); + } + + List subProcesses = process.findFlowElementsOfType(SubProcess.class, true); + if (subProcesses != null) { + for (SubProcess subProcess : subProcesses) { + for (Artifact subProcessArtifact : subProcess.getArtifacts()) { + drawArtifact(processDiagramCanvas, bpmnModel, subProcessArtifact); + } + } + } + } + + return processDiagramCanvas; + } + + protected void prepareBpmnModel(BpmnModel bpmnModel) { + + // Need to make sure all elements have positive x and y. + // Check all graphicInfo and update the elements accordingly + + List allGraphicInfos = new ArrayList(); + if (bpmnModel.getLocationMap() != null) { + allGraphicInfos.addAll(bpmnModel.getLocationMap().values()); + } + if (bpmnModel.getLabelLocationMap() != null) { + allGraphicInfos.addAll(bpmnModel.getLabelLocationMap().values()); + } + if (bpmnModel.getFlowLocationMap() != null) { + for (List flowGraphicInfos : bpmnModel.getFlowLocationMap().values()) { + allGraphicInfos.addAll(flowGraphicInfos); + } + } + + if (allGraphicInfos.size() > 0) { + + boolean needsTranslationX = false; + boolean needsTranslationY = false; + + double lowestX = 0.0; + double lowestY = 0.0; + + // Collect lowest x and y + for (GraphicInfo graphicInfo : allGraphicInfos) { + + double x = graphicInfo.getX(); + double y = graphicInfo.getY(); + + if (x < lowestX) { + needsTranslationX = true; + lowestX = x; + } + if (y < lowestY) { + needsTranslationY = true; + lowestY = y; + } + + } + + // Update all graphicInfo objects + if (needsTranslationX || needsTranslationY) { + + double translationX = Math.abs(lowestX); + double translationY = Math.abs(lowestY); + + for (GraphicInfo graphicInfo : allGraphicInfos) { + if (needsTranslationX) { + graphicInfo.setX(graphicInfo.getX() + translationX); + } + if (needsTranslationY) { + graphicInfo.setY(graphicInfo.getY() + translationY); + } + } + } + + } + + } + + protected void drawActivity(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, + FlowNode flowNode, List highLightedActivities, List highLightedFlows, double scaleFactor) { + + ActivityDrawInstruction drawInstruction = activityDrawInstructions.get(flowNode.getClass()); + if (drawInstruction != null) { + + drawInstruction.draw(processDiagramCanvas, bpmnModel, flowNode); + + // Gather info on the multi instance marker + boolean multiInstanceSequential = false, multiInstanceParallel = false, collapsed = false; + if (flowNode instanceof Activity) { + Activity activity = (Activity) flowNode; + MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics = activity.getLoopCharacteristics(); + if (multiInstanceLoopCharacteristics != null) { + multiInstanceSequential = multiInstanceLoopCharacteristics.isSequential(); + multiInstanceParallel = !multiInstanceSequential; + } + } + + // Gather info on the collapsed marker + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); + if (flowNode instanceof SubProcess) { + collapsed = graphicInfo.getExpanded() != null && !graphicInfo.getExpanded(); + } else if (flowNode instanceof CallActivity) { + collapsed = true; + } + + if (scaleFactor == 1.0) { + // Actually draw the markers + processDiagramCanvas.drawActivityMarkers((int) graphicInfo.getX(), (int) graphicInfo.getY(), (int) graphicInfo.getWidth(), (int) graphicInfo.getHeight(), + multiInstanceSequential, multiInstanceParallel, collapsed); + } + + // Draw highlighted activities + if (highLightedActivities.contains(flowNode.getId())) { + drawHighLight(processDiagramCanvas, bpmnModel.getGraphicInfo(flowNode.getId())); + } + + } + + // Outgoing transitions of activity + for (SequenceFlow sequenceFlow : flowNode.getOutgoingFlows()) { + boolean highLighted = (highLightedFlows.contains(sequenceFlow.getId())); + String defaultFlow = null; + if (flowNode instanceof Activity) { + defaultFlow = ((Activity) flowNode).getDefaultFlow(); + } else if (flowNode instanceof Gateway) { + defaultFlow = ((Gateway) flowNode).getDefaultFlow(); + } + + boolean isDefault = false; + if (defaultFlow != null && defaultFlow.equalsIgnoreCase(sequenceFlow.getId())) { + isDefault = true; + } + boolean drawConditionalIndicator = sequenceFlow.getConditionExpression() != null && !(flowNode instanceof Gateway); + + String sourceRef = sequenceFlow.getSourceRef(); + String targetRef = sequenceFlow.getTargetRef(); + FlowElement sourceElement = bpmnModel.getFlowElement(sourceRef); + FlowElement targetElement = bpmnModel.getFlowElement(targetRef); + List graphicInfoList = bpmnModel.getFlowLocationGraphicInfo(sequenceFlow.getId()); + if (graphicInfoList != null && graphicInfoList.size() > 0) { + graphicInfoList = connectionPerfectionizer(processDiagramCanvas, bpmnModel, sourceElement, targetElement, graphicInfoList); + int xPoints[] = new int[graphicInfoList.size()]; + int yPoints[] = new int[graphicInfoList.size()]; + + for (int i = 1; i < graphicInfoList.size(); i++) { + GraphicInfo graphicInfo = graphicInfoList.get(i); + GraphicInfo previousGraphicInfo = graphicInfoList.get(i - 1); + + if (i == 1) { + xPoints[0] = (int) previousGraphicInfo.getX(); + yPoints[0] = (int) previousGraphicInfo.getY(); + } + xPoints[i] = (int) graphicInfo.getX(); + yPoints[i] = (int) graphicInfo.getY(); + + } + + processDiagramCanvas.drawSequenceflow(xPoints, yPoints, drawConditionalIndicator, isDefault, highLighted, scaleFactor); + + // Draw sequenceflow label + GraphicInfo labelGraphicInfo = bpmnModel.getLabelGraphicInfo(sequenceFlow.getId()); + if (labelGraphicInfo != null) { + processDiagramCanvas.drawLabel(sequenceFlow.getName(), labelGraphicInfo, false); + } else { + GraphicInfo lineCenter = getLineCenter(graphicInfoList); + processDiagramCanvas.drawLabel(sequenceFlow.getName(), lineCenter, false); + } + } + } + + // Nested elements + if (flowNode instanceof FlowElementsContainer) { + for (FlowElement nestedFlowElement : ((FlowElementsContainer) flowNode).getFlowElements()) { + if (nestedFlowElement instanceof FlowNode) { + drawActivity(processDiagramCanvas, bpmnModel, (FlowNode) nestedFlowElement, + highLightedActivities, highLightedFlows, scaleFactor); + } + } + } + } + + protected void drawActivity(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, + FlowNode flowNode, List highLightedActivities, List highLightedFlows, double scaleFactor, List highLightedExecutedActivities) { + + ActivityDrawInstruction drawInstruction = activityDrawInstructions.get(flowNode.getClass()); + if (drawInstruction != null) { + + drawInstruction.draw(processDiagramCanvas, bpmnModel, flowNode); + + // Gather info on the multi instance marker + boolean multiInstanceSequential = false, multiInstanceParallel = false, collapsed = false; + if (flowNode instanceof Activity) { + Activity activity = (Activity) flowNode; + MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics = activity.getLoopCharacteristics(); + if (multiInstanceLoopCharacteristics != null) { + multiInstanceSequential = multiInstanceLoopCharacteristics.isSequential(); + multiInstanceParallel = !multiInstanceSequential; + } + } + + // Gather info on the collapsed marker + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); + if (flowNode instanceof SubProcess) { + collapsed = graphicInfo.getExpanded() != null && !graphicInfo.getExpanded(); + } else if (flowNode instanceof CallActivity) { + collapsed = true; + } + + if (scaleFactor == 1.0) { + // Actually draw the markers + processDiagramCanvas.drawActivityMarkers((int) graphicInfo.getX(), (int) graphicInfo.getY(), (int) graphicInfo.getWidth(), (int) graphicInfo.getHeight(), + multiInstanceSequential, multiInstanceParallel, collapsed); + } + + // Draw highlighted activities + if (highLightedActivities.contains(flowNode.getId())) { + drawHighLight(processDiagramCanvas, bpmnModel.getGraphicInfo(flowNode.getId())); + } + + if (highLightedExecutedActivities.contains(flowNode.getId())) { + processDiagramCanvas.HIGHLIGHT_COLOR = Color.RED; + drawColorHighLight(processDiagramCanvas, bpmnModel.getGraphicInfo(flowNode.getId()), Color.RED); + processDiagramCanvas.HIGHLIGHT_COLOR = Color.GREEN; + } + + } + + // Outgoing transitions of activity + for (SequenceFlow sequenceFlow : flowNode.getOutgoingFlows()) { + boolean highLighted = (highLightedFlows.contains(sequenceFlow.getId())); + String defaultFlow = null; + if (flowNode instanceof Activity) { + defaultFlow = ((Activity) flowNode).getDefaultFlow(); + } else if (flowNode instanceof Gateway) { + defaultFlow = ((Gateway) flowNode).getDefaultFlow(); + } + + boolean isDefault = false; + if (defaultFlow != null && defaultFlow.equalsIgnoreCase(sequenceFlow.getId())) { + isDefault = true; + } + boolean drawConditionalIndicator = sequenceFlow.getConditionExpression() != null && !(flowNode instanceof Gateway); + + String sourceRef = sequenceFlow.getSourceRef(); + String targetRef = sequenceFlow.getTargetRef(); + FlowElement sourceElement = bpmnModel.getFlowElement(sourceRef); + FlowElement targetElement = bpmnModel.getFlowElement(targetRef); + List graphicInfoList = bpmnModel.getFlowLocationGraphicInfo(sequenceFlow.getId()); + if (graphicInfoList != null && graphicInfoList.size() > 0) { + graphicInfoList = connectionPerfectionizer(processDiagramCanvas, bpmnModel, sourceElement, targetElement, graphicInfoList); + int xPoints[] = new int[graphicInfoList.size()]; + int yPoints[] = new int[graphicInfoList.size()]; + + for (int i = 1; i < graphicInfoList.size(); i++) { + GraphicInfo graphicInfo = graphicInfoList.get(i); + GraphicInfo previousGraphicInfo = graphicInfoList.get(i - 1); + + if (i == 1) { + xPoints[0] = (int) previousGraphicInfo.getX(); + yPoints[0] = (int) previousGraphicInfo.getY(); + } + xPoints[i] = (int) graphicInfo.getX(); + yPoints[i] = (int) graphicInfo.getY(); + + } + + processDiagramCanvas.drawSequenceflow(xPoints, yPoints, drawConditionalIndicator, isDefault, highLighted, scaleFactor); + + // Draw sequenceflow label + GraphicInfo labelGraphicInfo = bpmnModel.getLabelGraphicInfo(sequenceFlow.getId()); + if (labelGraphicInfo != null) { + processDiagramCanvas.drawLabel(sequenceFlow.getName(), labelGraphicInfo, false); + } else { + GraphicInfo lineCenter = getLineCenter(graphicInfoList); + processDiagramCanvas.drawLabel(sequenceFlow.getName(), lineCenter, false); + } + } + } + + // Nested elements + if (flowNode instanceof FlowElementsContainer) { + for (FlowElement nestedFlowElement : ((FlowElementsContainer) flowNode).getFlowElements()) { + if (nestedFlowElement instanceof FlowNode) { + drawActivity(processDiagramCanvas, bpmnModel, (FlowNode) nestedFlowElement, + highLightedActivities, highLightedFlows, scaleFactor, highLightedExecutedActivities); + } + } + } + } + + protected void drawArtifact(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, Artifact artifact) { + ArtifactDrawInstruction drawInstruction = artifactDrawInstructions.get(artifact.getClass()); + if (drawInstruction != null) { + drawInstruction.draw(processDiagramCanvas, bpmnModel, artifact); + } + } + + public Map, ActivityDrawInstruction> getActivityDrawInstructions() { return activityDrawInstructions; } public void setActivityDrawInstructions( - Map, ActivityDrawInstruction> activityDrawInstructions) { + Map, ActivityDrawInstruction> activityDrawInstructions) { this.activityDrawInstructions = activityDrawInstructions; } @@ -1148,17 +1099,16 @@ public class DefaultProcessDiagramGenerator implements HMProcessDiagramGenerator } public void setArtifactDrawInstructions( - Map, ArtifactDrawInstruction> artifactDrawInstructions) { + Map, ArtifactDrawInstruction> artifactDrawInstructions) { this.artifactDrawInstructions = artifactDrawInstructions; } - protected interface ActivityDrawInstruction { - void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode); - } + void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode); + } - protected interface ArtifactDrawInstruction { - void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, Artifact artifact); - } + protected interface ArtifactDrawInstruction { + void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, Artifact artifact); + } } diff --git a/len-activiti/src/main/java/org/activiti/rest/ActivitiService.java b/len-activiti/src/main/java/org/activiti/rest/ActivitiService.java index 2c9cab0..5c9f399 100644 --- a/len-activiti/src/main/java/org/activiti/rest/ActivitiService.java +++ b/len-activiti/src/main/java/org/activiti/rest/ActivitiService.java @@ -36,170 +36,163 @@ import java.util.stream.Collectors; @Service public class ActivitiService { - @Autowired - RuntimeService runtimeService; - - @Autowired - TaskService taskService; - - @Autowired - IdentityService identityService; - - @Autowired - RepositoryService repositoryService; - - @Autowired - ProcessEngineFactoryBean processEngine; - - @Autowired - ProcessEngineConfiguration processEngineConfiguration; - - @Autowired - HistoryService historyService; - - static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-hh mm:ss"); - - /** - * 获取需要高亮的线 - * - * @param processDefinitionEntity - * @param historicActivityInstances - * @return - */ - private List getHighLightedFlows( - ProcessDefinitionEntity processDefinitionEntity, - List historicActivityInstances) { - - List highFlows = new ArrayList(); - - for (int i = 0; i < historicActivityInstances.size() - 1; i++) { - ActivityImpl activityImpl = processDefinitionEntity - .findActivity(historicActivityInstances.get(i) - .getActivityId()); - List sameStartTimeNodes = new ArrayList(); - ActivityImpl sameActivityImpl1 = processDefinitionEntity - .findActivity(historicActivityInstances.get(i + 1) - .getActivityId()); - sameStartTimeNodes.add(sameActivityImpl1); - - for (int j = i + 1; j < historicActivityInstances.size() - 1; j++) { - HistoricActivityInstance activityImpl1 = historicActivityInstances - .get(j); - HistoricActivityInstance activityImpl2 = historicActivityInstances - .get(j + 1); - - if (activityImpl1.getStartTime().equals( - activityImpl2.getStartTime())) { - - ActivityImpl sameActivityImpl2 = processDefinitionEntity - .findActivity(activityImpl2.getActivityId()); - sameStartTimeNodes.add(sameActivityImpl2); - - } else { - break; - } - } - List pvmTransitions = activityImpl - .getOutgoingTransitions(); - for (PvmTransition pvmTransition : pvmTransitions) { - ActivityImpl pvmActivityImpl = (ActivityImpl) pvmTransition - .getDestination(); - if (sameStartTimeNodes.contains(pvmActivityImpl)) { - Map properties = pvmActivityImpl.getProperties(); - System.out.println(properties); - highFlows.add(pvmTransition.getId()); - } - } - } - return highFlows; - } - - public List getTaskSqu(String processInstanceId) { - List list = historyService.createHistoricTaskInstanceQuery().processInstanceId(processInstanceId) - .list(); - List activitiProcesses = new ArrayList<>(); - - list.forEach(s -> { - String assignee = s.getAssignee(); - ActivitiProcess activitiProcess = new ActivitiProcess(); - //组 - List historicIdentityLinksForTask = historyService.getHistoricIdentityLinksForTask(s.getId()); - List groupName = new ArrayList<>(); - historicIdentityLinksForTask.forEach(hist -> { - if(!StringUtils.isEmpty(hist.getGroupId())){ - List groupList = identityService.createGroupQuery().groupId(hist.getGroupId()).list(); - if (groupList.size() > 0) { - List groupNames = groupList.stream().map(Group::getName).collect(Collectors.toList()); - groupName.addAll(groupNames); - } - } - }); - activitiProcess.setGroupNames(groupName); - if (!StringUtils.isEmpty(assignee)) { - activitiProcess.setUserId(assignee); - User user = identityService.createUserQuery().userId(assignee).singleResult(); - if(user!=null){ - activitiProcess.setUserName(user.getFirstName()); - } - activitiProcess.setSid(s.getTaskDefinitionKey()); - } - - activitiProcess.setTaskName(s.getName()); - if(s.getEndTime()!=null){ - activitiProcess.setTime(simpleDateFormat.format(s.getEndTime())); - } - activitiProcesses.add(activitiProcess); - }); - return activitiProcesses; - } - - public InputStream generateStream(String processInstanceId, boolean needCurrent) { - ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); - HistoricProcessInstance historicProcessInstance = - historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); - String processDefinitionId = null; - List executedActivityIdList = new ArrayList(); - List currentActivityIdList = new ArrayList<>(); - List historicActivityInstanceList = new ArrayList<>(); - if (processInstance != null) { - processDefinitionId = processInstance.getProcessDefinitionId(); - if (needCurrent) { - currentActivityIdList = this.runtimeService.getActiveActivityIds(processInstance.getId()); - } - } - if (historicProcessInstance != null) { - processDefinitionId = historicProcessInstance.getProcessDefinitionId(); - historicActivityInstanceList = - historyService.createHistoricActivityInstanceQuery().finished().processInstanceId(processInstanceId).orderByHistoricActivityInstanceId().asc().list(); - for (HistoricActivityInstance activityInstance : historicActivityInstanceList) { - executedActivityIdList.add(activityInstance.getActivityId()); - } - } - - if (StringUtils.isEmpty(processDefinitionId) || executedActivityIdList.isEmpty()) { - return null; - } - - - //高亮线路id集合 - ProcessDefinitionEntity definitionEntity = (ProcessDefinitionEntity) repositoryService.getProcessDefinition(processDefinitionId); - List highLightedFlows = getHighLightedFlows(definitionEntity, historicActivityInstanceList); - - BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId); - //List activeActivityIds = runtimeService.getActiveActivityIds(processInstanceId); - processEngineConfiguration = processEngine.getProcessEngineConfiguration(); - Context.setProcessEngineConfiguration((ProcessEngineConfigurationImpl) processEngineConfiguration); - HMProcessDiagramGenerator diagramGenerator = (HMProcessDiagramGenerator) processEngineConfiguration.getProcessDiagramGenerator(); - //List activeIds = this.runtimeService.getActiveActivityIds(processInstance.getId()); - - InputStream imageStream = diagramGenerator.generateDiagram( - bpmnModel, "png", - executedActivityIdList, highLightedFlows, - processEngine.getProcessEngineConfiguration().getActivityFontName(), - processEngine.getProcessEngineConfiguration().getLabelFontName(), - "宋体", - null, 1.0, currentActivityIdList); - - return imageStream; - } + static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-hh mm:ss"); + @Autowired + RuntimeService runtimeService; + @Autowired + TaskService taskService; + @Autowired + IdentityService identityService; + @Autowired + RepositoryService repositoryService; + @Autowired + ProcessEngineFactoryBean processEngine; + @Autowired + ProcessEngineConfiguration processEngineConfiguration; + @Autowired + HistoryService historyService; + + /** + * 获取需要高亮的线 + * + * @param processDefinitionEntity + * @param historicActivityInstances + * @return + */ + private List getHighLightedFlows( + ProcessDefinitionEntity processDefinitionEntity, + List historicActivityInstances) { + + List highFlows = new ArrayList(); + + for (int i = 0; i < historicActivityInstances.size() - 1; i++) { + ActivityImpl activityImpl = processDefinitionEntity + .findActivity(historicActivityInstances.get(i) + .getActivityId()); + List sameStartTimeNodes = new ArrayList(); + ActivityImpl sameActivityImpl1 = processDefinitionEntity + .findActivity(historicActivityInstances.get(i + 1) + .getActivityId()); + sameStartTimeNodes.add(sameActivityImpl1); + + for (int j = i + 1; j < historicActivityInstances.size() - 1; j++) { + HistoricActivityInstance activityImpl1 = historicActivityInstances + .get(j); + HistoricActivityInstance activityImpl2 = historicActivityInstances + .get(j + 1); + + if (activityImpl1.getStartTime().equals( + activityImpl2.getStartTime())) { + + ActivityImpl sameActivityImpl2 = processDefinitionEntity + .findActivity(activityImpl2.getActivityId()); + sameStartTimeNodes.add(sameActivityImpl2); + + } else { + break; + } + } + List pvmTransitions = activityImpl + .getOutgoingTransitions(); + for (PvmTransition pvmTransition : pvmTransitions) { + ActivityImpl pvmActivityImpl = (ActivityImpl) pvmTransition + .getDestination(); + if (sameStartTimeNodes.contains(pvmActivityImpl)) { + Map properties = pvmActivityImpl.getProperties(); + System.out.println(properties); + highFlows.add(pvmTransition.getId()); + } + } + } + return highFlows; + } + + public List getTaskSqu(String processInstanceId) { + List list = historyService.createHistoricTaskInstanceQuery().processInstanceId(processInstanceId) + .list(); + List activitiProcesses = new ArrayList<>(); + + list.forEach(s -> { + String assignee = s.getAssignee(); + ActivitiProcess activitiProcess = new ActivitiProcess(); + //组 + List historicIdentityLinksForTask = historyService.getHistoricIdentityLinksForTask(s.getId()); + List groupName = new ArrayList<>(); + historicIdentityLinksForTask.forEach(hist -> { + if (!StringUtils.isEmpty(hist.getGroupId())) { + List groupList = identityService.createGroupQuery().groupId(hist.getGroupId()).list(); + if (groupList.size() > 0) { + List groupNames = groupList.stream().map(Group::getName).collect(Collectors.toList()); + groupName.addAll(groupNames); + } + } + }); + activitiProcess.setGroupNames(groupName); + if (!StringUtils.isEmpty(assignee)) { + activitiProcess.setUserId(assignee); + User user = identityService.createUserQuery().userId(assignee).singleResult(); + if (user != null) { + activitiProcess.setUserName(user.getFirstName()); + } + activitiProcess.setSid(s.getTaskDefinitionKey()); + } + + activitiProcess.setTaskName(s.getName()); + if (s.getEndTime() != null) { + activitiProcess.setTime(simpleDateFormat.format(s.getEndTime())); + } + activitiProcesses.add(activitiProcess); + }); + return activitiProcesses; + } + + public InputStream generateStream(String processInstanceId, boolean needCurrent) { + ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); + HistoricProcessInstance historicProcessInstance = + historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); + String processDefinitionId = null; + List executedActivityIdList = new ArrayList(); + List currentActivityIdList = new ArrayList<>(); + List historicActivityInstanceList = new ArrayList<>(); + if (processInstance != null) { + processDefinitionId = processInstance.getProcessDefinitionId(); + if (needCurrent) { + currentActivityIdList = this.runtimeService.getActiveActivityIds(processInstance.getId()); + } + } + if (historicProcessInstance != null) { + processDefinitionId = historicProcessInstance.getProcessDefinitionId(); + historicActivityInstanceList = + historyService.createHistoricActivityInstanceQuery().finished().processInstanceId(processInstanceId).orderByHistoricActivityInstanceId().asc().list(); + for (HistoricActivityInstance activityInstance : historicActivityInstanceList) { + executedActivityIdList.add(activityInstance.getActivityId()); + } + } + + if (StringUtils.isEmpty(processDefinitionId) || executedActivityIdList.isEmpty()) { + return null; + } + + + //高亮线路id集合 + ProcessDefinitionEntity definitionEntity = (ProcessDefinitionEntity) repositoryService.getProcessDefinition(processDefinitionId); + List highLightedFlows = getHighLightedFlows(definitionEntity, historicActivityInstanceList); + + BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId); + //List activeActivityIds = runtimeService.getActiveActivityIds(processInstanceId); + processEngineConfiguration = processEngine.getProcessEngineConfiguration(); + Context.setProcessEngineConfiguration((ProcessEngineConfigurationImpl) processEngineConfiguration); + HMProcessDiagramGenerator diagramGenerator = (HMProcessDiagramGenerator) processEngineConfiguration.getProcessDiagramGenerator(); + //List activeIds = this.runtimeService.getActiveActivityIds(processInstance.getId()); + + InputStream imageStream = diagramGenerator.generateDiagram( + bpmnModel, "png", + executedActivityIdList, highLightedFlows, + processEngine.getProcessEngineConfiguration().getActivityFontName(), + processEngine.getProcessEngineConfiguration().getLabelFontName(), + "宋体", + null, 1.0, currentActivityIdList); + + return imageStream; + } } diff --git a/len-activiti/src/main/java/org/activiti/rest/diagram/services/BaseProcessDefinitionDiagramLayoutResource.java b/len-activiti/src/main/java/org/activiti/rest/diagram/services/BaseProcessDefinitionDiagramLayoutResource.java index 9aa28a3..6172c35 100644 --- a/len-activiti/src/main/java/org/activiti/rest/diagram/services/BaseProcessDefinitionDiagramLayoutResource.java +++ b/len-activiti/src/main/java/org/activiti/rest/diagram/services/BaseProcessDefinitionDiagramLayoutResource.java @@ -1,502 +1,491 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.activiti.rest.diagram.services; - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.ObjectNode; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import org.activiti.engine.ActivitiException; -import org.activiti.engine.ActivitiObjectNotFoundException; -import org.activiti.engine.HistoryService; -import org.activiti.engine.RepositoryService; -import org.activiti.engine.RuntimeService; -import org.activiti.engine.history.HistoricActivityInstance; -import org.activiti.engine.impl.bpmn.behavior.BoundaryEventActivityBehavior; -import org.activiti.engine.impl.bpmn.behavior.CallActivityBehavior; -import org.activiti.engine.impl.bpmn.parser.BpmnParse; -import org.activiti.engine.impl.bpmn.parser.ErrorEventDefinition; -import org.activiti.engine.impl.bpmn.parser.EventSubscriptionDeclaration; -import org.activiti.engine.impl.jobexecutor.TimerDeclarationImpl; -import org.activiti.engine.impl.persistence.entity.ExecutionEntity; -import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity; -import org.activiti.engine.impl.pvm.PvmTransition; -import org.activiti.engine.impl.pvm.delegate.ActivityBehavior; -import org.activiti.engine.impl.pvm.process.ActivityImpl; -import org.activiti.engine.impl.pvm.process.Lane; -import org.activiti.engine.impl.pvm.process.LaneSet; -import org.activiti.engine.impl.pvm.process.ParticipantProcess; -import org.activiti.engine.impl.pvm.process.TransitionImpl; -import org.activiti.engine.repository.ProcessDefinition; -import org.activiti.engine.runtime.Execution; -import org.activiti.engine.runtime.ProcessInstance; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; - -public class BaseProcessDefinitionDiagramLayoutResource { - - @Autowired - private RuntimeService runtimeService; - - @Autowired - private RepositoryService repositoryService; - - @Autowired - private HistoryService historyService; - - public ObjectNode getDiagramNode(String processInstanceId, String processDefinitionId) { - - List highLightedFlows = Collections. emptyList(); - List highLightedActivities = Collections. emptyList(); - - Map subProcessInstanceMap = new HashMap(); - - ProcessInstance processInstance = null; - if (processInstanceId != null) { - processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); - if (processInstance == null) { - throw new ActivitiObjectNotFoundException("Process instance could not be found"); - } - processDefinitionId = processInstance.getProcessDefinitionId(); - - List subProcessInstances = runtimeService - .createProcessInstanceQuery() - .superProcessInstanceId(processInstanceId).list(); - - for (ProcessInstance subProcessInstance : subProcessInstances) { - String subDefId = subProcessInstance.getProcessDefinitionId(); - - String superExecutionId = ((ExecutionEntity) subProcessInstance) - .getSuperExecutionId(); - ProcessDefinitionEntity subDef = (ProcessDefinitionEntity) repositoryService.getProcessDefinition(subDefId); - - ObjectNode processInstanceJSON = new ObjectMapper().createObjectNode(); - processInstanceJSON.put("processInstanceId", subProcessInstance.getId()); - processInstanceJSON.put("superExecutionId", superExecutionId); - processInstanceJSON.put("processDefinitionId", subDef.getId()); - processInstanceJSON.put("processDefinitionKey", subDef.getKey()); - processInstanceJSON.put("processDefinitionName", subDef.getName()); - - subProcessInstanceMap.put(superExecutionId, processInstanceJSON); - } - } - - if (processDefinitionId == null) { - throw new ActivitiObjectNotFoundException("No process definition id provided"); - } - - ProcessDefinitionEntity processDefinition = (ProcessDefinitionEntity) repositoryService.getProcessDefinition(processDefinitionId); - - if (processDefinition == null) { - throw new ActivitiException("Process definition " + processDefinitionId + " could not be found"); - } - - ObjectNode responseJSON = new ObjectMapper().createObjectNode(); - - // Process definition - JsonNode pdrJSON = getProcessDefinitionResponse(processDefinition); - - if (pdrJSON != null) { - responseJSON.set("processDefinition", pdrJSON); - } - - // Highlighted activities - if (processInstance != null) { - ArrayNode activityArray = new ObjectMapper().createArrayNode(); - ArrayNode flowsArray = new ObjectMapper().createArrayNode(); - - highLightedActivities = runtimeService.getActiveActivityIds(processInstanceId); - highLightedFlows = getHighLightedFlows(processInstanceId, processDefinition); - - for (String activityName : highLightedActivities) { - activityArray.add(activityName); - } - - for (String flow : highLightedFlows) - flowsArray.add(flow); - - responseJSON.set("highLightedActivities", activityArray); - responseJSON.set("highLightedFlows", flowsArray); - } - - // Pool shape, if process is participant in collaboration - if (processDefinition.getParticipantProcess() != null) { - ParticipantProcess pProc = processDefinition.getParticipantProcess(); - - ObjectNode participantProcessJSON = new ObjectMapper().createObjectNode(); - participantProcessJSON.put("id", pProc.getId()); - if (StringUtils.isNotEmpty(pProc.getName())) { - participantProcessJSON.put("name", pProc.getName()); - } else { - participantProcessJSON.put("name", ""); - } - participantProcessJSON.put("x", pProc.getX()); - participantProcessJSON.put("y", pProc.getY()); - participantProcessJSON.put("width", pProc.getWidth()); - participantProcessJSON.put("height", pProc.getHeight()); - - responseJSON.set("participantProcess", participantProcessJSON); - } - - // Draw lanes - - if (processDefinition.getLaneSets() != null && !processDefinition.getLaneSets().isEmpty()) { - ArrayNode laneSetArray = new ObjectMapper().createArrayNode(); - for (LaneSet laneSet : processDefinition.getLaneSets()) { - ArrayNode laneArray = new ObjectMapper().createArrayNode(); - if (laneSet.getLanes() != null && !laneSet.getLanes().isEmpty()) { - for (Lane lane : laneSet.getLanes()) { - ObjectNode laneJSON = new ObjectMapper().createObjectNode(); - laneJSON.put("id", lane.getId()); - if (StringUtils.isNotEmpty(lane.getName())) { - laneJSON.put("name", lane.getName()); - } else { - laneJSON.put("name", ""); - } - laneJSON.put("x", lane.getX()); - laneJSON.put("y", lane.getY()); - laneJSON.put("width", lane.getWidth()); - laneJSON.put("height", lane.getHeight()); - - List flowNodeIds = lane.getFlowNodeIds(); - ArrayNode flowNodeIdsArray = new ObjectMapper().createArrayNode(); - for (String flowNodeId : flowNodeIds) { - flowNodeIdsArray.add(flowNodeId); - } - laneJSON.set("flowNodeIds", flowNodeIdsArray); - - laneArray.add(laneJSON); - } - } - ObjectNode laneSetJSON = new ObjectMapper().createObjectNode(); - laneSetJSON.put("id", laneSet.getId()); - if (StringUtils.isNotEmpty(laneSet.getName())) { - laneSetJSON.put("name", laneSet.getName()); - } else { - laneSetJSON.put("name", ""); - } - laneSetJSON.set("lanes", laneArray); - - laneSetArray.add(laneSetJSON); - } - - if (laneSetArray.size() > 0) - responseJSON.set("laneSets", laneSetArray); - } - - ArrayNode sequenceFlowArray = new ObjectMapper().createArrayNode(); - ArrayNode activityArray = new ObjectMapper().createArrayNode(); - - // Activities and their sequence-flows - - for (ActivityImpl activity : processDefinition.getActivities()) { - getActivity(processInstanceId, activity, activityArray, sequenceFlowArray, - processInstance, highLightedFlows, subProcessInstanceMap); - } - - responseJSON.set("activities", activityArray); - responseJSON.set("sequenceFlows", sequenceFlowArray); - - return responseJSON; - } - - private List getHighLightedFlows(String processInstanceId, ProcessDefinitionEntity processDefinition) { - - List highLightedFlows = new ArrayList(); - List historicActivityInstances = historyService - .createHistoricActivityInstanceQuery() - .processInstanceId(processInstanceId) - .orderByHistoricActivityInstanceStartTime().asc().list(); - - List historicActivityInstanceList = new ArrayList(); - for (HistoricActivityInstance hai : historicActivityInstances) { - historicActivityInstanceList.add(hai.getActivityId()); - } - - // add current activities to list - List highLightedActivities = runtimeService.getActiveActivityIds(processInstanceId); - historicActivityInstanceList.addAll(highLightedActivities); - - // activities and their sequence-flows - for (ActivityImpl activity : processDefinition.getActivities()) { - int index = historicActivityInstanceList.indexOf(activity.getId()); - - if (index >= 0 && index + 1 < historicActivityInstanceList.size()) { - List pvmTransitionList = activity - .getOutgoingTransitions(); - for (PvmTransition pvmTransition : pvmTransitionList) { - String destinationFlowId = pvmTransition.getDestination().getId(); - if (destinationFlowId.equals(historicActivityInstanceList.get(index + 1))) { - highLightedFlows.add(pvmTransition.getId()); - } - } - } - } - return highLightedFlows; - } - - private void getActivity(String processInstanceId, ActivityImpl activity, ArrayNode activityArray, - ArrayNode sequenceFlowArray, ProcessInstance processInstance, List highLightedFlows, - Map subProcessInstanceMap) { - - ObjectNode activityJSON = new ObjectMapper().createObjectNode(); - - // Gather info on the multi instance marker - String multiInstance = (String) activity.getProperty("multiInstance"); - if (multiInstance != null) { - if (!"sequential".equals(multiInstance)) { - multiInstance = "parallel"; - } - } - - ActivityBehavior activityBehavior = activity.getActivityBehavior(); - // Gather info on the collapsed marker - Boolean collapsed = (activityBehavior instanceof CallActivityBehavior); - Boolean expanded = (Boolean) activity.getProperty(BpmnParse.PROPERTYNAME_ISEXPANDED); - if (expanded != null) { - collapsed = !expanded; - } - - Boolean isInterrupting = null; - if (activityBehavior instanceof BoundaryEventActivityBehavior) { - isInterrupting = ((BoundaryEventActivityBehavior) activityBehavior).isInterrupting(); - } - - // Outgoing transitions of activity - for (PvmTransition sequenceFlow : activity.getOutgoingTransitions()) { - String flowName = (String) sequenceFlow.getProperty("name"); - boolean isHighLighted = (highLightedFlows.contains(sequenceFlow.getId())); - boolean isConditional = sequenceFlow.getProperty(BpmnParse.PROPERTYNAME_CONDITION) != null && - !((String) activity.getProperty("type")).toLowerCase().contains("gateway"); - boolean isDefault = sequenceFlow.getId().equals(activity.getProperty("default")) - && ((String) activity.getProperty("type")).toLowerCase().contains("gateway"); - - List waypoints = ((TransitionImpl) sequenceFlow).getWaypoints(); - ArrayNode xPointArray = new ObjectMapper().createArrayNode(); - ArrayNode yPointArray = new ObjectMapper().createArrayNode(); - for (int i = 0; i < waypoints.size(); i += 2) { // waypoints.size() - // minimally 4: x1, y1, - // x2, y2 - xPointArray.add(waypoints.get(i)); - yPointArray.add(waypoints.get(i + 1)); - } - - ObjectNode flowJSON = new ObjectMapper().createObjectNode(); - flowJSON.put("id", sequenceFlow.getId()); - flowJSON.put("name", flowName); - flowJSON.put("flow", "(" + sequenceFlow.getSource().getId() + ")--" - + sequenceFlow.getId() + "-->(" - + sequenceFlow.getDestination().getId() + ")"); - - if (isConditional) - flowJSON.put("isConditional", isConditional); - if (isDefault) - flowJSON.put("isDefault", isDefault); - if (isHighLighted) - flowJSON.put("isHighLighted", isHighLighted); - - flowJSON.set("xPointArray", xPointArray); - flowJSON.set("yPointArray", yPointArray); - - sequenceFlowArray.add(flowJSON); - } - - // Nested activities (boundary events) - ArrayNode nestedActivityArray = new ObjectMapper().createArrayNode(); - for (ActivityImpl nestedActivity : activity.getActivities()) { - nestedActivityArray.add(nestedActivity.getId()); - } - - Map properties = activity.getProperties(); - ObjectNode propertiesJSON = new ObjectMapper().createObjectNode(); - for (String key : properties.keySet()) { - Object prop = properties.get(key); - if (prop instanceof String) - propertiesJSON.put(key, (String) properties.get(key)); - else if (prop instanceof Integer) - propertiesJSON.put(key, (Integer) properties.get(key)); - else if (prop instanceof Boolean) - propertiesJSON.put(key, (Boolean) properties.get(key)); - else if ("initial".equals(key)) { - ActivityImpl act = (ActivityImpl) properties.get(key); - propertiesJSON.put(key, act.getId()); - } else if ("timerDeclarations".equals(key)) { - ArrayList timerDeclarations = (ArrayList) properties.get(key); - ArrayNode timerDeclarationArray = new ObjectMapper().createArrayNode(); - - if (timerDeclarations != null) - for (TimerDeclarationImpl timerDeclaration : timerDeclarations) { - ObjectNode timerDeclarationJSON = new ObjectMapper().createObjectNode(); - - timerDeclarationJSON.put("isExclusive", timerDeclaration.isExclusive()); - if (timerDeclaration.getRepeat() != null) - timerDeclarationJSON.put("repeat", timerDeclaration.getRepeat()); - - timerDeclarationJSON.put("retries", String.valueOf(timerDeclaration.getRetries())); - timerDeclarationJSON.put("type", timerDeclaration.getJobHandlerType()); - timerDeclarationJSON.put("configuration", timerDeclaration.getJobHandlerConfiguration()); - //timerDeclarationJSON.put("expression", timerDeclaration.getDescription()); - - timerDeclarationArray.add(timerDeclarationJSON); - } - if (timerDeclarationArray.size() > 0) - propertiesJSON.set(key, timerDeclarationArray); - // TODO: implement getting description - } else if ("eventDefinitions".equals(key)) { - ArrayList eventDefinitions = (ArrayList) properties.get(key); - ArrayNode eventDefinitionsArray = new ObjectMapper().createArrayNode(); - - if (eventDefinitions != null) { - for (EventSubscriptionDeclaration eventDefinition : eventDefinitions) { - ObjectNode eventDefinitionJSON = new ObjectMapper().createObjectNode(); - - if (eventDefinition.getActivityId() != null) - eventDefinitionJSON.put("activityId",eventDefinition.getActivityId()); - - eventDefinitionJSON.put("eventName", eventDefinition.getEventName()); - eventDefinitionJSON.put("eventType", eventDefinition.getEventType()); - eventDefinitionJSON.put("isAsync", eventDefinition.isAsync()); - eventDefinitionJSON.put("isStartEvent", eventDefinition.isStartEvent()); - eventDefinitionsArray.add(eventDefinitionJSON); - } - } - - if (eventDefinitionsArray.size() > 0) - propertiesJSON.set(key, eventDefinitionsArray); - - // TODO: implement it - } else if ("errorEventDefinitions".equals(key)) { - ArrayList errorEventDefinitions = (ArrayList) properties.get(key); - ArrayNode errorEventDefinitionsArray = new ObjectMapper().createArrayNode(); - - if (errorEventDefinitions != null) { - for (ErrorEventDefinition errorEventDefinition : errorEventDefinitions) { - ObjectNode errorEventDefinitionJSON = new ObjectMapper().createObjectNode(); - - if (errorEventDefinition.getErrorCode() != null) - errorEventDefinitionJSON.put("errorCode", errorEventDefinition.getErrorCode()); - else - errorEventDefinitionJSON.putNull("errorCode"); - - errorEventDefinitionJSON.put("handlerActivityId", - errorEventDefinition.getHandlerActivityId()); - - errorEventDefinitionsArray.add(errorEventDefinitionJSON); - } - } - - if (errorEventDefinitionsArray.size() > 0) - propertiesJSON.set(key, errorEventDefinitionsArray); - } - - } - - if ("callActivity".equals(properties.get("type"))) { - CallActivityBehavior callActivityBehavior = null; - - if (activityBehavior instanceof CallActivityBehavior) { - callActivityBehavior = (CallActivityBehavior) activityBehavior; - } - - if (callActivityBehavior != null) { - propertiesJSON.put("processDefinitonKey", callActivityBehavior.getProcessDefinitonKey()); - - // get processDefinitonId from execution or get last processDefinitonId - // by key - ArrayNode processInstanceArray = new ObjectMapper().createArrayNode(); - if (processInstance != null) { - List executionList = runtimeService.createExecutionQuery() - .processInstanceId(processInstanceId) - .activityId(activity.getId()).list(); - if (!executionList.isEmpty()) { - for (Execution execution : executionList) { - ObjectNode processInstanceJSON = subProcessInstanceMap.get(execution.getId()); - processInstanceArray.add(processInstanceJSON); - } - } - } - - // If active activities nas no instance of this callActivity then add - // last definition - if (processInstanceArray.size() == 0 && StringUtils.isNotEmpty(callActivityBehavior.getProcessDefinitonKey())) { - // Get last definition by key - ProcessDefinition lastProcessDefinition = repositoryService - .createProcessDefinitionQuery() - .processDefinitionKey(callActivityBehavior.getProcessDefinitonKey()) - .latestVersion().singleResult(); - - // TODO: unuseful fields there are processDefinitionName, processDefinitionKey - if (lastProcessDefinition != null) { - ObjectNode processInstanceJSON = new ObjectMapper().createObjectNode(); - processInstanceJSON.put("processDefinitionId", lastProcessDefinition.getId()); - processInstanceJSON.put("processDefinitionKey", lastProcessDefinition.getKey()); - processInstanceJSON.put("processDefinitionName", lastProcessDefinition.getName()); - processInstanceArray.add(processInstanceJSON); - } - } - - if (processInstanceArray.size() > 0) { - propertiesJSON.set("processDefinitons", processInstanceArray); - } - } - } - - activityJSON.put("activityId", activity.getId()); - activityJSON.set("properties", propertiesJSON); - if (multiInstance != null) - activityJSON.put("multiInstance", multiInstance); - if (collapsed) - activityJSON.put("collapsed", collapsed); - if (nestedActivityArray.size() > 0) - activityJSON.set("nestedActivities", nestedActivityArray); - if (isInterrupting != null) - activityJSON.put("isInterrupting", isInterrupting); - - activityJSON.put("x", activity.getX()); - activityJSON.put("y", activity.getY()); - activityJSON.put("width", activity.getWidth()); - activityJSON.put("height", activity.getHeight()); - - activityArray.add(activityJSON); - - // Nested activities (boundary events) - for (ActivityImpl nestedActivity : activity.getActivities()) { - getActivity(processInstanceId, nestedActivity, activityArray, sequenceFlowArray, - processInstance, highLightedFlows, subProcessInstanceMap); - } - } - - private JsonNode getProcessDefinitionResponse(ProcessDefinitionEntity processDefinition) { - ObjectMapper mapper = new ObjectMapper(); - ObjectNode pdrJSON = mapper.createObjectNode(); - pdrJSON.put("id", processDefinition.getId()); - pdrJSON.put("name", processDefinition.getName()); - pdrJSON.put("key", processDefinition.getKey()); - pdrJSON.put("version", processDefinition.getVersion()); - pdrJSON.put("deploymentId", processDefinition.getDeploymentId()); - pdrJSON.put("isGraphicNotationDefined", isGraphicNotationDefined(processDefinition)); - return pdrJSON; - } - - private boolean isGraphicNotationDefined(ProcessDefinitionEntity processDefinition) { - return ((ProcessDefinitionEntity) repositoryService - .getProcessDefinition(processDefinition.getId())) - .isGraphicalNotationDefined(); - } -} +/* Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.activiti.rest.diagram.services; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; +import org.activiti.engine.*; +import org.activiti.engine.history.HistoricActivityInstance; +import org.activiti.engine.impl.bpmn.behavior.BoundaryEventActivityBehavior; +import org.activiti.engine.impl.bpmn.behavior.CallActivityBehavior; +import org.activiti.engine.impl.bpmn.parser.BpmnParse; +import org.activiti.engine.impl.bpmn.parser.ErrorEventDefinition; +import org.activiti.engine.impl.bpmn.parser.EventSubscriptionDeclaration; +import org.activiti.engine.impl.jobexecutor.TimerDeclarationImpl; +import org.activiti.engine.impl.persistence.entity.ExecutionEntity; +import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity; +import org.activiti.engine.impl.pvm.PvmTransition; +import org.activiti.engine.impl.pvm.delegate.ActivityBehavior; +import org.activiti.engine.impl.pvm.process.*; +import org.activiti.engine.repository.ProcessDefinition; +import org.activiti.engine.runtime.Execution; +import org.activiti.engine.runtime.ProcessInstance; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.*; + +public class BaseProcessDefinitionDiagramLayoutResource { + + @Autowired + private RuntimeService runtimeService; + + @Autowired + private RepositoryService repositoryService; + + @Autowired + private HistoryService historyService; + + public ObjectNode getDiagramNode(String processInstanceId, String processDefinitionId) { + + List highLightedFlows = Collections.emptyList(); + List highLightedActivities = Collections.emptyList(); + + Map subProcessInstanceMap = new HashMap(); + + ProcessInstance processInstance = null; + if (processInstanceId != null) { + processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); + if (processInstance == null) { + throw new ActivitiObjectNotFoundException("Process instance could not be found"); + } + processDefinitionId = processInstance.getProcessDefinitionId(); + + List subProcessInstances = runtimeService + .createProcessInstanceQuery() + .superProcessInstanceId(processInstanceId).list(); + + for (ProcessInstance subProcessInstance : subProcessInstances) { + String subDefId = subProcessInstance.getProcessDefinitionId(); + + String superExecutionId = ((ExecutionEntity) subProcessInstance) + .getSuperExecutionId(); + ProcessDefinitionEntity subDef = (ProcessDefinitionEntity) repositoryService.getProcessDefinition(subDefId); + + ObjectNode processInstanceJSON = new ObjectMapper().createObjectNode(); + processInstanceJSON.put("processInstanceId", subProcessInstance.getId()); + processInstanceJSON.put("superExecutionId", superExecutionId); + processInstanceJSON.put("processDefinitionId", subDef.getId()); + processInstanceJSON.put("processDefinitionKey", subDef.getKey()); + processInstanceJSON.put("processDefinitionName", subDef.getName()); + + subProcessInstanceMap.put(superExecutionId, processInstanceJSON); + } + } + + if (processDefinitionId == null) { + throw new ActivitiObjectNotFoundException("No process definition id provided"); + } + + ProcessDefinitionEntity processDefinition = (ProcessDefinitionEntity) repositoryService.getProcessDefinition(processDefinitionId); + + if (processDefinition == null) { + throw new ActivitiException("Process definition " + processDefinitionId + " could not be found"); + } + + ObjectNode responseJSON = new ObjectMapper().createObjectNode(); + + // Process definition + JsonNode pdrJSON = getProcessDefinitionResponse(processDefinition); + + if (pdrJSON != null) { + responseJSON.set("processDefinition", pdrJSON); + } + + // Highlighted activities + if (processInstance != null) { + ArrayNode activityArray = new ObjectMapper().createArrayNode(); + ArrayNode flowsArray = new ObjectMapper().createArrayNode(); + + highLightedActivities = runtimeService.getActiveActivityIds(processInstanceId); + highLightedFlows = getHighLightedFlows(processInstanceId, processDefinition); + + for (String activityName : highLightedActivities) { + activityArray.add(activityName); + } + + for (String flow : highLightedFlows) + flowsArray.add(flow); + + responseJSON.set("highLightedActivities", activityArray); + responseJSON.set("highLightedFlows", flowsArray); + } + + // Pool shape, if process is participant in collaboration + if (processDefinition.getParticipantProcess() != null) { + ParticipantProcess pProc = processDefinition.getParticipantProcess(); + + ObjectNode participantProcessJSON = new ObjectMapper().createObjectNode(); + participantProcessJSON.put("id", pProc.getId()); + if (StringUtils.isNotEmpty(pProc.getName())) { + participantProcessJSON.put("name", pProc.getName()); + } else { + participantProcessJSON.put("name", ""); + } + participantProcessJSON.put("x", pProc.getX()); + participantProcessJSON.put("y", pProc.getY()); + participantProcessJSON.put("width", pProc.getWidth()); + participantProcessJSON.put("height", pProc.getHeight()); + + responseJSON.set("participantProcess", participantProcessJSON); + } + + // Draw lanes + + if (processDefinition.getLaneSets() != null && !processDefinition.getLaneSets().isEmpty()) { + ArrayNode laneSetArray = new ObjectMapper().createArrayNode(); + for (LaneSet laneSet : processDefinition.getLaneSets()) { + ArrayNode laneArray = new ObjectMapper().createArrayNode(); + if (laneSet.getLanes() != null && !laneSet.getLanes().isEmpty()) { + for (Lane lane : laneSet.getLanes()) { + ObjectNode laneJSON = new ObjectMapper().createObjectNode(); + laneJSON.put("id", lane.getId()); + if (StringUtils.isNotEmpty(lane.getName())) { + laneJSON.put("name", lane.getName()); + } else { + laneJSON.put("name", ""); + } + laneJSON.put("x", lane.getX()); + laneJSON.put("y", lane.getY()); + laneJSON.put("width", lane.getWidth()); + laneJSON.put("height", lane.getHeight()); + + List flowNodeIds = lane.getFlowNodeIds(); + ArrayNode flowNodeIdsArray = new ObjectMapper().createArrayNode(); + for (String flowNodeId : flowNodeIds) { + flowNodeIdsArray.add(flowNodeId); + } + laneJSON.set("flowNodeIds", flowNodeIdsArray); + + laneArray.add(laneJSON); + } + } + ObjectNode laneSetJSON = new ObjectMapper().createObjectNode(); + laneSetJSON.put("id", laneSet.getId()); + if (StringUtils.isNotEmpty(laneSet.getName())) { + laneSetJSON.put("name", laneSet.getName()); + } else { + laneSetJSON.put("name", ""); + } + laneSetJSON.set("lanes", laneArray); + + laneSetArray.add(laneSetJSON); + } + + if (laneSetArray.size() > 0) + responseJSON.set("laneSets", laneSetArray); + } + + ArrayNode sequenceFlowArray = new ObjectMapper().createArrayNode(); + ArrayNode activityArray = new ObjectMapper().createArrayNode(); + + // Activities and their sequence-flows + + for (ActivityImpl activity : processDefinition.getActivities()) { + getActivity(processInstanceId, activity, activityArray, sequenceFlowArray, + processInstance, highLightedFlows, subProcessInstanceMap); + } + + responseJSON.set("activities", activityArray); + responseJSON.set("sequenceFlows", sequenceFlowArray); + + return responseJSON; + } + + private List getHighLightedFlows(String processInstanceId, ProcessDefinitionEntity processDefinition) { + + List highLightedFlows = new ArrayList(); + List historicActivityInstances = historyService + .createHistoricActivityInstanceQuery() + .processInstanceId(processInstanceId) + .orderByHistoricActivityInstanceStartTime().asc().list(); + + List historicActivityInstanceList = new ArrayList(); + for (HistoricActivityInstance hai : historicActivityInstances) { + historicActivityInstanceList.add(hai.getActivityId()); + } + + // add current activities to list + List highLightedActivities = runtimeService.getActiveActivityIds(processInstanceId); + historicActivityInstanceList.addAll(highLightedActivities); + + // activities and their sequence-flows + for (ActivityImpl activity : processDefinition.getActivities()) { + int index = historicActivityInstanceList.indexOf(activity.getId()); + + if (index >= 0 && index + 1 < historicActivityInstanceList.size()) { + List pvmTransitionList = activity + .getOutgoingTransitions(); + for (PvmTransition pvmTransition : pvmTransitionList) { + String destinationFlowId = pvmTransition.getDestination().getId(); + if (destinationFlowId.equals(historicActivityInstanceList.get(index + 1))) { + highLightedFlows.add(pvmTransition.getId()); + } + } + } + } + return highLightedFlows; + } + + private void getActivity(String processInstanceId, ActivityImpl activity, ArrayNode activityArray, + ArrayNode sequenceFlowArray, ProcessInstance processInstance, List highLightedFlows, + Map subProcessInstanceMap) { + + ObjectNode activityJSON = new ObjectMapper().createObjectNode(); + + // Gather info on the multi instance marker + String multiInstance = (String) activity.getProperty("multiInstance"); + if (multiInstance != null) { + if (!"sequential".equals(multiInstance)) { + multiInstance = "parallel"; + } + } + + ActivityBehavior activityBehavior = activity.getActivityBehavior(); + // Gather info on the collapsed marker + Boolean collapsed = (activityBehavior instanceof CallActivityBehavior); + Boolean expanded = (Boolean) activity.getProperty(BpmnParse.PROPERTYNAME_ISEXPANDED); + if (expanded != null) { + collapsed = !expanded; + } + + Boolean isInterrupting = null; + if (activityBehavior instanceof BoundaryEventActivityBehavior) { + isInterrupting = ((BoundaryEventActivityBehavior) activityBehavior).isInterrupting(); + } + + // Outgoing transitions of activity + for (PvmTransition sequenceFlow : activity.getOutgoingTransitions()) { + String flowName = (String) sequenceFlow.getProperty("name"); + boolean isHighLighted = (highLightedFlows.contains(sequenceFlow.getId())); + boolean isConditional = sequenceFlow.getProperty(BpmnParse.PROPERTYNAME_CONDITION) != null && + !((String) activity.getProperty("type")).toLowerCase().contains("gateway"); + boolean isDefault = sequenceFlow.getId().equals(activity.getProperty("default")) + && ((String) activity.getProperty("type")).toLowerCase().contains("gateway"); + + List waypoints = ((TransitionImpl) sequenceFlow).getWaypoints(); + ArrayNode xPointArray = new ObjectMapper().createArrayNode(); + ArrayNode yPointArray = new ObjectMapper().createArrayNode(); + for (int i = 0; i < waypoints.size(); i += 2) { // waypoints.size() + // minimally 4: x1, y1, + // x2, y2 + xPointArray.add(waypoints.get(i)); + yPointArray.add(waypoints.get(i + 1)); + } + + ObjectNode flowJSON = new ObjectMapper().createObjectNode(); + flowJSON.put("id", sequenceFlow.getId()); + flowJSON.put("name", flowName); + flowJSON.put("flow", "(" + sequenceFlow.getSource().getId() + ")--" + + sequenceFlow.getId() + "-->(" + + sequenceFlow.getDestination().getId() + ")"); + + if (isConditional) + flowJSON.put("isConditional", isConditional); + if (isDefault) + flowJSON.put("isDefault", isDefault); + if (isHighLighted) + flowJSON.put("isHighLighted", isHighLighted); + + flowJSON.set("xPointArray", xPointArray); + flowJSON.set("yPointArray", yPointArray); + + sequenceFlowArray.add(flowJSON); + } + + // Nested activities (boundary events) + ArrayNode nestedActivityArray = new ObjectMapper().createArrayNode(); + for (ActivityImpl nestedActivity : activity.getActivities()) { + nestedActivityArray.add(nestedActivity.getId()); + } + + Map properties = activity.getProperties(); + ObjectNode propertiesJSON = new ObjectMapper().createObjectNode(); + for (String key : properties.keySet()) { + Object prop = properties.get(key); + if (prop instanceof String) + propertiesJSON.put(key, (String) properties.get(key)); + else if (prop instanceof Integer) + propertiesJSON.put(key, (Integer) properties.get(key)); + else if (prop instanceof Boolean) + propertiesJSON.put(key, (Boolean) properties.get(key)); + else if ("initial".equals(key)) { + ActivityImpl act = (ActivityImpl) properties.get(key); + propertiesJSON.put(key, act.getId()); + } else if ("timerDeclarations".equals(key)) { + ArrayList timerDeclarations = (ArrayList) properties.get(key); + ArrayNode timerDeclarationArray = new ObjectMapper().createArrayNode(); + + if (timerDeclarations != null) + for (TimerDeclarationImpl timerDeclaration : timerDeclarations) { + ObjectNode timerDeclarationJSON = new ObjectMapper().createObjectNode(); + + timerDeclarationJSON.put("isExclusive", timerDeclaration.isExclusive()); + if (timerDeclaration.getRepeat() != null) + timerDeclarationJSON.put("repeat", timerDeclaration.getRepeat()); + + timerDeclarationJSON.put("retries", String.valueOf(timerDeclaration.getRetries())); + timerDeclarationJSON.put("type", timerDeclaration.getJobHandlerType()); + timerDeclarationJSON.put("configuration", timerDeclaration.getJobHandlerConfiguration()); + //timerDeclarationJSON.put("expression", timerDeclaration.getDescription()); + + timerDeclarationArray.add(timerDeclarationJSON); + } + if (timerDeclarationArray.size() > 0) + propertiesJSON.set(key, timerDeclarationArray); + // TODO: implement getting description + } else if ("eventDefinitions".equals(key)) { + ArrayList eventDefinitions = (ArrayList) properties.get(key); + ArrayNode eventDefinitionsArray = new ObjectMapper().createArrayNode(); + + if (eventDefinitions != null) { + for (EventSubscriptionDeclaration eventDefinition : eventDefinitions) { + ObjectNode eventDefinitionJSON = new ObjectMapper().createObjectNode(); + + if (eventDefinition.getActivityId() != null) + eventDefinitionJSON.put("activityId", eventDefinition.getActivityId()); + + eventDefinitionJSON.put("eventName", eventDefinition.getEventName()); + eventDefinitionJSON.put("eventType", eventDefinition.getEventType()); + eventDefinitionJSON.put("isAsync", eventDefinition.isAsync()); + eventDefinitionJSON.put("isStartEvent", eventDefinition.isStartEvent()); + eventDefinitionsArray.add(eventDefinitionJSON); + } + } + + if (eventDefinitionsArray.size() > 0) + propertiesJSON.set(key, eventDefinitionsArray); + + // TODO: implement it + } else if ("errorEventDefinitions".equals(key)) { + ArrayList errorEventDefinitions = (ArrayList) properties.get(key); + ArrayNode errorEventDefinitionsArray = new ObjectMapper().createArrayNode(); + + if (errorEventDefinitions != null) { + for (ErrorEventDefinition errorEventDefinition : errorEventDefinitions) { + ObjectNode errorEventDefinitionJSON = new ObjectMapper().createObjectNode(); + + if (errorEventDefinition.getErrorCode() != null) + errorEventDefinitionJSON.put("errorCode", errorEventDefinition.getErrorCode()); + else + errorEventDefinitionJSON.putNull("errorCode"); + + errorEventDefinitionJSON.put("handlerActivityId", + errorEventDefinition.getHandlerActivityId()); + + errorEventDefinitionsArray.add(errorEventDefinitionJSON); + } + } + + if (errorEventDefinitionsArray.size() > 0) + propertiesJSON.set(key, errorEventDefinitionsArray); + } + + } + + if ("callActivity".equals(properties.get("type"))) { + CallActivityBehavior callActivityBehavior = null; + + if (activityBehavior instanceof CallActivityBehavior) { + callActivityBehavior = (CallActivityBehavior) activityBehavior; + } + + if (callActivityBehavior != null) { + propertiesJSON.put("processDefinitonKey", callActivityBehavior.getProcessDefinitonKey()); + + // get processDefinitonId from execution or get last processDefinitonId + // by key + ArrayNode processInstanceArray = new ObjectMapper().createArrayNode(); + if (processInstance != null) { + List executionList = runtimeService.createExecutionQuery() + .processInstanceId(processInstanceId) + .activityId(activity.getId()).list(); + if (!executionList.isEmpty()) { + for (Execution execution : executionList) { + ObjectNode processInstanceJSON = subProcessInstanceMap.get(execution.getId()); + processInstanceArray.add(processInstanceJSON); + } + } + } + + // If active activities nas no instance of this callActivity then add + // last definition + if (processInstanceArray.size() == 0 && StringUtils.isNotEmpty(callActivityBehavior.getProcessDefinitonKey())) { + // Get last definition by key + ProcessDefinition lastProcessDefinition = repositoryService + .createProcessDefinitionQuery() + .processDefinitionKey(callActivityBehavior.getProcessDefinitonKey()) + .latestVersion().singleResult(); + + // TODO: unuseful fields there are processDefinitionName, processDefinitionKey + if (lastProcessDefinition != null) { + ObjectNode processInstanceJSON = new ObjectMapper().createObjectNode(); + processInstanceJSON.put("processDefinitionId", lastProcessDefinition.getId()); + processInstanceJSON.put("processDefinitionKey", lastProcessDefinition.getKey()); + processInstanceJSON.put("processDefinitionName", lastProcessDefinition.getName()); + processInstanceArray.add(processInstanceJSON); + } + } + + if (processInstanceArray.size() > 0) { + propertiesJSON.set("processDefinitons", processInstanceArray); + } + } + } + + activityJSON.put("activityId", activity.getId()); + activityJSON.set("properties", propertiesJSON); + if (multiInstance != null) + activityJSON.put("multiInstance", multiInstance); + if (collapsed) + activityJSON.put("collapsed", collapsed); + if (nestedActivityArray.size() > 0) + activityJSON.set("nestedActivities", nestedActivityArray); + if (isInterrupting != null) + activityJSON.put("isInterrupting", isInterrupting); + + activityJSON.put("x", activity.getX()); + activityJSON.put("y", activity.getY()); + activityJSON.put("width", activity.getWidth()); + activityJSON.put("height", activity.getHeight()); + + activityArray.add(activityJSON); + + // Nested activities (boundary events) + for (ActivityImpl nestedActivity : activity.getActivities()) { + getActivity(processInstanceId, nestedActivity, activityArray, sequenceFlowArray, + processInstance, highLightedFlows, subProcessInstanceMap); + } + } + + private JsonNode getProcessDefinitionResponse(ProcessDefinitionEntity processDefinition) { + ObjectMapper mapper = new ObjectMapper(); + ObjectNode pdrJSON = mapper.createObjectNode(); + pdrJSON.put("id", processDefinition.getId()); + pdrJSON.put("name", processDefinition.getName()); + pdrJSON.put("key", processDefinition.getKey()); + pdrJSON.put("version", processDefinition.getVersion()); + pdrJSON.put("deploymentId", processDefinition.getDeploymentId()); + pdrJSON.put("isGraphicNotationDefined", isGraphicNotationDefined(processDefinition)); + return pdrJSON; + } + + private boolean isGraphicNotationDefined(ProcessDefinitionEntity processDefinition) { + return ((ProcessDefinitionEntity) repositoryService + .getProcessDefinition(processDefinition.getId())) + .isGraphicalNotationDefined(); + } +} diff --git a/len-activiti/src/main/java/org/activiti/rest/diagram/services/ProcessDefinitionDiagramLayoutResource.java b/len-activiti/src/main/java/org/activiti/rest/diagram/services/ProcessDefinitionDiagramLayoutResource.java index e800b42..14b281f 100644 --- a/len-activiti/src/main/java/org/activiti/rest/diagram/services/ProcessDefinitionDiagramLayoutResource.java +++ b/len-activiti/src/main/java/org/activiti/rest/diagram/services/ProcessDefinitionDiagramLayoutResource.java @@ -1,9 +1,9 @@ /* Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -21,10 +21,10 @@ import org.springframework.web.bind.annotation.RestController; @RestController public class ProcessDefinitionDiagramLayoutResource extends - BaseProcessDefinitionDiagramLayoutResource { + BaseProcessDefinitionDiagramLayoutResource { - @RequestMapping(value="/process-definition/{processDefinitionId}/diagram-layout", method = RequestMethod.GET, produces = "application/json") - public ObjectNode getDiagram(@PathVariable String processDefinitionId) { - return getDiagramNode(null, processDefinitionId); - } + @RequestMapping(value = "/process-definition/{processDefinitionId}/diagram-layout", method = RequestMethod.GET, produces = "application/json") + public ObjectNode getDiagram(@PathVariable String processDefinitionId) { + return getDiagramNode(null, processDefinitionId); + } } diff --git a/len-activiti/src/main/java/org/activiti/rest/diagram/services/ProcessInstanceDiagramLayoutResource.java b/len-activiti/src/main/java/org/activiti/rest/diagram/services/ProcessInstanceDiagramLayoutResource.java index a3a0915..4b1d15f 100644 --- a/len-activiti/src/main/java/org/activiti/rest/diagram/services/ProcessInstanceDiagramLayoutResource.java +++ b/len-activiti/src/main/java/org/activiti/rest/diagram/services/ProcessInstanceDiagramLayoutResource.java @@ -1,9 +1,9 @@ /* Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -22,8 +22,8 @@ import org.springframework.web.bind.annotation.RestController; @RestController public class ProcessInstanceDiagramLayoutResource extends BaseProcessDefinitionDiagramLayoutResource { - @RequestMapping(value="/process-instance/{processInstanceId}/diagram-layout", method = RequestMethod.GET, produces = "application/json") - public ObjectNode getDiagram(@PathVariable String processInstanceId) { - return getDiagramNode(processInstanceId, null); - } + @RequestMapping(value = "/process-instance/{processInstanceId}/diagram-layout", method = RequestMethod.GET, produces = "application/json") + public ObjectNode getDiagram(@PathVariable String processInstanceId) { + return getDiagramNode(processInstanceId, null); + } } diff --git a/len-activiti/src/main/java/org/activiti/rest/diagram/services/ProcessInstanceHighlightsResource.java b/len-activiti/src/main/java/org/activiti/rest/diagram/services/ProcessInstanceHighlightsResource.java index 387991d..0f92679 100644 --- a/len-activiti/src/main/java/org/activiti/rest/diagram/services/ProcessInstanceHighlightsResource.java +++ b/len-activiti/src/main/java/org/activiti/rest/diagram/services/ProcessInstanceHighlightsResource.java @@ -1,255 +1,249 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.activiti.rest.diagram.services; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.ObjectNode; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import org.activiti.engine.HistoryService; -import org.activiti.engine.RepositoryService; -import org.activiti.engine.RuntimeService; -import org.activiti.engine.history.HistoricActivityInstance; -import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity; -import org.activiti.engine.impl.pvm.PvmTransition; -import org.activiti.engine.impl.pvm.process.ActivityImpl; -import org.activiti.engine.runtime.ProcessInstance; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RestController; - -@RestController -public class ProcessInstanceHighlightsResource { - - @Autowired - private RuntimeService runtimeService; - - @Autowired - private RepositoryService repositoryService; - - @Autowired - private HistoryService historyService; - - protected ObjectMapper objectMapper = new ObjectMapper(); - - @RequestMapping(value="/process-instance/{processInstanceId}/highlights", method = RequestMethod.GET, produces = "application/json") - public ObjectNode getHighlighted(@PathVariable String processInstanceId) { - - ObjectNode responseJSON = objectMapper.createObjectNode(); - - responseJSON.put("processInstanceId", processInstanceId); - - ArrayNode activitiesArray = objectMapper.createArrayNode(); - ArrayNode flowsArray = objectMapper.createArrayNode(); - - try { - ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); - ProcessDefinitionEntity processDefinition = (ProcessDefinitionEntity) repositoryService.getProcessDefinition(processInstance.getProcessDefinitionId()); - - responseJSON.put("processDefinitionId", processInstance.getProcessDefinitionId()); - - List highLightedActivities = runtimeService.getActiveActivityIds(processInstanceId); - List highLightedFlows = getHighLightedFlows(processDefinition, processInstanceId); - - for (String activityId : highLightedActivities) { - activitiesArray.add(activityId); - } - - for (String flow : highLightedFlows) { - flowsArray.add(flow); - } - - } catch (Exception e) { - e.printStackTrace(); - } - - responseJSON.set("activities", activitiesArray); - responseJSON.set("flows", flowsArray); - - return responseJSON; - } - - - /** - * getHighLightedFlows - * - * @param processDefinition - * @param processInstanceId - * @return - */ - private List getHighLightedFlows(ProcessDefinitionEntity processDefinition, String processInstanceId) { - - List highLightedFlows = new ArrayList(); - - List historicActivityInstances = historyService.createHistoricActivityInstanceQuery() - .processInstanceId(processInstanceId) - //order by startime asc is not correct. use default order is correct. - //.orderByHistoricActivityInstanceStartTime().asc()/*.orderByActivityId().asc()*/ - .list(); - - LinkedList hisActInstList = new LinkedList(); - hisActInstList.addAll(historicActivityInstances); - - getHighlightedFlows(processDefinition.getActivities(), hisActInstList, highLightedFlows); - - return highLightedFlows; - } - - /** - * getHighlightedFlows - * - * code logic: - * 1. Loop all activities by id asc order; - * 2. Check each activity's outgoing transitions and eventBoundery outgoing transitions, if outgoing transitions's destination.id is in other executed activityIds, add this transition to highLightedFlows List; - * 3. But if activity is not a parallelGateway or inclusiveGateway, only choose the earliest flow. - * - * @param activityList - * @param hisActInstList - * @param highLightedFlows - */ - private void getHighlightedFlows(List activityList, LinkedList hisActInstList, List highLightedFlows){ - - //check out startEvents in activityList - List startEventActList = new ArrayList(); - Map activityMap = new HashMap(activityList.size()); - for(ActivityImpl activity : activityList){ - - activityMap.put(activity.getId(), activity); - - String actType = (String) activity.getProperty("type"); - if (actType != null && actType.toLowerCase().indexOf("startevent") >= 0){ - startEventActList.add(activity); - } - } - - //These codes is used to avoid a bug: - //ACT-1728 If the process instance was started by a callActivity, it will be not have the startEvent activity in ACT_HI_ACTINST table - //Code logic: - //Check the first activity if it is a startEvent, if not check out the startEvent's highlight outgoing flow. - HistoricActivityInstance firstHistActInst = hisActInstList.getFirst(); - String firstActType = (String) firstHistActInst.getActivityType(); - if (firstActType != null && firstActType.toLowerCase().indexOf("startevent") < 0){ - PvmTransition startTrans = getStartTransaction(startEventActList, firstHistActInst); - if (startTrans != null){ - highLightedFlows.add(startTrans.getId()); - } - } - - while (!hisActInstList.isEmpty()) { - HistoricActivityInstance histActInst = hisActInstList.removeFirst(); - ActivityImpl activity = activityMap.get(histActInst.getActivityId()); - if (activity != null) { - boolean isParallel = false; - String type = histActInst.getActivityType(); - if ("parallelGateway".equals(type) || "inclusiveGateway".equals(type)){ - isParallel = true; - } else if ("subProcess".equals(histActInst.getActivityType())){ - getHighlightedFlows(activity.getActivities(), hisActInstList, highLightedFlows); - } - - List allOutgoingTrans = new ArrayList(); - allOutgoingTrans.addAll(activity.getOutgoingTransitions()); - allOutgoingTrans.addAll(getBoundaryEventOutgoingTransitions(activity)); - List activityHighLightedFlowIds = getHighlightedFlows(allOutgoingTrans, hisActInstList, isParallel); - highLightedFlows.addAll(activityHighLightedFlowIds); - } - } - } - - /** - * Check out the outgoing transition connected to firstActInst from startEventActList - * - * @param startEventActList - * @param firstActInst - * @return - */ - private PvmTransition getStartTransaction(List startEventActList, HistoricActivityInstance firstActInst){ - for (ActivityImpl startEventAct: startEventActList) { - for (PvmTransition trans : startEventAct.getOutgoingTransitions()) { - if (trans.getDestination().getId().equals(firstActInst.getActivityId())) { - return trans; - } - } - } - return null; - } - - /** - * getBoundaryEventOutgoingTransitions - * - * @param activity - * @return - */ - private List getBoundaryEventOutgoingTransitions(ActivityImpl activity){ - List boundaryTrans = new ArrayList(); - for(ActivityImpl subActivity : activity.getActivities()){ - String type = (String)subActivity.getProperty("type"); - if(type!=null && type.toLowerCase().indexOf("boundary")>=0){ - boundaryTrans.addAll(subActivity.getOutgoingTransitions()); - } - } - return boundaryTrans; - } - - /** - * find out single activity's highlighted flowIds - * - * @param activity - * @param hisActInstList - * @param isExclusive if true only return one flowId(Such as exclusiveGateway, BoundaryEvent On Task) - * @return - */ - private List getHighlightedFlows(List pvmTransitionList, LinkedList hisActInstList, boolean isParallel){ - - List highLightedFlowIds = new ArrayList(); - - PvmTransition earliestTrans = null; - HistoricActivityInstance earliestHisActInst = null; - - for (PvmTransition pvmTransition : pvmTransitionList) { - - String destActId = pvmTransition.getDestination().getId(); - HistoricActivityInstance destHisActInst = findHisActInst(hisActInstList, destActId); - if (destHisActInst != null) { - if (isParallel) { - highLightedFlowIds.add(pvmTransition.getId()); - } else if (earliestHisActInst == null || (earliestHisActInst.getId().compareTo(destHisActInst.getId()) > 0)) { - earliestTrans = pvmTransition; - earliestHisActInst = destHisActInst; - } - } - } - - if ((!isParallel) && earliestTrans!=null){ - highLightedFlowIds.add(earliestTrans.getId()); - } - - return highLightedFlowIds; - } - - private HistoricActivityInstance findHisActInst(LinkedList hisActInstList, String actId){ - for (HistoricActivityInstance hisActInst : hisActInstList){ - if (hisActInst.getActivityId().equals(actId)){ - return hisActInst; - } - } - return null; - } -} +/* Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.activiti.rest.diagram.services; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; +import org.activiti.engine.HistoryService; +import org.activiti.engine.RepositoryService; +import org.activiti.engine.RuntimeService; +import org.activiti.engine.history.HistoricActivityInstance; +import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity; +import org.activiti.engine.impl.pvm.PvmTransition; +import org.activiti.engine.impl.pvm.process.ActivityImpl; +import org.activiti.engine.runtime.ProcessInstance; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import java.util.*; + +@RestController +public class ProcessInstanceHighlightsResource { + + protected ObjectMapper objectMapper = new ObjectMapper(); + @Autowired + private RuntimeService runtimeService; + @Autowired + private RepositoryService repositoryService; + @Autowired + private HistoryService historyService; + + @RequestMapping(value = "/process-instance/{processInstanceId}/highlights", method = RequestMethod.GET, produces = "application/json") + public ObjectNode getHighlighted(@PathVariable String processInstanceId) { + + ObjectNode responseJSON = objectMapper.createObjectNode(); + + responseJSON.put("processInstanceId", processInstanceId); + + ArrayNode activitiesArray = objectMapper.createArrayNode(); + ArrayNode flowsArray = objectMapper.createArrayNode(); + + try { + ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); + ProcessDefinitionEntity processDefinition = (ProcessDefinitionEntity) repositoryService.getProcessDefinition(processInstance.getProcessDefinitionId()); + + responseJSON.put("processDefinitionId", processInstance.getProcessDefinitionId()); + + List highLightedActivities = runtimeService.getActiveActivityIds(processInstanceId); + List highLightedFlows = getHighLightedFlows(processDefinition, processInstanceId); + + for (String activityId : highLightedActivities) { + activitiesArray.add(activityId); + } + + for (String flow : highLightedFlows) { + flowsArray.add(flow); + } + + } catch (Exception e) { + e.printStackTrace(); + } + + responseJSON.set("activities", activitiesArray); + responseJSON.set("flows", flowsArray); + + return responseJSON; + } + + + /** + * getHighLightedFlows + * + * @param processDefinition + * @param processInstanceId + * @return + */ + private List getHighLightedFlows(ProcessDefinitionEntity processDefinition, String processInstanceId) { + + List highLightedFlows = new ArrayList(); + + List historicActivityInstances = historyService.createHistoricActivityInstanceQuery() + .processInstanceId(processInstanceId) + //order by startime asc is not correct. use default order is correct. + //.orderByHistoricActivityInstanceStartTime().asc()/*.orderByActivityId().asc()*/ + .list(); + + LinkedList hisActInstList = new LinkedList(); + hisActInstList.addAll(historicActivityInstances); + + getHighlightedFlows(processDefinition.getActivities(), hisActInstList, highLightedFlows); + + return highLightedFlows; + } + + /** + * getHighlightedFlows + *

+ * code logic: + * 1. Loop all activities by id asc order; + * 2. Check each activity's outgoing transitions and eventBoundery outgoing transitions, if outgoing transitions's destination.id is in other executed activityIds, add this transition to highLightedFlows List; + * 3. But if activity is not a parallelGateway or inclusiveGateway, only choose the earliest flow. + * + * @param activityList + * @param hisActInstList + * @param highLightedFlows + */ + private void getHighlightedFlows(List activityList, LinkedList hisActInstList, List highLightedFlows) { + + //check out startEvents in activityList + List startEventActList = new ArrayList(); + Map activityMap = new HashMap(activityList.size()); + for (ActivityImpl activity : activityList) { + + activityMap.put(activity.getId(), activity); + + String actType = (String) activity.getProperty("type"); + if (actType != null && actType.toLowerCase().indexOf("startevent") >= 0) { + startEventActList.add(activity); + } + } + + //These codes is used to avoid a bug: + //ACT-1728 If the process instance was started by a callActivity, it will be not have the startEvent activity in ACT_HI_ACTINST table + //Code logic: + //Check the first activity if it is a startEvent, if not check out the startEvent's highlight outgoing flow. + HistoricActivityInstance firstHistActInst = hisActInstList.getFirst(); + String firstActType = (String) firstHistActInst.getActivityType(); + if (firstActType != null && firstActType.toLowerCase().indexOf("startevent") < 0) { + PvmTransition startTrans = getStartTransaction(startEventActList, firstHistActInst); + if (startTrans != null) { + highLightedFlows.add(startTrans.getId()); + } + } + + while (!hisActInstList.isEmpty()) { + HistoricActivityInstance histActInst = hisActInstList.removeFirst(); + ActivityImpl activity = activityMap.get(histActInst.getActivityId()); + if (activity != null) { + boolean isParallel = false; + String type = histActInst.getActivityType(); + if ("parallelGateway".equals(type) || "inclusiveGateway".equals(type)) { + isParallel = true; + } else if ("subProcess".equals(histActInst.getActivityType())) { + getHighlightedFlows(activity.getActivities(), hisActInstList, highLightedFlows); + } + + List allOutgoingTrans = new ArrayList(); + allOutgoingTrans.addAll(activity.getOutgoingTransitions()); + allOutgoingTrans.addAll(getBoundaryEventOutgoingTransitions(activity)); + List activityHighLightedFlowIds = getHighlightedFlows(allOutgoingTrans, hisActInstList, isParallel); + highLightedFlows.addAll(activityHighLightedFlowIds); + } + } + } + + /** + * Check out the outgoing transition connected to firstActInst from startEventActList + * + * @param startEventActList + * @param firstActInst + * @return + */ + private PvmTransition getStartTransaction(List startEventActList, HistoricActivityInstance firstActInst) { + for (ActivityImpl startEventAct : startEventActList) { + for (PvmTransition trans : startEventAct.getOutgoingTransitions()) { + if (trans.getDestination().getId().equals(firstActInst.getActivityId())) { + return trans; + } + } + } + return null; + } + + /** + * getBoundaryEventOutgoingTransitions + * + * @param activity + * @return + */ + private List getBoundaryEventOutgoingTransitions(ActivityImpl activity) { + List boundaryTrans = new ArrayList(); + for (ActivityImpl subActivity : activity.getActivities()) { + String type = (String) subActivity.getProperty("type"); + if (type != null && type.toLowerCase().indexOf("boundary") >= 0) { + boundaryTrans.addAll(subActivity.getOutgoingTransitions()); + } + } + return boundaryTrans; + } + + /** + * find out single activity's highlighted flowIds + * + * @param activity + * @param hisActInstList + * @param isExclusive if true only return one flowId(Such as exclusiveGateway, BoundaryEvent On Task) + * @return + */ + private List getHighlightedFlows(List pvmTransitionList, LinkedList hisActInstList, boolean isParallel) { + + List highLightedFlowIds = new ArrayList(); + + PvmTransition earliestTrans = null; + HistoricActivityInstance earliestHisActInst = null; + + for (PvmTransition pvmTransition : pvmTransitionList) { + + String destActId = pvmTransition.getDestination().getId(); + HistoricActivityInstance destHisActInst = findHisActInst(hisActInstList, destActId); + if (destHisActInst != null) { + if (isParallel) { + highLightedFlowIds.add(pvmTransition.getId()); + } else if (earliestHisActInst == null || (earliestHisActInst.getId().compareTo(destHisActInst.getId()) > 0)) { + earliestTrans = pvmTransition; + earliestHisActInst = destHisActInst; + } + } + } + + if ((!isParallel) && earliestTrans != null) { + highLightedFlowIds.add(earliestTrans.getId()); + } + + return highLightedFlowIds; + } + + private HistoricActivityInstance findHisActInst(LinkedList hisActInstList, String actId) { + for (HistoricActivityInstance hisActInst : hisActInstList) { + if (hisActInst.getActivityId().equals(actId)) { + return hisActInst; + } + } + return null; + } +} diff --git a/len-activiti/src/main/java/org/activiti/rest/editor/main/StencilsetRestResource.java b/len-activiti/src/main/java/org/activiti/rest/editor/main/StencilsetRestResource.java index 80cd9d4..ae9ed73 100644 --- a/len-activiti/src/main/java/org/activiti/rest/editor/main/StencilsetRestResource.java +++ b/len-activiti/src/main/java/org/activiti/rest/editor/main/StencilsetRestResource.java @@ -1,9 +1,9 @@ /* Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -12,7 +12,6 @@ */ package org.activiti.rest.editor.main; -import java.io.InputStream; import org.activiti.engine.ActivitiException; import org.apache.commons.io.IOUtils; import org.springframework.web.bind.annotation.RequestMapping; @@ -20,21 +19,23 @@ import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; +import java.io.InputStream; + /** * @author Tijs Rademakers */ @RestController @RequestMapping("/service") public class StencilsetRestResource { - - @RequestMapping(value="/editor/stencilset", method = RequestMethod.GET, produces = "application/json;charset=utf-8") - public @ResponseBody - String getStencilset() { - InputStream stencilsetStream = this.getClass().getClassLoader().getResourceAsStream("stencilset.json"); - try { - return IOUtils.toString(stencilsetStream, "utf-8"); - } catch (Exception e) { - throw new ActivitiException("Error while loading stencil set", e); - } - } + + @RequestMapping(value = "/editor/stencilset", method = RequestMethod.GET, produces = "application/json;charset=utf-8") + public @ResponseBody + String getStencilset() { + InputStream stencilsetStream = this.getClass().getClassLoader().getResourceAsStream("stencilset.json"); + try { + return IOUtils.toString(stencilsetStream, "utf-8"); + } catch (Exception e) { + throw new ActivitiException("Error while loading stencil set", e); + } + } } diff --git a/len-activiti/src/main/java/org/activiti/rest/editor/model/ModelEditorJsonRestResource.java b/len-activiti/src/main/java/org/activiti/rest/editor/model/ModelEditorJsonRestResource.java index 98648b5..9b4a5a0 100644 --- a/len-activiti/src/main/java/org/activiti/rest/editor/model/ModelEditorJsonRestResource.java +++ b/len-activiti/src/main/java/org/activiti/rest/editor/model/ModelEditorJsonRestResource.java @@ -1,71 +1,69 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.activiti.rest.editor.model; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; -import lombok.extern.slf4j.Slf4j; -import org.activiti.editor.constants.ModelDataJsonConstants; -import org.activiti.engine.ActivitiException; -import org.activiti.engine.RepositoryService; -import org.activiti.engine.repository.Model; -import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RestController; - -/** - * @author Tijs Rademakers - */ -@RestController -@RequestMapping("/service") -@Slf4j -public class ModelEditorJsonRestResource implements ModelDataJsonConstants { - - @Autowired - private RepositoryService repositoryService; - - @Autowired - private ObjectMapper objectMapper; - - @RequestMapping(value="/model/{modelId}/json", method = RequestMethod.GET, produces = "application/json") - public ObjectNode getEditorJson(@PathVariable String modelId) { - ObjectNode modelNode = null; - - Model model = repositoryService.getModel(modelId); - - if (model != null) { - try { - if (StringUtils.isNotEmpty(model.getMetaInfo())) { - modelNode = (ObjectNode) objectMapper.readTree(model.getMetaInfo()); - } else { - modelNode = objectMapper.createObjectNode(); - modelNode.put(MODEL_NAME, model.getName()); - } - modelNode.put(MODEL_ID, model.getId()); - ObjectNode editorJsonNode = (ObjectNode) objectMapper.readTree( - new String(repositoryService.getModelEditorSource(model.getId()), "utf-8")); - modelNode.set("model", editorJsonNode); - - } catch (Exception e) { - log.error("Error creating model JSON", e); - throw new ActivitiException("Error creating model JSON", e); - } - } - return modelNode; - } -} +/* Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.activiti.rest.editor.model; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ObjectNode; +import lombok.extern.slf4j.Slf4j; +import org.activiti.editor.constants.ModelDataJsonConstants; +import org.activiti.engine.ActivitiException; +import org.activiti.engine.RepositoryService; +import org.activiti.engine.repository.Model; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author Tijs Rademakers + */ +@RestController +@RequestMapping("/service") +@Slf4j +public class ModelEditorJsonRestResource implements ModelDataJsonConstants { + + @Autowired + private RepositoryService repositoryService; + + @Autowired + private ObjectMapper objectMapper; + + @RequestMapping(value = "/model/{modelId}/json", method = RequestMethod.GET, produces = "application/json") + public ObjectNode getEditorJson(@PathVariable String modelId) { + ObjectNode modelNode = null; + + Model model = repositoryService.getModel(modelId); + + if (model != null) { + try { + if (StringUtils.isNotEmpty(model.getMetaInfo())) { + modelNode = (ObjectNode) objectMapper.readTree(model.getMetaInfo()); + } else { + modelNode = objectMapper.createObjectNode(); + modelNode.put(MODEL_NAME, model.getName()); + } + modelNode.put(MODEL_ID, model.getId()); + ObjectNode editorJsonNode = (ObjectNode) objectMapper.readTree( + new String(repositoryService.getModelEditorSource(model.getId()), "utf-8")); + modelNode.set("model", editorJsonNode); + + } catch (Exception e) { + log.error("Error creating model JSON", e); + throw new ActivitiException("Error creating model JSON", e); + } + } + return modelNode; + } +} diff --git a/len-activiti/src/main/java/org/activiti/rest/editor/model/ModelSaveRestResource.java b/len-activiti/src/main/java/org/activiti/rest/editor/model/ModelSaveRestResource.java index 9d71be3..dc778f7 100644 --- a/len-activiti/src/main/java/org/activiti/rest/editor/model/ModelSaveRestResource.java +++ b/len-activiti/src/main/java/org/activiti/rest/editor/model/ModelSaveRestResource.java @@ -1,103 +1,95 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.activiti.rest.editor.model; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.InputStream; -import java.util.Map; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import lombok.extern.slf4j.Slf4j; -import org.activiti.editor.constants.ModelDataJsonConstants; -import org.activiti.engine.ActivitiException; -import org.activiti.engine.RepositoryService; -import org.activiti.engine.repository.Model; -import org.apache.batik.transcoder.TranscoderInput; -import org.apache.batik.transcoder.TranscoderOutput; -import org.apache.batik.transcoder.image.PNGTranscoder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseStatus; -import org.springframework.web.bind.annotation.RestController; - -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; - -/** - * @author Tijs Rademakers - */ -@RestController -@RequestMapping("/service") -@Slf4j -public class ModelSaveRestResource implements ModelDataJsonConstants { - - @Autowired - private RepositoryService repositoryService; - - - @PostMapping(value="/model/{modelId}/save") - @ResponseStatus(value = HttpStatus.OK) - public void saveModel(@PathVariable String modelId - , String name, String description - , String json_xml, String svg_xml,HttpServletRequest request, HttpServletResponse response) { - try { - Map map= request.getParameterMap(); - JSONObject jsonObject=new JSONObject(); - //全跑到key了,可取方案 - for(Map.Entry entry:map.entrySet()){ - String data=entry.getKey()+"="+(entry.getValue()[0]); - jsonObject= JSON.parseObject(data); - } - name= (String) jsonObject.get("name"); - description= (String) jsonObject.get("description"); - json_xml= (String) jsonObject.get("json_xml"); - svg_xml= (String) jsonObject.get("svg_xml"); - - Model model = repositoryService.getModel(modelId); - JSONObject object=new JSONObject(); - object.put(MODEL_NAME, name); - object.put(MODEL_DESCRIPTION, description); - model.setMetaInfo(object.toString()); - model.setName(name); - repositoryService.saveModel(model); - - repositoryService.addModelEditorSource(model.getId(), json_xml.getBytes("utf-8")); - - InputStream svgStream = new ByteArrayInputStream(svg_xml.getBytes("utf-8")); - TranscoderInput input = new TranscoderInput(svgStream); - - PNGTranscoder transcoder = new PNGTranscoder(); - // Setup output - ByteArrayOutputStream outStream = new ByteArrayOutputStream(); - TranscoderOutput output = new TranscoderOutput(outStream); - - // Do the transformation - transcoder.transcode(input, output); - final byte[] result = outStream.toByteArray(); - repositoryService.addModelEditorSourceExtra(model.getId(), result); - outStream.close(); - - } catch (Exception e) { - log.error("Error saving model", e); - throw new ActivitiException("Error saving model", e); - } - } -} +/* Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.activiti.rest.editor.model; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.activiti.editor.constants.ModelDataJsonConstants; +import org.activiti.engine.ActivitiException; +import org.activiti.engine.RepositoryService; +import org.activiti.engine.repository.Model; +import org.apache.batik.transcoder.TranscoderInput; +import org.apache.batik.transcoder.TranscoderOutput; +import org.apache.batik.transcoder.image.PNGTranscoder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.util.Map; + +/** + * @author Tijs Rademakers + */ +@RestController +@RequestMapping("/service") +@Slf4j +public class ModelSaveRestResource implements ModelDataJsonConstants { + + @Autowired + private RepositoryService repositoryService; + + + @PostMapping(value = "/model/{modelId}/save") + @ResponseStatus(value = HttpStatus.OK) + public void saveModel(@PathVariable String modelId + , String name, String description + , String json_xml, String svg_xml, HttpServletRequest request, HttpServletResponse response) { + try { + Map map = request.getParameterMap(); + JSONObject jsonObject = new JSONObject(); + //全跑到key了,可取方案 + for (Map.Entry entry : map.entrySet()) { + String data = entry.getKey() + "=" + (entry.getValue()[0]); + jsonObject = JSON.parseObject(data); + } + name = (String) jsonObject.get("name"); + description = (String) jsonObject.get("description"); + json_xml = (String) jsonObject.get("json_xml"); + svg_xml = (String) jsonObject.get("svg_xml"); + + Model model = repositoryService.getModel(modelId); + JSONObject object = new JSONObject(); + object.put(MODEL_NAME, name); + object.put(MODEL_DESCRIPTION, description); + model.setMetaInfo(object.toString()); + model.setName(name); + repositoryService.saveModel(model); + + repositoryService.addModelEditorSource(model.getId(), json_xml.getBytes("utf-8")); + + InputStream svgStream = new ByteArrayInputStream(svg_xml.getBytes("utf-8")); + TranscoderInput input = new TranscoderInput(svgStream); + + PNGTranscoder transcoder = new PNGTranscoder(); + // Setup output + ByteArrayOutputStream outStream = new ByteArrayOutputStream(); + TranscoderOutput output = new TranscoderOutput(outStream); + + // Do the transformation + transcoder.transcode(input, output); + final byte[] result = outStream.toByteArray(); + repositoryService.addModelEditorSourceExtra(model.getId(), result); + outStream.close(); + + } catch (Exception e) { + log.error("Error saving model", e); + throw new ActivitiException("Error saving model", e); + } + } +} diff --git a/len-activiti/src/main/java/org/activiti/rest/model/ActivitiProcess.java b/len-activiti/src/main/java/org/activiti/rest/model/ActivitiProcess.java index a239d0c..ea02064 100644 --- a/len-activiti/src/main/java/org/activiti/rest/model/ActivitiProcess.java +++ b/len-activiti/src/main/java/org/activiti/rest/model/ActivitiProcess.java @@ -15,21 +15,21 @@ import java.util.List; @ApiModel("流程顺序") public class ActivitiProcess { - @ApiModelProperty("流程活动名称") - String taskName; + @ApiModelProperty("流程活动名称") + String taskName; - @ApiModelProperty("用户id") - String userId; + @ApiModelProperty("用户id") + String userId; - @ApiModelProperty("用户名") - String userName; + @ApiModelProperty("用户名") + String userName; - @ApiModelProperty("组") - List groupNames; + @ApiModelProperty("组") + List groupNames; - @ApiModelProperty("流程线id") - String sid; + @ApiModelProperty("流程线id") + String sid; - @ApiModelProperty("审批时间") - String time; + @ApiModelProperty("审批时间") + String time; } diff --git a/len-activiti/src/main/resources/bpmn/demo.xml b/len-activiti/src/main/resources/bpmn/demo.xml index 60b94f3..cb95f0d 100644 --- a/len-activiti/src/main/resources/bpmn/demo.xml +++ b/len-activiti/src/main/resources/bpmn/demo.xml @@ -1,168 +1,196 @@ - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/len-activiti/src/main/resources/ftl/act/activiti/shinePics.html b/len-activiti/src/main/resources/ftl/act/activiti/shinePics.html index e198750..8c92894 100644 --- a/len-activiti/src/main/resources/ftl/act/activiti/shinePics.html +++ b/len-activiti/src/main/resources/ftl/act/activiti/shinePics.html @@ -1,116 +1,118 @@ - - 流程图 - - - - - - - - + + 流程图 + + + + + + + +

-
-
    -
  • 流程图
  • -
  • 流程审批
  • -
-
-
-
-
- - -
-
-
-
-
    +
    +
      +
    • 流程图
    • +
    • 流程审批
    • +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
      -
    -
    -
    +
+
+
-
- + } + let line = document.getElementsByClassName('layui-timeline')[0]; + line.innerHTML = msg; + } + diff --git a/len-activiti/src/main/resources/ftl/act/deploy/act-node.ftl b/len-activiti/src/main/resources/ftl/act/deploy/act-node.ftl index 1290523..2d90c5c 100644 --- a/len-activiti/src/main/resources/ftl/act/deploy/act-node.ftl +++ b/len-activiti/src/main/resources/ftl/act/deploy/act-node.ftl @@ -2,108 +2,112 @@ - - 流程节点分配 - - - - - - - - + + 流程节点分配 + + + + + + + +
-
-
-
-
    - <#list actList as act> -
  • class="layui-this">${act.name}
  • - -
-
- <#list actList as act> -
-
${act.id}
-
- 分配角色 -
-
-
- <#list act.boxJson as json> - checked> + +
+
+
    + <#list actList as act> +
  • class="layui-this">${act.name} +
  • -
-
-
- 分配成员 -
-
- 开发中..ing -
-
- -
-
-
+ <#list actList as act> +
+
${act.id}
+
+ 分配角色 +
+
+
+ <#list act.boxJson as json> + checked> + +
+
+
+ 分配成员 +
+
+ 开发中..ing +
+
+ +
+
+
-
- - -
-
-
- +
+ + +
+
+
+
diff --git a/len-activiti/src/main/resources/ftl/act/leave/add-leave.ftl b/len-activiti/src/main/resources/ftl/act/leave/add-leave.ftl index 91c6a8f..dff2942 100644 --- a/len-activiti/src/main/resources/ftl/act/leave/add-leave.ftl +++ b/len-activiti/src/main/resources/ftl/act/leave/add-leave.ftl @@ -1,147 +1,146 @@ - - - 新建请假 - - - - - - - - + + 新建请假 + + + + + + + +
-
-
-
-
- 请假信息 -
-
-
- -
- -
-
-
-
- -
- -
-
-
-
-
- 原因 -
-
-
-
- -
- -
-
-
-
-
-
+
+
+
+ 请假信息 +
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+
+ 原因 +
+
+
+
+ +
+ +
+
+
+
+
+
-
+
- - -
-
- + + +
+
+
diff --git a/len-activiti/src/main/resources/ftl/act/leave/leaveDetail.ftl b/len-activiti/src/main/resources/ftl/act/leave/leaveDetail.ftl index 7cf8523..24542fb 100644 --- a/len-activiti/src/main/resources/ftl/act/leave/leaveDetail.ftl +++ b/len-activiti/src/main/resources/ftl/act/leave/leaveDetail.ftl @@ -1,107 +1,107 @@ - - 请假审批详情 - - - - - - - - + .x-nav { + padding: 0 20px; + position: relative; + z-index: 99; + border-bottom: 1px solid #e5e5e5; + height: 32px; + overflow: hidden; + } +
diff --git a/len-activiti/src/main/resources/ftl/act/leave/leaveList.ftl b/len-activiti/src/main/resources/ftl/act/leave/leaveList.ftl index f0fcffe..c936c27 100644 --- a/len-activiti/src/main/resources/ftl/act/leave/leaveList.ftl +++ b/len-activiti/src/main/resources/ftl/act/leave/leaveList.ftl @@ -6,13 +6,13 @@ <#--按钮-->
-
+
<#include "/system/base/searth.ftl"> - -
+ +
<#--表格--> @@ -21,172 +21,171 @@ <#--表格toolbar--> - diff --git a/len-activiti/src/main/resources/ftl/act/leave/update-leave-readonly.ftl b/len-activiti/src/main/resources/ftl/act/leave/update-leave-readonly.ftl index 0967821..ed2fcb4 100644 --- a/len-activiti/src/main/resources/ftl/act/leave/update-leave-readonly.ftl +++ b/len-activiti/src/main/resources/ftl/act/leave/update-leave-readonly.ftl @@ -8,135 +8,141 @@ To change this template use File | Settings | File Templates.--> - - 编辑请假 - - - - - - - - + + 编辑请假 + + + + + + + +
-
-
-
-
- 请假信息 -
-
-
- -
- - -
-
-
-
- -
- -
-
-
-
-
- 原因 -
-
-
-
- -
- -
-
-
-
-
+ +
+
+
+ 请假信息 +
+
+
+ +
+ + +
+
+
+
+ +
+ +
+
+
+
+
+ 原因 +
+
+
+
+ +
+ +
+
+
+
+
-
+
diff --git a/len-activiti/src/main/resources/ftl/act/leave/update-leave.ftl b/len-activiti/src/main/resources/ftl/act/leave/update-leave.ftl index 0b865a0..52d4e13 100644 --- a/len-activiti/src/main/resources/ftl/act/leave/update-leave.ftl +++ b/len-activiti/src/main/resources/ftl/act/leave/update-leave.ftl @@ -8,149 +8,154 @@ To change this template use File | Settings | File Templates.--> - - 编辑请假 - - - - - - - - + + 编辑请假 + + + + + + + +
-
-
-
-
- 请假信息 -
-
-
- -
- - -
-
-
-
- -
- -
-
-
-
-
- 原因 -
-
-
-
- -
- -
-
-
-
-
-
+
+
+
+ 请假信息 +
+
+
+ +
+ + +
+
+
+
+ +
+ +
+
+
+
+
+ 原因 +
+
+
+
+ +
+ +
+
+
+
+
+
-
+
- - - -
-
- + + + +
+
+
diff --git a/len-activiti/src/main/resources/ftl/act/task/task-agent-iframe.ftl b/len-activiti/src/main/resources/ftl/act/task/task-agent-iframe.ftl index dad93bd..3eaa3cc 100644 --- a/len-activiti/src/main/resources/ftl/act/task/task-agent-iframe.ftl +++ b/len-activiti/src/main/resources/ftl/act/task/task-agent-iframe.ftl @@ -2,87 +2,90 @@ - - 办理任务 - - - - - - - - + + 办理任务 + + + + + + + +
-
- -
+
+ +
-
-
- -
- -
- -
-
-
-
+
+ +
+ +
+ +
+
+
+
-
- - - -
-
- +
+ + + + +
+
+
diff --git a/len-activiti/src/main/resources/ftl/act/task/task-agent.ftl b/len-activiti/src/main/resources/ftl/act/task/task-agent.ftl index 5c3883d..a9042f6 100644 --- a/len-activiti/src/main/resources/ftl/act/task/task-agent.ftl +++ b/len-activiti/src/main/resources/ftl/act/task/task-agent.ftl @@ -1,113 +1,116 @@ - - - 办理任务 - - - - - - - - + + 办理任务 + + + + + + + +
-
-
> -
-
- 请假信息 -
-
-
-
- -
- - -
-
-
- -
- -
-
-
-
- -
- -
-
-
- -
- -
-
-
-
+
> +
+
+ 请假信息 +
+
+
+
+ +
+ + +
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
-
- - - -
-
- +
+ + + + +
+
+
diff --git a/len-activiti/src/main/resources/ftl/act/task/taskList.ftl b/len-activiti/src/main/resources/ftl/act/task/taskList.ftl index 47bfb9f..29e5ac6 100644 --- a/len-activiti/src/main/resources/ftl/act/task/taskList.ftl +++ b/len-activiti/src/main/resources/ftl/act/task/taskList.ftl @@ -1,175 +1,180 @@ - - - 我的任务 -<#include "/system/base/formHead.ftl"> + + 我的任务 + <#include "/system/base/formHead.ftl">
diff --git a/len-activiti/src/main/resources/ftl/actList.ftl b/len-activiti/src/main/resources/ftl/actList.ftl index 0b38f93..640a7ee 100644 --- a/len-activiti/src/main/resources/ftl/actList.ftl +++ b/len-activiti/src/main/resources/ftl/actList.ftl @@ -1,163 +1,162 @@ - - - 流程部署 -<#include "/system/base/head.ftl"> + + 流程部署 + <#include "/system/base/head.ftl">
-
+
<#include "/system/base/searth.ftl"> -<@shiro.hasPermission name="control:del"> - -
+ <@shiro.hasPermission name="control:del"> + +
diff --git a/len-activiti/src/main/resources/ftl/actModelList.ftl b/len-activiti/src/main/resources/ftl/actModelList.ftl index e1ae8fe..910ee13 100644 --- a/len-activiti/src/main/resources/ftl/actModelList.ftl +++ b/len-activiti/src/main/resources/ftl/actModelList.ftl @@ -1,232 +1,232 @@ - - 模型列表 -<#include "/system/base/head.ftl"> + + 模型列表 + <#include "/system/base/head.ftl">
-
+
<#include "/system/base/searth.ftl"> <@shiro.hasPermission name="control:del"> - + - -
+ +
diff --git a/len-activiti/src/main/resources/mapper/ActAssigneeMapper.xml b/len-activiti/src/main/resources/mapper/ActAssigneeMapper.xml index 50a3ce1..6430c38 100644 --- a/len-activiti/src/main/resources/mapper/ActAssigneeMapper.xml +++ b/len-activiti/src/main/resources/mapper/ActAssigneeMapper.xml @@ -1,31 +1,34 @@ - - - - - - - - - - - id, sid, assignee, role_id, assignee_type, activti_name - - + + + + + + + + + + + id + , sid, assignee, role_id, assignee_type, activti_name + + - - delete from act_assignee - where sid = #{sid,jdbcType=VARCHAR} - - \ No newline at end of file + + delete + from act_assignee + where sid = #{sid,jdbcType=VARCHAR} + + diff --git a/len-activiti/src/main/resources/mapper/UserLeaveMapper.xml b/len-activiti/src/main/resources/mapper/UserLeaveMapper.xml index d6a1a8e..5650b6e 100644 --- a/len-activiti/src/main/resources/mapper/UserLeaveMapper.xml +++ b/len-activiti/src/main/resources/mapper/UserLeaveMapper.xml @@ -1,37 +1,37 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - \ No newline at end of file + + diff --git a/len-activiti/src/main/resources/plugin/activiti.js b/len-activiti/src/main/resources/plugin/activiti.js index aa0038c..2aba670 100644 --- a/len-activiti/src/main/resources/plugin/activiti.js +++ b/len-activiti/src/main/resources/plugin/activiti.js @@ -1,29 +1,29 @@ var activiti = { - /** - * - * @param processInstanceId 流程实例ID - * @param w 宽 - * @param h 高 - */ - img: function (processInstanceId, w, h) { - if (typeof w==='undefined') { - w = $(window).width(); - } - if (typeof h==='undefined') { - h = $(window).height(); - } - window.parent.layer.open({ - id: Math.floor(Math.random() * 1000), - type: 2, - area: [w + 'px', h + 'px'], - fix: false, - maxmin: true, - shadeClose: false, - shade: 0.4, - title: '流程图', - content: '/act/shinePics/' + processInstanceId - }); - } + /** + * + * @param processInstanceId 流程实例ID + * @param w 宽 + * @param h 高 + */ + img: function (processInstanceId, w, h) { + if (typeof w === 'undefined') { + w = $(window).width(); + } + if (typeof h === 'undefined') { + h = $(window).height(); + } + window.parent.layer.open({ + id: Math.floor(Math.random() * 1000), + type: 2, + area: [w + 'px', h + 'px'], + fix: false, + maxmin: true, + shadeClose: false, + shade: 0.4, + title: '流程图', + content: '/act/shinePics/' + processInstanceId + }); + } -}; \ No newline at end of file +}; diff --git a/len-activiti/src/main/resources/properties/activiti.properties b/len-activiti/src/main/resources/properties/activiti.properties index 6e60425..727aff0 100644 --- a/len-activiti/src/main/resources/properties/activiti.properties +++ b/len-activiti/src/main/resources/properties/activiti.properties @@ -1,3 +1,2 @@ - # 演示模型禁止删除 modelId=142517 \ No newline at end of file diff --git a/len-activiti/src/main/resources/static/diagram-viewer/index.html b/len-activiti/src/main/resources/static/diagram-viewer/index.html index 66a8c4f..e6cf384 100644 --- a/len-activiti/src/main/resources/static/diagram-viewer/index.html +++ b/len-activiti/src/main/resources/static/diagram-viewer/index.html @@ -1,128 +1,129 @@  - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + +
-
-
-
-
-
-
+
+
+
+
+
+
diff --git a/len-activiti/src/main/resources/static/diagram-viewer/js/ActivitiRest.js b/len-activiti/src/main/resources/static/diagram-viewer/js/ActivitiRest.js index 1afd90e..69a0499 100644 --- a/len-activiti/src/main/resources/static/diagram-viewer/js/ActivitiRest.js +++ b/len-activiti/src/main/resources/static/diagram-viewer/js/ActivitiRest.js @@ -1,37 +1,37 @@ var ActivitiRest = { options: {}, - getProcessDefinitionByKey: function(processDefinitionKey, callback) { + getProcessDefinitionByKey: function (processDefinitionKey, callback) { var url = Lang.sub(this.options.processDefinitionByKeyUrl, {processDefinitionKey: processDefinitionKey}); - + $.ajax({ url: url, dataType: 'jsonp', cache: false, async: true, - success: function(data, textStatus) { + success: function (data, textStatus) { var processDefinition = data; if (!processDefinition) { console.error("Process definition '" + processDefinitionKey + "' not found"); } else { - callback.apply({processDefinitionId: processDefinition.id}); + callback.apply({processDefinitionId: processDefinition.id}); } } - }).done(function(data, textStatus) { + }).done(function (data, textStatus) { console.log("ajax done"); - }).fail(function(jqXHR, textStatus, error){ - console.error('Get diagram layout['+processDefinitionKey+'] failure: ', textStatus, 'error: ', error, jqXHR); + }).fail(function (jqXHR, textStatus, error) { + console.error('Get diagram layout[' + processDefinitionKey + '] failure: ', textStatus, 'error: ', error, jqXHR); }); }, - - getProcessDefinition: function(processDefinitionId, callback) { + + getProcessDefinition: function (processDefinitionId, callback) { var url = Lang.sub(this.options.processDefinitionUrl, {processDefinitionId: processDefinitionId}); - + $.ajax({ url: url, dataType: 'jsonp', cache: false, async: true, - success: function(data, textStatus) { + success: function (data, textStatus) { var processDefinitionDiagramLayout = data; if (!processDefinitionDiagramLayout) { console.error("Process definition diagram layout '" + processDefinitionId + "' not found"); @@ -40,22 +40,22 @@ var ActivitiRest = { callback.apply({processDefinitionDiagramLayout: processDefinitionDiagramLayout}); } } - }).done(function(data, textStatus) { + }).done(function (data, textStatus) { console.log("ajax done"); - }).fail(function(jqXHR, textStatus, error){ - console.log('Get diagram layout['+processDefinitionId+'] failure: ', textStatus, jqXHR); + }).fail(function (jqXHR, textStatus, error) { + console.log('Get diagram layout[' + processDefinitionId + '] failure: ', textStatus, jqXHR); }); }, - - getHighLights: function(processInstanceId, callback) { + + getHighLights: function (processInstanceId, callback) { var url = Lang.sub(this.options.processInstanceHighLightsUrl, {processInstanceId: processInstanceId}); - + $.ajax({ url: url, dataType: 'jsonp', cache: false, async: true, - success: function(data, textStatus) { + success: function (data, textStatus) { console.log("ajax returned data"); var highLights = data; if (!highLights) { @@ -65,10 +65,10 @@ var ActivitiRest = { callback.apply({highLights: highLights}); } } - }).done(function(data, textStatus) { + }).done(function (data, textStatus) { console.log("ajax done"); - }).fail(function(jqXHR, textStatus, error){ - console.log('Get HighLights['+processInstanceId+'] failure: ', textStatus, jqXHR); + }).fail(function (jqXHR, textStatus, error) { + console.log('Get HighLights[' + processInstanceId + '] failure: ', textStatus, jqXHR); }); } -}; \ No newline at end of file +}; diff --git a/len-activiti/src/main/resources/static/diagram-viewer/js/ActivityImpl.js b/len-activiti/src/main/resources/static/diagram-viewer/js/ActivityImpl.js index f310211..4df63e0 100644 --- a/len-activiti/src/main/resources/static/diagram-viewer/js/ActivityImpl.js +++ b/len-activiti/src/main/resources/static/diagram-viewer/js/ActivityImpl.js @@ -1 +1,195 @@ -/** * * @author Tom Baeyens * @author (Javascript) Dmitry Farafonov */ var ActivityImpl = function(activityJson){ this.outgoingTransitions = []; this.outgoingTransitions = []; this.incomingTransitions = []; this.activityBehavior = null; this.parent = null; this.isScope = false; this.isAsync = false; this.isExclusive = false; this.x = -1; this.y = -1; this.width = -1; this.height = -1; this.properties = {}; //console.log("activityJson: ", activityJson); if (activityJson != undefined) { this.setId(activityJson.activityId); for (var propertyName in activityJson.properties) { this.setProperty(propertyName, activityJson.properties[propertyName]); } //this.setProperty("name", activityJson.activityName); //this.setProperty("type", activityJson.activityType); this.setX(activityJson.x); this.setY(activityJson.y); this.setWidth(activityJson.width); this.setHeight(activityJson.height); if (activityJson.multiInstance) this.setProperty("multiInstance", activityJson.multiInstance); if (activityJson.collapsed) { this.setProperty("collapsed", activityJson.collapsed); } if (activityJson.isInterrupting != undefined) this.setProperty("isInterrupting", activityJson.isInterrupting); } }; ActivityImpl.prototype = { outgoingTransitions: [], outgoingTransitions: [], incomingTransitions: [], activityBehavior: null, parent: null, isScope: false, isAsync: false, isExclusive: false, id: null, properties: {}, // Graphical information x: -1, y: -1, width: -1, height: -1, setId: function(id){ this.id = id; }, getId: function(){ return this.id; }, setProperty: function(name, value){ this.properties[name] = value; }, getProperty: function(name){ return this.properties[name]; }, createOutgoingTransition: function(transitionId){ }, toString: function(id) { return "Activity("+id+")"; }, getParentActivity: function(){ /* if (parent instanceof ActivityImpl) { 79 return (ActivityImpl) parent; 80 } 81 return null; */ return this.parent; }, // restricted setters /////////////////////////////////////////////////////// setOutgoingTransitions: function(outgoingTransitions){ this.outgoingTransitions = outgoingTransitions; }, setParent: function(parent){ this.parent = parent; }, setIncomingTransitions: function(incomingTransitions){ this.incomingTransitions = incomingTransitions; }, // getters and setters ////////////////////////////////////////////////////// getOutgoingTransitions: function(){ return this.outgoingTransitions; }, getActivityBehavior: function(){ return this.activityBehavior; }, setActivityBehavior: function(activityBehavior){ this.activityBehavior = activityBehavior; }, getParent: function(){ return this.parent; }, getIncomingTransitions: function(){ return this.incomingTransitions; }, isScope: function(){ return this.isScope; }, setScope: function(isScope){ this.isScope = isScope; }, getX: function(){ return this.x; }, setX: function(x){ this.x = x; }, getY: function(){ return this.y; }, setY: function(y){ this.y = y; }, getWidth: function(){ return this.width; }, setWidth: function(width){ this.width = width; }, getHeight: function(){ return this.height; }, setHeight: function(height){ this.height = height; }, isAsync: function() { return this.isAsync; }, setAsync: function(isAsync) { this.isAsync = isAsync; }, isExclusive: function() { return this.isExclusive; }, setExclusive: function(isExclusive) { this.isExclusive = isExclusive; }, vvoid: function(){} }; \ No newline at end of file +/** + * + * @author Tom Baeyens + * @author (Javascript) Dmitry Farafonov + */ + +var ActivityImpl = function (activityJson) { + this.outgoingTransitions = []; + this.outgoingTransitions = []; + this.incomingTransitions = []; + this.activityBehavior = null; + this.parent = null; + this.isScope = false; + this.isAsync = false; + this.isExclusive = false; + this.x = -1; + this.y = -1; + this.width = -1; + this.height = -1; + this.properties = {}; + + //console.log("activityJson: ", activityJson); + + if (activityJson != undefined) { + this.setId(activityJson.activityId); + + for (var propertyName in activityJson.properties) { + this.setProperty(propertyName, activityJson.properties[propertyName]); + } + //this.setProperty("name", activityJson.activityName); + //this.setProperty("type", activityJson.activityType); + this.setX(activityJson.x); + this.setY(activityJson.y); + this.setWidth(activityJson.width); + this.setHeight(activityJson.height); + + if (activityJson.multiInstance) + this.setProperty("multiInstance", activityJson.multiInstance); + if (activityJson.collapsed) { + this.setProperty("collapsed", activityJson.collapsed); + } + if (activityJson.isInterrupting != undefined) + this.setProperty("isInterrupting", activityJson.isInterrupting); + } +}; + +ActivityImpl.prototype = { + outgoingTransitions: [], + outgoingTransitions: [], + incomingTransitions: [], + activityBehavior: null, + parent: null, + isScope: false, + isAsync: false, + isExclusive: false, + + id: null, + + properties: {}, + + // Graphical information + x: -1, + y: -1, + width: -1, + height: -1, + + setId: function (id) { + this.id = id; + }, + + getId: function () { + return this.id; + }, + + + setProperty: function (name, value) { + this.properties[name] = value; + }, + getProperty: function (name) { + return this.properties[name]; + }, + + createOutgoingTransition: function (transitionId) { + + }, + + toString: function (id) { + return "Activity(" + id + ")"; + }, + + getParentActivity: function () { + /* + if (parent instanceof ActivityImpl) { + 79 return (ActivityImpl) parent; + 80 } + 81 return null; + */ + return this.parent; + }, + + // restricted setters /////////////////////////////////////////////////////// + + setOutgoingTransitions: function (outgoingTransitions) { + this.outgoingTransitions = outgoingTransitions; + }, + + setParent: function (parent) { + this.parent = parent; + }, + + setIncomingTransitions: function (incomingTransitions) { + this.incomingTransitions = incomingTransitions; + }, + + // getters and setters ////////////////////////////////////////////////////// + + getOutgoingTransitions: function () { + return this.outgoingTransitions; + }, + + getActivityBehavior: function () { + return this.activityBehavior; + }, + + setActivityBehavior: function (activityBehavior) { + this.activityBehavior = activityBehavior; + }, + + getParent: function () { + return this.parent; + }, + + getIncomingTransitions: function () { + return this.incomingTransitions; + }, + + isScope: function () { + return this.isScope; + }, + + setScope: function (isScope) { + this.isScope = isScope; + }, + + getX: function () { + return this.x; + }, + + setX: function (x) { + this.x = x; + }, + + getY: function () { + return this.y; + }, + + setY: function (y) { + this.y = y; + }, + + getWidth: function () { + return this.width; + }, + + setWidth: function (width) { + this.width = width; + }, + + getHeight: function () { + return this.height; + }, + + setHeight: function (height) { + this.height = height; + }, + + isAsync: function () { + return this.isAsync; + }, + + setAsync: function (isAsync) { + this.isAsync = isAsync; + }, + + isExclusive: function () { + return this.isExclusive; + }, + + setExclusive: function (isExclusive) { + this.isExclusive = isExclusive; + }, + + vvoid: function () { + } +}; diff --git a/len-activiti/src/main/resources/static/diagram-viewer/js/Color.js b/len-activiti/src/main/resources/static/diagram-viewer/js/Color.js index e57027e..21260df 100644 --- a/len-activiti/src/main/resources/static/diagram-viewer/js/Color.js +++ b/len-activiti/src/main/resources/static/diagram-viewer/js/Color.js @@ -1,603 +1,602 @@ /** * Web color table - * + * * @author Dmitry Farafonov */ var Color = { - /** - * The color white. In the default sRGB space. - */ - white : Raphael.getRGB("rgb(255,255,255)"), - - /** - * The color white. In the default sRGB space. - */ - WHITE : this.white, - - /** - * The color light gray. In the default sRGB space. - */ - lightGray : Raphael.getRGB("rgb(192, 192, 192)"), - - /** - * The color light gray. In the default sRGB space. - */ - LIGHT_GRAY : this.lightGray, - - /** - * The color gray. In the default sRGB space. - */ - gray : Raphael.getRGB("rgb(128, 128, 128)"), - - /** - * The color gray. In the default sRGB space. - */ - GRAY : this.gray, - - /** - * The color dark gray. In the default sRGB space. - */ - darkGray : Raphael.getRGB("rgb(64, 64, 64)"), - - /** - * The color dark gray. In the default sRGB space. - */ - DARK_GRAY : this.darkGray, - - /** - * The color black. In the default sRGB space. - */ - black : Raphael.getRGB("rgb(0, 0, 0)"), - - /** - * The color black. In the default sRGB space. - */ - BLACK : this.black, - - /** - * The color red. In the default sRGB space. - */ - red : Raphael.getRGB("rgb(255, 0, 0)"), - - /** - * The color red. In the default sRGB space. - */ - RED : this.red, - - /** - * The color pink. In the default sRGB space. - */ - pink : Raphael.getRGB("rgb(255, 175, 175)"), - - /** - * The color pink. In the default sRGB space. - */ - PINK : this.pink, - - /** - * The color orange. In the default sRGB space. - */ - orange : Raphael.getRGB("rgb(255, 200, 0)"), - - /** - * The color orange. In the default sRGB space. - */ - ORANGE : this.orange, - - /** - * The color yellow. In the default sRGB space. - */ - yellow : Raphael.getRGB("rgb(255, 255, 0)"), - - /** - * The color yellow. In the default sRGB space. - */ - YELLOW : this.yellow, - - /** - * The color green. In the default sRGB space. - */ - green : Raphael.getRGB("rgb(0, 255, 0)"), - - /** - * The color green. In the default sRGB space. - */ - GREEN : this.green, - - /** - * The color magenta. In the default sRGB space. - */ - magenta : Raphael.getRGB("rgb(255, 0, 255)"), - - /** - * The color magenta. In the default sRGB space. - */ - MAGENTA : this.magenta, - - /** - * The color cyan. In the default sRGB space. - */ - cyan : Raphael.getRGB("rgb(0, 255, 255)"), - - /** - * The color cyan. In the default sRGB space. - */ - CYAN : this.cyan, - - /** - * The color blue. In the default sRGB space. - */ - blue : Raphael.getRGB("rgb(0, 0, 255)"), - - /** - * The color blue. In the default sRGB space. - */ - BLUE : this.blue, - - /************************************************************************/ + /** + * The color white. In the default sRGB space. + */ + white: Raphael.getRGB("rgb(255,255,255)"), - // http://www.stm.dp.ua/web-design/color-html.php - - Snow : Raphael.getRGB("#FFFAFA "), // 255 250 250 - GhostWhite : Raphael.getRGB("#F8F8FF "), // 248 248 255 - WhiteSmoke : Raphael.getRGB("#F5F5F5 "), // 245 245 245 - Gainsboro : Raphael.getRGB("#DCDCDC "), // 220 220 220 - FloralWhite : Raphael.getRGB("#FFFAF0 "), // 255 250 240 - OldLace : Raphael.getRGB("#FDF5E6 "), // 253 245 230 - Linen : Raphael.getRGB("#FAF0E6 "), // 250 240 230 - AntiqueWhite : Raphael.getRGB("#FAEBD7 "), // 250 235 215 - PapayaWhip : Raphael.getRGB("#FFEFD5 "), // 255 239 213 - BlanchedAlmond : Raphael.getRGB("#FFEBCD "), // 255 235 205 - Bisque : Raphael.getRGB("#FFE4C4 "), // 255 228 196 - PeachPuff : Raphael.getRGB("#FFDAB9 "), // 255 218 185 - NavajoWhite : Raphael.getRGB("#FFDEAD "), // 255 222 173 - Moccasin : Raphael.getRGB("#FFE4B5 "), // 255 228 181 - Cornsilk : Raphael.getRGB("#FFF8DC "), // 255 248 220 - Ivory : Raphael.getRGB("#FFFFF0 "), // 255 255 240 - LemonChiffon : Raphael.getRGB("#FFFACD "), // 255 250 205 - Seashell : Raphael.getRGB("#FFF5EE "), // 255 245 238 - Honeydew : Raphael.getRGB("#F0FFF0 "), // 240 255 240 - MintCream : Raphael.getRGB("#F5FFFA "), // 245 255 250 - Azure : Raphael.getRGB("#F0FFFF "), // 240 255 255 - AliceBlue : Raphael.getRGB("#F0F8FF "), // 240 248 255 - lavender : Raphael.getRGB("#E6E6FA "), // 230 230 250 - LavenderBlush : Raphael.getRGB("#FFF0F5 "), // 255 240 245 - MistyRose : Raphael.getRGB("#FFE4E1 "), // 255 228 225 - White : Raphael.getRGB("#FFFFFF "), // 255 255 255 - Black : Raphael.getRGB("#000000 "), // 0 0 0 - DarkSlateGray : Raphael.getRGB("#2F4F4F "), // 47 79 79 - DimGrey : Raphael.getRGB("#696969 "), // 105 105 105 - SlateGrey : Raphael.getRGB("#708090 "), // 112 128 144 - LightSlateGray : Raphael.getRGB("#778899 "), // 119 136 153 - Grey : Raphael.getRGB("#BEBEBE "), // 190 190 190 - LightGray : Raphael.getRGB("#D3D3D3 "), // 211 211 211 - MidnightBlue : Raphael.getRGB("#191970 "), // 25 25 112 - NavyBlue : Raphael.getRGB("#000080 "), // 0 0 128 - CornflowerBlue : Raphael.getRGB("#6495ED "), // 100 149 237 - DarkSlateBlue : Raphael.getRGB("#483D8B "), // 72 61 139 - SlateBlue : Raphael.getRGB("#6A5ACD "), // 106 90 205 - MediumSlateBlue : Raphael.getRGB("#7B68EE "), // 123 104 238 - LightSlateBlue : Raphael.getRGB("#8470FF "), // 132 112 255 - MediumBlue : Raphael.getRGB("#0000CD "), // 0 0 205 - RoyalBlue : Raphael.getRGB("#4169E1 "), // 65 105 225 - Blue : Raphael.getRGB("#0000FF "), // 0 0 255 - DodgerBlue : Raphael.getRGB("#1E90FF "), // 30 144 255 - DeepSkyBlue : Raphael.getRGB("#00BFFF "), // 0 191 255 - SkyBlue : Raphael.getRGB("#87CEEB "), // 135 206 235 - LightSkyBlue : Raphael.getRGB("#87CEFA "), // 135 206 250 - SteelBlue : Raphael.getRGB("#4682B4 "), // 70 130 180 - LightSteelBlue : Raphael.getRGB("#B0C4DE "), // 176 196 222 - LightBlue : Raphael.getRGB("#ADD8E6 "), // 173 216 230 - PowderBlue : Raphael.getRGB("#B0E0E6 "), // 176 224 230 - PaleTurquoise : Raphael.getRGB("#AFEEEE "), // 175 238 238 - DarkTurquoise : Raphael.getRGB("#00CED1 "), // 0 206 209 - MediumTurquoise : Raphael.getRGB("#48D1CC "), // 72 209 204 - Turquoise : Raphael.getRGB("#40E0D0 "), // 64 224 208 - Cyan : Raphael.getRGB("#00FFFF "), // 0 255 255 - LightCyan : Raphael.getRGB("#E0FFFF "), // 224 255 255 - CadetBlue : Raphael.getRGB("#5F9EA0 "), // 95 158 160 - MediumAquamarine: Raphael.getRGB("#66CDAA "), // 102 205 170 - Aquamarine : Raphael.getRGB("#7FFFD4 "), // 127 255 212 - DarkGreen : Raphael.getRGB("#006400 "), // 0 100 0 - DarkOliveGreen : Raphael.getRGB("#556B2F "), // 85 107 47 - DarkSeaGreen : Raphael.getRGB("#8FBC8F "), // 143 188 143 - SeaGreen : Raphael.getRGB("#2E8B57 "), // 46 139 87 - MediumSeaGreen : Raphael.getRGB("#3CB371 "), // 60 179 113 - LightSeaGreen : Raphael.getRGB("#20B2AA "), // 32 178 170 - PaleGreen : Raphael.getRGB("#98FB98 "), // 152 251 152 - SpringGreen : Raphael.getRGB("#00FF7F "), // 0 255 127 - LawnGreen : Raphael.getRGB("#7CFC00 "), // 124 252 0 - Green : Raphael.getRGB("#00FF00 "), // 0 255 0 - Chartreuse : Raphael.getRGB("#7FFF00 "), // 127 255 0 - MedSpringGreen : Raphael.getRGB("#00FA9A "), // 0 250 154 - GreenYellow : Raphael.getRGB("#ADFF2F "), // 173 255 47 - LimeGreen : Raphael.getRGB("#32CD32 "), // 50 205 50 - YellowGreen : Raphael.getRGB("#9ACD32 "), // 154 205 50 - ForestGreen : Raphael.getRGB("#228B22 "), // 34 139 34 - OliveDrab : Raphael.getRGB("#6B8E23 "), // 107 142 35 - DarkKhaki : Raphael.getRGB("#BDB76B "), // 189 183 107 - PaleGoldenrod : Raphael.getRGB("#EEE8AA "), // 238 232 170 - LtGoldenrodYello: Raphael.getRGB("#FAFAD2 "), // 250 250 210 - LightYellow : Raphael.getRGB("#FFFFE0 "), // 255 255 224 - Yellow : Raphael.getRGB("#FFFF00 "), // 255 255 0 - Gold : Raphael.getRGB("#FFD700 "), // 255 215 0 - LightGoldenrod : Raphael.getRGB("#EEDD82 "), // 238 221 130 - goldenrod : Raphael.getRGB("#DAA520 "), // 218 165 32 - DarkGoldenrod : Raphael.getRGB("#B8860B "), // 184 134 11 - RosyBrown : Raphael.getRGB("#BC8F8F "), // 188 143 143 - IndianRed : Raphael.getRGB("#CD5C5C "), // 205 92 92 - SaddleBrown : Raphael.getRGB("#8B4513 "), // 139 69 19 - Sienna : Raphael.getRGB("#A0522D "), // 160 82 45 - Peru : Raphael.getRGB("#CD853F "), // 205 133 63 - Burlywood : Raphael.getRGB("#DEB887 "), // 222 184 135 - Beige : Raphael.getRGB("#F5F5DC "), // 245 245 220 - Wheat : Raphael.getRGB("#F5DEB3 "), // 245 222 179 - SandyBrown : Raphael.getRGB("#F4A460 "), // 244 164 96 - Tan : Raphael.getRGB("#D2B48C "), // 210 180 140 - Chocolate : Raphael.getRGB("#D2691E "), // 210 105 30 - Firebrick : Raphael.getRGB("#B22222 "), // 178 34 34 - Brown : Raphael.getRGB("#A52A2A "), // 165 42 42 - DarkSalmon : Raphael.getRGB("#E9967A "), // 233 150 122 - Salmon : Raphael.getRGB("#FA8072 "), // 250 128 114 - LightSalmon : Raphael.getRGB("#FFA07A "), // 255 160 122 - Orange : Raphael.getRGB("#FFA500 "), // 255 165 0 - DarkOrange : Raphael.getRGB("#FF8C00 "), // 255 140 0 - Coral : Raphael.getRGB("#FF7F50 "), // 255 127 80 - LightCoral : Raphael.getRGB("#F08080 "), // 240 128 128 - Tomato : Raphael.getRGB("#FF6347 "), // 255 99 71 - OrangeRed : Raphael.getRGB("#FF4500 "), // 255 69 0 - Red : Raphael.getRGB("#FF0000 "), // 255 0 0 - HotPink : Raphael.getRGB("#FF69B4 "), // 255 105 180 - DeepPink : Raphael.getRGB("#FF1493 "), // 255 20 147 - Pink : Raphael.getRGB("#FFC0CB "), // 255 192 203 - LightPink : Raphael.getRGB("#FFB6C1 "), // 255 182 193 - PaleVioletRed : Raphael.getRGB("#DB7093 "), // 219 112 147 - Maroon : Raphael.getRGB("#B03060 "), // 176 48 96 - MediumVioletRed : Raphael.getRGB("#C71585 "), // 199 21 133 - VioletRed : Raphael.getRGB("#D02090 "), // 208 32 144 - Magenta : Raphael.getRGB("#FF00FF "), // 255 0 255 - Violet : Raphael.getRGB("#EE82EE "), // 238 130 238 - Plum : Raphael.getRGB("#DDA0DD "), // 221 160 221 - Orchid : Raphael.getRGB("#DA70D6 "), // 218 112 214 - MediumOrchid : Raphael.getRGB("#BA55D3 "), // 186 85 211 - DarkOrchid : Raphael.getRGB("#9932CC "), // 153 50 204 - DarkViolet : Raphael.getRGB("#9400D3 "), // 148 0 211 - BlueViolet : Raphael.getRGB("#8A2BE2 "), // 138 43 226 - Purple : Raphael.getRGB("#A020F0 "), // 160 32 240 - MediumPurple : Raphael.getRGB("#9370DB "), // 147 112 219 - Thistle : Raphael.getRGB("#D8BFD8 "), // 216 191 216 - Snow1 : Raphael.getRGB("#FFFAFA "), // 255 250 250 - Snow2 : Raphael.getRGB("#EEE9E9 "), // 238 233 233 - Snow3 : Raphael.getRGB("#CDC9C9 "), // 205 201 201 - Snow4 : Raphael.getRGB("#8B8989 "), // 139 137 137 - Seashell1 : Raphael.getRGB("#FFF5EE "), // 255 245 238 - Seashell2 : Raphael.getRGB("#EEE5DE "), // 238 229 222 - Seashell3 : Raphael.getRGB("#CDC5BF "), // 205 197 191 - Seashell4 : Raphael.getRGB("#8B8682 "), // 139 134 130 - AntiqueWhite1 : Raphael.getRGB("#FFEFDB "), // 255 239 219 - AntiqueWhite2 : Raphael.getRGB("#EEDFCC "), // 238 223 204 - AntiqueWhite3 : Raphael.getRGB("#CDC0B0 "), // 205 192 176 - AntiqueWhite4 : Raphael.getRGB("#8B8378 "), // 139 131 120 - Bisque1 : Raphael.getRGB("#FFE4C4 "), // 255 228 196 - Bisque2 : Raphael.getRGB("#EED5B7 "), // 238 213 183 - Bisque3 : Raphael.getRGB("#CDB79E "), // 205 183 158 - Bisque4 : Raphael.getRGB("#8B7D6B "), // 139 125 107 - PeachPuff1 : Raphael.getRGB("#FFDAB9 "), // 255 218 185 - PeachPuff2 : Raphael.getRGB("#EECBAD "), // 238 203 173 - PeachPuff3 : Raphael.getRGB("#CDAF95 "), // 205 175 149 - PeachPuff4 : Raphael.getRGB("#8B7765 "), // 139 119 101 - NavajoWhite1 : Raphael.getRGB("#FFDEAD "), // 255 222 173 - NavajoWhite2 : Raphael.getRGB("#EECFA1 "), // 238 207 161 - NavajoWhite3 : Raphael.getRGB("#CDB38B "), // 205 179 139 - NavajoWhite4 : Raphael.getRGB("#8B795E "), // 139 121 94 - LemonChiffon1 : Raphael.getRGB("#FFFACD "), // 255 250 205 - LemonChiffon2 : Raphael.getRGB("#EEE9BF "), // 238 233 191 - LemonChiffon3 : Raphael.getRGB("#CDC9A5 "), // 205 201 165 - LemonChiffon4 : Raphael.getRGB("#8B8970 "), // 139 137 112 - Cornsilk1 : Raphael.getRGB("#FFF8DC "), // 255 248 220 - Cornsilk2 : Raphael.getRGB("#EEE8CD "), // 238 232 205 - Cornsilk3 : Raphael.getRGB("#CDC8B1 "), // 205 200 177 - Cornsilk4 : Raphael.getRGB("#8B8878 "), // 139 136 120 - Ivory1 : Raphael.getRGB("#FFFFF0 "), // 255 255 240 - Ivory2 : Raphael.getRGB("#EEEEE0 "), // 238 238 224 - Ivory3 : Raphael.getRGB("#CDCDC1 "), // 205 205 193 - Ivory4 : Raphael.getRGB("#8B8B83 "), // 139 139 131 - Honeydew1 : Raphael.getRGB("#F0FFF0 "), // 240 255 240 - Honeydew2 : Raphael.getRGB("#E0EEE0 "), // 224 238 224 - Honeydew3 : Raphael.getRGB("#C1CDC1 "), // 193 205 193 - Honeydew4 : Raphael.getRGB("#838B83 "), // 131 139 131 - LavenderBlush1 : Raphael.getRGB("#FFF0F5 "), // 255 240 245 - LavenderBlush2 : Raphael.getRGB("#EEE0E5 "), // 238 224 229 - LavenderBlush3 : Raphael.getRGB("#CDC1C5 "), // 205 193 197 - LavenderBlush4 : Raphael.getRGB("#8B8386 "), // 139 131 134 - MistyRose1 : Raphael.getRGB("#FFE4E1 "), // 255 228 225 - MistyRose2 : Raphael.getRGB("#EED5D2 "), // 238 213 210 - MistyRose3 : Raphael.getRGB("#CDB7B5 "), // 205 183 181 - MistyRose4 : Raphael.getRGB("#8B7D7B "), // 139 125 123 - Azure1 : Raphael.getRGB("#F0FFFF "), // 240 255 255 - Azure2 : Raphael.getRGB("#E0EEEE "), // 224 238 238 - Azure3 : Raphael.getRGB("#C1CDCD "), // 193 205 205 - Azure4 : Raphael.getRGB("#838B8B "), // 131 139 139 - SlateBlue1 : Raphael.getRGB("#836FFF "), // 131 111 255 - SlateBlue2 : Raphael.getRGB("#7A67EE "), // 122 103 238 - SlateBlue3 : Raphael.getRGB("#6959CD "), // 105 89 205 - SlateBlue4 : Raphael.getRGB("#473C8B "), // 71 60 139 - RoyalBlue1 : Raphael.getRGB("#4876FF "), // 72 118 255 - RoyalBlue2 : Raphael.getRGB("#436EEE "), // 67 110 238 - RoyalBlue3 : Raphael.getRGB("#3A5FCD "), // 58 95 205 - RoyalBlue4 : Raphael.getRGB("#27408B "), // 39 64 139 - Blue1 : Raphael.getRGB("#0000FF "), // 0 0 255 - Blue2 : Raphael.getRGB("#0000EE "), // 0 0 238 - Blue3 : Raphael.getRGB("#0000CD "), // 0 0 205 - Blue4 : Raphael.getRGB("#00008B "), // 0 0 139 - DodgerBlue1 : Raphael.getRGB("#1E90FF "), // 30 144 255 - DodgerBlue2 : Raphael.getRGB("#1C86EE "), // 28 134 238 - DodgerBlue3 : Raphael.getRGB("#1874CD "), // 24 116 205 - DodgerBlue4 : Raphael.getRGB("#104E8B "), // 16 78 139 - SteelBlue1 : Raphael.getRGB("#63B8FF "), // 99 184 255 - SteelBlue2 : Raphael.getRGB("#5CACEE "), // 92 172 238 - SteelBlue3 : Raphael.getRGB("#4F94CD "), // 79 148 205 - SteelBlue4 : Raphael.getRGB("#36648B "), // 54 100 139 - DeepSkyBlue1 : Raphael.getRGB("#00BFFF "), // 0 191 255 - DeepSkyBlue2 : Raphael.getRGB("#00B2EE "), // 0 178 238 - DeepSkyBlue3 : Raphael.getRGB("#009ACD "), // 0 154 205 - DeepSkyBlue4 : Raphael.getRGB("#00688B "), // 0 104 139 - SkyBlue1 : Raphael.getRGB("#87CEFF "), // 135 206 255 - SkyBlue2 : Raphael.getRGB("#7EC0EE "), // 126 192 238 - SkyBlue3 : Raphael.getRGB("#6CA6CD "), // 108 166 205 - SkyBlue4 : Raphael.getRGB("#4A708B "), // 74 112 139 - LightSkyBlue1 : Raphael.getRGB("#B0E2FF "), // 176 226 255 - LightSkyBlue2 : Raphael.getRGB("#A4D3EE "), // 164 211 238 - LightSkyBlue3 : Raphael.getRGB("#8DB6CD "), // 141 182 205 - LightSkyBlue4 : Raphael.getRGB("#607B8B "), // 96 123 139 - SlateGray1 : Raphael.getRGB("#C6E2FF "), // 198 226 255 - SlateGray2 : Raphael.getRGB("#B9D3EE "), // 185 211 238 - SlateGray3 : Raphael.getRGB("#9FB6CD "), // 159 182 205 - SlateGray4 : Raphael.getRGB("#6C7B8B "), // 108 123 139 - LightSteelBlue1 : Raphael.getRGB("#CAE1FF "), // 202 225 255 - LightSteelBlue2 : Raphael.getRGB("#BCD2EE "), // 188 210 238 - LightSteelBlue3 : Raphael.getRGB("#A2B5CD "), // 162 181 205 - LightSteelBlue4 : Raphael.getRGB("#6E7B8B "), // 110 123 139 - LightBlue1 : Raphael.getRGB("#BFEFFF "), // 191 239 255 - LightBlue2 : Raphael.getRGB("#B2DFEE "), // 178 223 238 - LightBlue3 : Raphael.getRGB("#9AC0CD "), // 154 192 205 - LightBlue4 : Raphael.getRGB("#68838B "), // 104 131 139 - LightCyan1 : Raphael.getRGB("#E0FFFF "), // 224 255 255 - LightCyan2 : Raphael.getRGB("#D1EEEE "), // 209 238 238 - LightCyan3 : Raphael.getRGB("#B4CDCD "), // 180 205 205 - LightCyan4 : Raphael.getRGB("#7A8B8B "), // 122 139 139 - PaleTurquoise1 : Raphael.getRGB("#BBFFFF "), // 187 255 255 - PaleTurquoise2 : Raphael.getRGB("#AEEEEE "), // 174 238 238 - PaleTurquoise3 : Raphael.getRGB("#96CDCD "), // 150 205 205 - PaleTurquoise4 : Raphael.getRGB("#668B8B "), // 102 139 139 - CadetBlue1 : Raphael.getRGB("#98F5FF "), // 152 245 255 - CadetBlue2 : Raphael.getRGB("#8EE5EE "), // 142 229 238 - CadetBlue3 : Raphael.getRGB("#7AC5CD "), // 122 197 205 - CadetBlue4 : Raphael.getRGB("#53868B "), // 83 134 139 - Turquoise1 : Raphael.getRGB("#00F5FF "), // 0 245 255 - Turquoise2 : Raphael.getRGB("#00E5EE "), // 0 229 238 - Turquoise3 : Raphael.getRGB("#00C5CD "), // 0 197 205 - Turquoise4 : Raphael.getRGB("#00868B "), // 0 134 139 - Cyan1 : Raphael.getRGB("#00FFFF "), // 0 255 255 - Cyan2 : Raphael.getRGB("#00EEEE "), // 0 238 238 - Cyan3 : Raphael.getRGB("#00CDCD "), // 0 205 205 - Cyan4 : Raphael.getRGB("#008B8B "), // 0 139 139 - DarkSlateGray1 : Raphael.getRGB("#97FFFF "), // 151 255 255 - DarkSlateGray2 : Raphael.getRGB("#8DEEEE "), // 141 238 238 - DarkSlateGray3 : Raphael.getRGB("#79CDCD "), // 121 205 205 - DarkSlateGray4 : Raphael.getRGB("#528B8B "), // 82 139 139 - Aquamarine1 : Raphael.getRGB("#7FFFD4 "), // 127 255 212 - Aquamarine2 : Raphael.getRGB("#76EEC6 "), // 118 238 198 - Aquamarine3 : Raphael.getRGB("#66CDAA "), // 102 205 170 - Aquamarine4 : Raphael.getRGB("#458B74 "), // 69 139 116 - DarkSeaGreen1 : Raphael.getRGB("#C1FFC1 "), // 193 255 193 - DarkSeaGreen2 : Raphael.getRGB("#B4EEB4 "), // 180 238 180 - DarkSeaGreen3 : Raphael.getRGB("#9BCD9B "), // 155 205 155 - DarkSeaGreen4 : Raphael.getRGB("#698B69 "), // 105 139 105 - SeaGreen1 : Raphael.getRGB("#54FF9F "), // 84 255 159 - SeaGreen2 : Raphael.getRGB("#4EEE94 "), // 78 238 148 - SeaGreen3 : Raphael.getRGB("#43CD80 "), // 67 205 128 - SeaGreen4 : Raphael.getRGB("#2E8B57 "), // 46 139 87 - PaleGreen1 : Raphael.getRGB("#9AFF9A "), // 154 255 154 - PaleGreen2 : Raphael.getRGB("#90EE90 "), // 144 238 144 - PaleGreen3 : Raphael.getRGB("#7CCD7C "), // 124 205 124 - PaleGreen4 : Raphael.getRGB("#548B54 "), // 84 139 84 - SpringGreen1 : Raphael.getRGB("#00FF7F "), // 0 255 127 - SpringGreen2 : Raphael.getRGB("#00EE76 "), // 0 238 118 - SpringGreen3 : Raphael.getRGB("#00CD66 "), // 0 205 102 - SpringGreen4 : Raphael.getRGB("#008B45 "), // 0 139 69 - Green1 : Raphael.getRGB("#00FF00 "), // 0 255 0 - Green2 : Raphael.getRGB("#00EE00 "), // 0 238 0 - Green3 : Raphael.getRGB("#00CD00 "), // 0 205 0 - Green4 : Raphael.getRGB("#008B00 "), // 0 139 0 - Chartreuse1 : Raphael.getRGB("#7FFF00 "), // 127 255 0 - Chartreuse2 : Raphael.getRGB("#76EE00 "), // 118 238 0 - Chartreuse3 : Raphael.getRGB("#66CD00 "), // 102 205 0 - Chartreuse4 : Raphael.getRGB("#458B00 "), // 69 139 0 - OliveDrab1 : Raphael.getRGB("#C0FF3E "), // 192 255 62 - OliveDrab2 : Raphael.getRGB("#B3EE3A "), // 179 238 58 - OliveDrab3 : Raphael.getRGB("#9ACD32 "), // 154 205 50 - OliveDrab4 : Raphael.getRGB("#698B22 "), // 105 139 34 - DarkOliveGreen1 : Raphael.getRGB("#CAFF70 "), // 202 255 112 - DarkOliveGreen2 : Raphael.getRGB("#BCEE68 "), // 188 238 104 - DarkOliveGreen3 : Raphael.getRGB("#A2CD5A "), // 162 205 90 - DarkOliveGreen4 : Raphael.getRGB("#6E8B3D "), // 110 139 61 - Khaki1 : Raphael.getRGB("#FFF68F "), // 255 246 143 - Khaki2 : Raphael.getRGB("#EEE685 "), // 238 230 133 - Khaki3 : Raphael.getRGB("#CDC673 "), // 205 198 115 - Khaki4 : Raphael.getRGB("#8B864E "), // 139 134 78 - LightGoldenrod1 : Raphael.getRGB("#FFEC8B "), // 255 236 139 - LightGoldenrod2 : Raphael.getRGB("#EEDC82 "), // 238 220 130 - LightGoldenrod3 : Raphael.getRGB("#CDBE70 "), // 205 190 112 - LightGoldenrod4 : Raphael.getRGB("#8B814C "), // 139 129 76 - LightYellow1 : Raphael.getRGB("#FFFFE0 "), // 255 255 224 - LightYellow2 : Raphael.getRGB("#EEEED1 "), // 238 238 209 - LightYellow3 : Raphael.getRGB("#CDCDB4 "), // 205 205 180 - LightYellow4 : Raphael.getRGB("#8B8B7A "), // 139 139 122 - Yellow1 : Raphael.getRGB("#FFFF00 "), // 255 255 0 - Yellow2 : Raphael.getRGB("#EEEE00 "), // 238 238 0 - Yellow3 : Raphael.getRGB("#CDCD00 "), // 205 205 0 - Yellow4 : Raphael.getRGB("#8B8B00 "), // 139 139 0 - Gold1 : Raphael.getRGB("#FFD700 "), // 255 215 0 - Gold2 : Raphael.getRGB("#EEC900 "), // 238 201 0 - Gold3 : Raphael.getRGB("#CDAD00 "), // 205 173 0 - Gold4 : Raphael.getRGB("#8B7500 "), // 139 117 0 - Goldenrod1 : Raphael.getRGB("#FFC125 "), // 255 193 37 - Goldenrod2 : Raphael.getRGB("#EEB422 "), // 238 180 34 - Goldenrod3 : Raphael.getRGB("#CD9B1D "), // 205 155 29 - Goldenrod4 : Raphael.getRGB("#8B6914 "), // 139 105 20 - DarkGoldenrod1 : Raphael.getRGB("#FFB90F "), // 255 185 15 - DarkGoldenrod2 : Raphael.getRGB("#EEAD0E "), // 238 173 14 - DarkGoldenrod3 : Raphael.getRGB("#CD950C "), // 205 149 12 - DarkGoldenrod4 : Raphael.getRGB("#8B658B "), // 139 101 8 - RosyBrown1 : Raphael.getRGB("#FFC1C1 "), // 255 193 193 - RosyBrown2 : Raphael.getRGB("#EEB4B4 "), // 238 180 180 - RosyBrown3 : Raphael.getRGB("#CD9B9B "), // 205 155 155 - RosyBrown4 : Raphael.getRGB("#8B6969 "), // 139 105 105 - IndianRed1 : Raphael.getRGB("#FF6A6A "), // 255 106 106 - IndianRed2 : Raphael.getRGB("#EE6363 "), // 238 99 99 - IndianRed3 : Raphael.getRGB("#CD5555 "), // 205 85 85 - IndianRed4 : Raphael.getRGB("#8B3A3A "), // 139 58 58 - Sienna1 : Raphael.getRGB("#FF8247 "), // 255 130 71 - Sienna2 : Raphael.getRGB("#EE7942 "), // 238 121 66 - Sienna3 : Raphael.getRGB("#CD6839 "), // 205 104 57 - Sienna4 : Raphael.getRGB("#8B4726 "), // 139 71 38 - Burlywood1 : Raphael.getRGB("#FFD39B "), // 255 211 155 - Burlywood2 : Raphael.getRGB("#EEC591 "), // 238 197 145 - Burlywood3 : Raphael.getRGB("#CDAA7D "), // 205 170 125 - Burlywood4 : Raphael.getRGB("#8B7355 "), // 139 115 85 - Wheat1 : Raphael.getRGB("#FFE7BA "), // 255 231 186 - Wheat2 : Raphael.getRGB("#EED8AE "), // 238 216 174 - Wheat3 : Raphael.getRGB("#CDBA96 "), // 205 186 150 - Wheat4 : Raphael.getRGB("#8B7E66 "), // 139 126 102 - Tan1 : Raphael.getRGB("#FFA54F "), // 255 165 79 - Tan2 : Raphael.getRGB("#EE9A49 "), // 238 154 73 - Tan3 : Raphael.getRGB("#CD853F "), // 205 133 63 - Tan4 : Raphael.getRGB("#8B5A2B "), // 139 90 43 - Chocolate1 : Raphael.getRGB("#FF7F24 "), // 255 127 36 - Chocolate2 : Raphael.getRGB("#EE7621 "), // 238 118 33 - Chocolate3 : Raphael.getRGB("#CD661D "), // 205 102 29 - Chocolate4 : Raphael.getRGB("#8B4513 "), // 139 69 19 - Firebrick1 : Raphael.getRGB("#FF3030 "), // 255 48 48 - Firebrick2 : Raphael.getRGB("#EE2C2C "), // 238 44 44 - Firebrick3 : Raphael.getRGB("#CD2626 "), // 205 38 38 - Firebrick4 : Raphael.getRGB("#8B1A1A "), // 139 26 26 - Brown1 : Raphael.getRGB("#FF4040 "), // 255 64 64 - Brown2 : Raphael.getRGB("#EE3B3B "), // 238 59 59 - Brown3 : Raphael.getRGB("#CD3333 "), // 205 51 51 - Brown4 : Raphael.getRGB("#8B2323 "), // 139 35 35 - Salmon1 : Raphael.getRGB("#FF8C69 "), // 255 140 105 - Salmon2 : Raphael.getRGB("#EE8262 "), // 238 130 98 - Salmon3 : Raphael.getRGB("#CD7054 "), // 205 112 84 - Salmon4 : Raphael.getRGB("#8B4C39 "), // 139 76 57 - LightSalmon1 : Raphael.getRGB("#FFA07A "), // 255 160 122 - LightSalmon2 : Raphael.getRGB("#EE9572 "), // 238 149 114 - LightSalmon3 : Raphael.getRGB("#CD8162 "), // 205 129 98 - LightSalmon4 : Raphael.getRGB("#8B5742 "), // 139 87 66 - Orange1 : Raphael.getRGB("#FFA500 "), // 255 165 0 - Orange2 : Raphael.getRGB("#EE9A00 "), // 238 154 0 - Orange3 : Raphael.getRGB("#CD8500 "), // 205 133 0 - Orange4 : Raphael.getRGB("#8B5A00 "), // 139 90 0 - DarkOrange1 : Raphael.getRGB("#FF7F00 "), // 255 127 0 - DarkOrange2 : Raphael.getRGB("#EE7600 "), // 238 118 0 - DarkOrange3 : Raphael.getRGB("#CD6600 "), // 205 102 0 - DarkOrange4 : Raphael.getRGB("#8B4500 "), // 139 69 0 - Coral1 : Raphael.getRGB("#FF7256 "), // 255 114 86 - Coral2 : Raphael.getRGB("#EE6A50 "), // 238 106 80 - Coral3 : Raphael.getRGB("#CD5B45 "), // 205 91 69 - Coral4 : Raphael.getRGB("#8B3E2F "), // 139 62 47 - Tomato1 : Raphael.getRGB("#FF6347 "), // 255 99 71 - Tomato2 : Raphael.getRGB("#EE5C42 "), // 238 92 66 - Tomato3 : Raphael.getRGB("#CD4F39 "), // 205 79 57 - Tomato4 : Raphael.getRGB("#8B3626 "), // 139 54 38 - OrangeRed1 : Raphael.getRGB("#FF4500 "), // 255 69 0 - OrangeRed2 : Raphael.getRGB("#EE4000 "), // 238 64 0 - OrangeRed3 : Raphael.getRGB("#CD3700 "), // 205 55 0 - OrangeRed4 : Raphael.getRGB("#8B2500 "), // 139 37 0 - Red1 : Raphael.getRGB("#FF0000 "), // 255 0 0 - Red2 : Raphael.getRGB("#EE0000 "), // 238 0 0 - Red3 : Raphael.getRGB("#CD0000 "), // 205 0 0 - Red4 : Raphael.getRGB("#8B0000 "), // 139 0 0 - DeepPink1 : Raphael.getRGB("#FF1493 "), // 255 20 147 - DeepPink2 : Raphael.getRGB("#EE1289 "), // 238 18 137 - DeepPink3 : Raphael.getRGB("#CD1076 "), // 205 16 118 - DeepPink4 : Raphael.getRGB("#8B0A50 "), // 139 10 80 - HotPink1 : Raphael.getRGB("#FF6EB4 "), // 255 110 180 - HotPink2 : Raphael.getRGB("#EE6AA7 "), // 238 106 167 - HotPink3 : Raphael.getRGB("#CD6090 "), // 205 96 144 - HotPink4 : Raphael.getRGB("#8B3A62 "), // 139 58 98 - Pink1 : Raphael.getRGB("#FFB5C5 "), // 255 181 197 - Pink2 : Raphael.getRGB("#EEA9B8 "), // 238 169 184 - Pink3 : Raphael.getRGB("#CD919E "), // 205 145 158 - Pink4 : Raphael.getRGB("#8B636C "), // 139 99 108 - LightPink1 : Raphael.getRGB("#FFAEB9 "), // 255 174 185 - LightPink2 : Raphael.getRGB("#EEA2AD "), // 238 162 173 - LightPink3 : Raphael.getRGB("#CD8C95 "), // 205 140 149 - LightPink4 : Raphael.getRGB("#8B5F65 "), // 139 95 101 - PaleVioletRed1 : Raphael.getRGB("#FF82AB "), // 255 130 171 - PaleVioletRed2 : Raphael.getRGB("#EE799F "), // 238 121 159 - PaleVioletRed3 : Raphael.getRGB("#CD6889 "), // 205 104 137 - PaleVioletRed4 : Raphael.getRGB("#8B475D "), // 139 71 93 - Maroon1 : Raphael.getRGB("#FF34B3 "), // 255 52 179 - Maroon2 : Raphael.getRGB("#EE30A7 "), // 238 48 167 - Maroon3 : Raphael.getRGB("#CD2990 "), // 205 41 144 - Maroon4 : Raphael.getRGB("#8B1C62 "), // 139 28 98 - VioletRed1 : Raphael.getRGB("#FF3E96 "), // 255 62 150 - VioletRed2 : Raphael.getRGB("#EE3A8C "), // 238 58 140 - VioletRed3 : Raphael.getRGB("#CD3278 "), // 205 50 120 - VioletRed4 : Raphael.getRGB("#8B2252 "), // 139 34 82 - Magenta1 : Raphael.getRGB("#FF00FF "), // 255 0 255 - Magenta2 : Raphael.getRGB("#EE00EE "), // 238 0 238 - Magenta3 : Raphael.getRGB("#CD00CD "), // 205 0 205 - Magenta4 : Raphael.getRGB("#8B008B "), // 139 0 139 - Orchid1 : Raphael.getRGB("#FF83FA "), // 255 131 250 - Orchid2 : Raphael.getRGB("#EE7AE9 "), // 238 122 233 - Orchid3 : Raphael.getRGB("#CD69C9 "), // 205 105 201 - Orchid4 : Raphael.getRGB("#8B4789 "), // 139 71 137 - Plum1 : Raphael.getRGB("#FFBBFF "), // 255 187 255 - Plum2 : Raphael.getRGB("#EEAEEE "), // 238 174 238 - Plum3 : Raphael.getRGB("#CD96CD "), // 205 150 205 - Plum4 : Raphael.getRGB("#8B668B "), // 139 102 139 - MediumOrchid1 : Raphael.getRGB("#E066FF "), // 224 102 255 - MediumOrchid2 : Raphael.getRGB("#D15FEE "), // 209 95 238 - MediumOrchid3 : Raphael.getRGB("#B452CD "), // 180 82 205 - MediumOrchid4 : Raphael.getRGB("#7A378B "), // 122 55 139 - DarkOrchid1 : Raphael.getRGB("#BF3EFF "), // 191 62 255 - DarkOrchid2 : Raphael.getRGB("#B23AEE "), // 178 58 238 - DarkOrchid3 : Raphael.getRGB("#9A32CD "), // 154 50 205 - DarkOrchid4 : Raphael.getRGB("#68228B "), // 104 34 139 - Purple1 : Raphael.getRGB("#9B30FF "), // 155 48 255 - Purple2 : Raphael.getRGB("#912CEE "), // 145 44 238 - Purple3 : Raphael.getRGB("#7D26CD "), // 125 38 205 - Purple4 : Raphael.getRGB("#551A8B "), // 85 26 139 - MediumPurple1 : Raphael.getRGB("#AB82FF "), // 171 130 255 - MediumPurple2 : Raphael.getRGB("#9F79EE "), // 159 121 238 - MediumPurple3 : Raphael.getRGB("#8968CD "), // 137 104 205 - MediumPurple4 : Raphael.getRGB("#5D478B "), // 93 71 139 - Thistle1 : Raphael.getRGB("#FFE1FF "), // 255 225 255 - Thistle2 : Raphael.getRGB("#EED2EE "), // 238 210 238 - Thistle3 : Raphael.getRGB("#CDB5CD "), // 205 181 205 - Thistle4 : Raphael.getRGB("#8B7B8B "), // 139 123 139 - grey11 : Raphael.getRGB("#1C1C1C "), // 28 28 28 - grey21 : Raphael.getRGB("#363636 "), // 54 54 54 - grey31 : Raphael.getRGB("#4F4F4F "), // 79 79 79 - grey41 : Raphael.getRGB("#696969 "), // 105 105 105 - grey51 : Raphael.getRGB("#828282 "), // 130 130 130 - grey61 : Raphael.getRGB("#9C9C9C "), // 156 156 156 - grey71 : Raphael.getRGB("#B5B5B5 "), // 181 181 181 - gray81 : Raphael.getRGB("#CFCFCF "), // 207 207 207 - gray91 : Raphael.getRGB("#E8E8E8 "), // 232 232 232 - DarkGrey : Raphael.getRGB("#A9A9A9 "), // 169 169 169 - DarkBlue : Raphael.getRGB("#00008B "), // 0 0 139 - DarkCyan : Raphael.getRGB("#008B8B "), // 0 139 139 - DarkMagenta : Raphael.getRGB("#8B008B "), // 139 0 139 - DarkRed : Raphael.getRGB("#8B0000 "), // 139 0 0 - LightGreen : Raphael.getRGB("#90EE90 "), // 144 238 144 + /** + * The color white. In the default sRGB space. + */ + WHITE: this.white, - - - get: function(R, G, B){ - return Raphael.getRGB("rgb(" + R + ", " + G + ", " + B + ")"); - } -}; \ No newline at end of file + /** + * The color light gray. In the default sRGB space. + */ + lightGray: Raphael.getRGB("rgb(192, 192, 192)"), + + /** + * The color light gray. In the default sRGB space. + */ + LIGHT_GRAY: this.lightGray, + + /** + * The color gray. In the default sRGB space. + */ + gray: Raphael.getRGB("rgb(128, 128, 128)"), + + /** + * The color gray. In the default sRGB space. + */ + GRAY: this.gray, + + /** + * The color dark gray. In the default sRGB space. + */ + darkGray: Raphael.getRGB("rgb(64, 64, 64)"), + + /** + * The color dark gray. In the default sRGB space. + */ + DARK_GRAY: this.darkGray, + + /** + * The color black. In the default sRGB space. + */ + black: Raphael.getRGB("rgb(0, 0, 0)"), + + /** + * The color black. In the default sRGB space. + */ + BLACK: this.black, + + /** + * The color red. In the default sRGB space. + */ + red: Raphael.getRGB("rgb(255, 0, 0)"), + + /** + * The color red. In the default sRGB space. + */ + RED: this.red, + + /** + * The color pink. In the default sRGB space. + */ + pink: Raphael.getRGB("rgb(255, 175, 175)"), + + /** + * The color pink. In the default sRGB space. + */ + PINK: this.pink, + + /** + * The color orange. In the default sRGB space. + */ + orange: Raphael.getRGB("rgb(255, 200, 0)"), + + /** + * The color orange. In the default sRGB space. + */ + ORANGE: this.orange, + + /** + * The color yellow. In the default sRGB space. + */ + yellow: Raphael.getRGB("rgb(255, 255, 0)"), + + /** + * The color yellow. In the default sRGB space. + */ + YELLOW: this.yellow, + + /** + * The color green. In the default sRGB space. + */ + green: Raphael.getRGB("rgb(0, 255, 0)"), + + /** + * The color green. In the default sRGB space. + */ + GREEN: this.green, + + /** + * The color magenta. In the default sRGB space. + */ + magenta: Raphael.getRGB("rgb(255, 0, 255)"), + + /** + * The color magenta. In the default sRGB space. + */ + MAGENTA: this.magenta, + + /** + * The color cyan. In the default sRGB space. + */ + cyan: Raphael.getRGB("rgb(0, 255, 255)"), + + /** + * The color cyan. In the default sRGB space. + */ + CYAN: this.cyan, + + /** + * The color blue. In the default sRGB space. + */ + blue: Raphael.getRGB("rgb(0, 0, 255)"), + + /** + * The color blue. In the default sRGB space. + */ + BLUE: this.blue, + + /************************************************************************/ + + // http://www.stm.dp.ua/web-design/color-html.php + + Snow: Raphael.getRGB("#FFFAFA "), // 255 250 250 + GhostWhite: Raphael.getRGB("#F8F8FF "), // 248 248 255 + WhiteSmoke: Raphael.getRGB("#F5F5F5 "), // 245 245 245 + Gainsboro: Raphael.getRGB("#DCDCDC "), // 220 220 220 + FloralWhite: Raphael.getRGB("#FFFAF0 "), // 255 250 240 + OldLace: Raphael.getRGB("#FDF5E6 "), // 253 245 230 + Linen: Raphael.getRGB("#FAF0E6 "), // 250 240 230 + AntiqueWhite: Raphael.getRGB("#FAEBD7 "), // 250 235 215 + PapayaWhip: Raphael.getRGB("#FFEFD5 "), // 255 239 213 + BlanchedAlmond: Raphael.getRGB("#FFEBCD "), // 255 235 205 + Bisque: Raphael.getRGB("#FFE4C4 "), // 255 228 196 + PeachPuff: Raphael.getRGB("#FFDAB9 "), // 255 218 185 + NavajoWhite: Raphael.getRGB("#FFDEAD "), // 255 222 173 + Moccasin: Raphael.getRGB("#FFE4B5 "), // 255 228 181 + Cornsilk: Raphael.getRGB("#FFF8DC "), // 255 248 220 + Ivory: Raphael.getRGB("#FFFFF0 "), // 255 255 240 + LemonChiffon: Raphael.getRGB("#FFFACD "), // 255 250 205 + Seashell: Raphael.getRGB("#FFF5EE "), // 255 245 238 + Honeydew: Raphael.getRGB("#F0FFF0 "), // 240 255 240 + MintCream: Raphael.getRGB("#F5FFFA "), // 245 255 250 + Azure: Raphael.getRGB("#F0FFFF "), // 240 255 255 + AliceBlue: Raphael.getRGB("#F0F8FF "), // 240 248 255 + lavender: Raphael.getRGB("#E6E6FA "), // 230 230 250 + LavenderBlush: Raphael.getRGB("#FFF0F5 "), // 255 240 245 + MistyRose: Raphael.getRGB("#FFE4E1 "), // 255 228 225 + White: Raphael.getRGB("#FFFFFF "), // 255 255 255 + Black: Raphael.getRGB("#000000 "), // 0 0 0 + DarkSlateGray: Raphael.getRGB("#2F4F4F "), // 47 79 79 + DimGrey: Raphael.getRGB("#696969 "), // 105 105 105 + SlateGrey: Raphael.getRGB("#708090 "), // 112 128 144 + LightSlateGray: Raphael.getRGB("#778899 "), // 119 136 153 + Grey: Raphael.getRGB("#BEBEBE "), // 190 190 190 + LightGray: Raphael.getRGB("#D3D3D3 "), // 211 211 211 + MidnightBlue: Raphael.getRGB("#191970 "), // 25 25 112 + NavyBlue: Raphael.getRGB("#000080 "), // 0 0 128 + CornflowerBlue: Raphael.getRGB("#6495ED "), // 100 149 237 + DarkSlateBlue: Raphael.getRGB("#483D8B "), // 72 61 139 + SlateBlue: Raphael.getRGB("#6A5ACD "), // 106 90 205 + MediumSlateBlue: Raphael.getRGB("#7B68EE "), // 123 104 238 + LightSlateBlue: Raphael.getRGB("#8470FF "), // 132 112 255 + MediumBlue: Raphael.getRGB("#0000CD "), // 0 0 205 + RoyalBlue: Raphael.getRGB("#4169E1 "), // 65 105 225 + Blue: Raphael.getRGB("#0000FF "), // 0 0 255 + DodgerBlue: Raphael.getRGB("#1E90FF "), // 30 144 255 + DeepSkyBlue: Raphael.getRGB("#00BFFF "), // 0 191 255 + SkyBlue: Raphael.getRGB("#87CEEB "), // 135 206 235 + LightSkyBlue: Raphael.getRGB("#87CEFA "), // 135 206 250 + SteelBlue: Raphael.getRGB("#4682B4 "), // 70 130 180 + LightSteelBlue: Raphael.getRGB("#B0C4DE "), // 176 196 222 + LightBlue: Raphael.getRGB("#ADD8E6 "), // 173 216 230 + PowderBlue: Raphael.getRGB("#B0E0E6 "), // 176 224 230 + PaleTurquoise: Raphael.getRGB("#AFEEEE "), // 175 238 238 + DarkTurquoise: Raphael.getRGB("#00CED1 "), // 0 206 209 + MediumTurquoise: Raphael.getRGB("#48D1CC "), // 72 209 204 + Turquoise: Raphael.getRGB("#40E0D0 "), // 64 224 208 + Cyan: Raphael.getRGB("#00FFFF "), // 0 255 255 + LightCyan: Raphael.getRGB("#E0FFFF "), // 224 255 255 + CadetBlue: Raphael.getRGB("#5F9EA0 "), // 95 158 160 + MediumAquamarine: Raphael.getRGB("#66CDAA "), // 102 205 170 + Aquamarine: Raphael.getRGB("#7FFFD4 "), // 127 255 212 + DarkGreen: Raphael.getRGB("#006400 "), // 0 100 0 + DarkOliveGreen: Raphael.getRGB("#556B2F "), // 85 107 47 + DarkSeaGreen: Raphael.getRGB("#8FBC8F "), // 143 188 143 + SeaGreen: Raphael.getRGB("#2E8B57 "), // 46 139 87 + MediumSeaGreen: Raphael.getRGB("#3CB371 "), // 60 179 113 + LightSeaGreen: Raphael.getRGB("#20B2AA "), // 32 178 170 + PaleGreen: Raphael.getRGB("#98FB98 "), // 152 251 152 + SpringGreen: Raphael.getRGB("#00FF7F "), // 0 255 127 + LawnGreen: Raphael.getRGB("#7CFC00 "), // 124 252 0 + Green: Raphael.getRGB("#00FF00 "), // 0 255 0 + Chartreuse: Raphael.getRGB("#7FFF00 "), // 127 255 0 + MedSpringGreen: Raphael.getRGB("#00FA9A "), // 0 250 154 + GreenYellow: Raphael.getRGB("#ADFF2F "), // 173 255 47 + LimeGreen: Raphael.getRGB("#32CD32 "), // 50 205 50 + YellowGreen: Raphael.getRGB("#9ACD32 "), // 154 205 50 + ForestGreen: Raphael.getRGB("#228B22 "), // 34 139 34 + OliveDrab: Raphael.getRGB("#6B8E23 "), // 107 142 35 + DarkKhaki: Raphael.getRGB("#BDB76B "), // 189 183 107 + PaleGoldenrod: Raphael.getRGB("#EEE8AA "), // 238 232 170 + LtGoldenrodYello: Raphael.getRGB("#FAFAD2 "), // 250 250 210 + LightYellow: Raphael.getRGB("#FFFFE0 "), // 255 255 224 + Yellow: Raphael.getRGB("#FFFF00 "), // 255 255 0 + Gold: Raphael.getRGB("#FFD700 "), // 255 215 0 + LightGoldenrod: Raphael.getRGB("#EEDD82 "), // 238 221 130 + goldenrod: Raphael.getRGB("#DAA520 "), // 218 165 32 + DarkGoldenrod: Raphael.getRGB("#B8860B "), // 184 134 11 + RosyBrown: Raphael.getRGB("#BC8F8F "), // 188 143 143 + IndianRed: Raphael.getRGB("#CD5C5C "), // 205 92 92 + SaddleBrown: Raphael.getRGB("#8B4513 "), // 139 69 19 + Sienna: Raphael.getRGB("#A0522D "), // 160 82 45 + Peru: Raphael.getRGB("#CD853F "), // 205 133 63 + Burlywood: Raphael.getRGB("#DEB887 "), // 222 184 135 + Beige: Raphael.getRGB("#F5F5DC "), // 245 245 220 + Wheat: Raphael.getRGB("#F5DEB3 "), // 245 222 179 + SandyBrown: Raphael.getRGB("#F4A460 "), // 244 164 96 + Tan: Raphael.getRGB("#D2B48C "), // 210 180 140 + Chocolate: Raphael.getRGB("#D2691E "), // 210 105 30 + Firebrick: Raphael.getRGB("#B22222 "), // 178 34 34 + Brown: Raphael.getRGB("#A52A2A "), // 165 42 42 + DarkSalmon: Raphael.getRGB("#E9967A "), // 233 150 122 + Salmon: Raphael.getRGB("#FA8072 "), // 250 128 114 + LightSalmon: Raphael.getRGB("#FFA07A "), // 255 160 122 + Orange: Raphael.getRGB("#FFA500 "), // 255 165 0 + DarkOrange: Raphael.getRGB("#FF8C00 "), // 255 140 0 + Coral: Raphael.getRGB("#FF7F50 "), // 255 127 80 + LightCoral: Raphael.getRGB("#F08080 "), // 240 128 128 + Tomato: Raphael.getRGB("#FF6347 "), // 255 99 71 + OrangeRed: Raphael.getRGB("#FF4500 "), // 255 69 0 + Red: Raphael.getRGB("#FF0000 "), // 255 0 0 + HotPink: Raphael.getRGB("#FF69B4 "), // 255 105 180 + DeepPink: Raphael.getRGB("#FF1493 "), // 255 20 147 + Pink: Raphael.getRGB("#FFC0CB "), // 255 192 203 + LightPink: Raphael.getRGB("#FFB6C1 "), // 255 182 193 + PaleVioletRed: Raphael.getRGB("#DB7093 "), // 219 112 147 + Maroon: Raphael.getRGB("#B03060 "), // 176 48 96 + MediumVioletRed: Raphael.getRGB("#C71585 "), // 199 21 133 + VioletRed: Raphael.getRGB("#D02090 "), // 208 32 144 + Magenta: Raphael.getRGB("#FF00FF "), // 255 0 255 + Violet: Raphael.getRGB("#EE82EE "), // 238 130 238 + Plum: Raphael.getRGB("#DDA0DD "), // 221 160 221 + Orchid: Raphael.getRGB("#DA70D6 "), // 218 112 214 + MediumOrchid: Raphael.getRGB("#BA55D3 "), // 186 85 211 + DarkOrchid: Raphael.getRGB("#9932CC "), // 153 50 204 + DarkViolet: Raphael.getRGB("#9400D3 "), // 148 0 211 + BlueViolet: Raphael.getRGB("#8A2BE2 "), // 138 43 226 + Purple: Raphael.getRGB("#A020F0 "), // 160 32 240 + MediumPurple: Raphael.getRGB("#9370DB "), // 147 112 219 + Thistle: Raphael.getRGB("#D8BFD8 "), // 216 191 216 + Snow1: Raphael.getRGB("#FFFAFA "), // 255 250 250 + Snow2: Raphael.getRGB("#EEE9E9 "), // 238 233 233 + Snow3: Raphael.getRGB("#CDC9C9 "), // 205 201 201 + Snow4: Raphael.getRGB("#8B8989 "), // 139 137 137 + Seashell1: Raphael.getRGB("#FFF5EE "), // 255 245 238 + Seashell2: Raphael.getRGB("#EEE5DE "), // 238 229 222 + Seashell3: Raphael.getRGB("#CDC5BF "), // 205 197 191 + Seashell4: Raphael.getRGB("#8B8682 "), // 139 134 130 + AntiqueWhite1: Raphael.getRGB("#FFEFDB "), // 255 239 219 + AntiqueWhite2: Raphael.getRGB("#EEDFCC "), // 238 223 204 + AntiqueWhite3: Raphael.getRGB("#CDC0B0 "), // 205 192 176 + AntiqueWhite4: Raphael.getRGB("#8B8378 "), // 139 131 120 + Bisque1: Raphael.getRGB("#FFE4C4 "), // 255 228 196 + Bisque2: Raphael.getRGB("#EED5B7 "), // 238 213 183 + Bisque3: Raphael.getRGB("#CDB79E "), // 205 183 158 + Bisque4: Raphael.getRGB("#8B7D6B "), // 139 125 107 + PeachPuff1: Raphael.getRGB("#FFDAB9 "), // 255 218 185 + PeachPuff2: Raphael.getRGB("#EECBAD "), // 238 203 173 + PeachPuff3: Raphael.getRGB("#CDAF95 "), // 205 175 149 + PeachPuff4: Raphael.getRGB("#8B7765 "), // 139 119 101 + NavajoWhite1: Raphael.getRGB("#FFDEAD "), // 255 222 173 + NavajoWhite2: Raphael.getRGB("#EECFA1 "), // 238 207 161 + NavajoWhite3: Raphael.getRGB("#CDB38B "), // 205 179 139 + NavajoWhite4: Raphael.getRGB("#8B795E "), // 139 121 94 + LemonChiffon1: Raphael.getRGB("#FFFACD "), // 255 250 205 + LemonChiffon2: Raphael.getRGB("#EEE9BF "), // 238 233 191 + LemonChiffon3: Raphael.getRGB("#CDC9A5 "), // 205 201 165 + LemonChiffon4: Raphael.getRGB("#8B8970 "), // 139 137 112 + Cornsilk1: Raphael.getRGB("#FFF8DC "), // 255 248 220 + Cornsilk2: Raphael.getRGB("#EEE8CD "), // 238 232 205 + Cornsilk3: Raphael.getRGB("#CDC8B1 "), // 205 200 177 + Cornsilk4: Raphael.getRGB("#8B8878 "), // 139 136 120 + Ivory1: Raphael.getRGB("#FFFFF0 "), // 255 255 240 + Ivory2: Raphael.getRGB("#EEEEE0 "), // 238 238 224 + Ivory3: Raphael.getRGB("#CDCDC1 "), // 205 205 193 + Ivory4: Raphael.getRGB("#8B8B83 "), // 139 139 131 + Honeydew1: Raphael.getRGB("#F0FFF0 "), // 240 255 240 + Honeydew2: Raphael.getRGB("#E0EEE0 "), // 224 238 224 + Honeydew3: Raphael.getRGB("#C1CDC1 "), // 193 205 193 + Honeydew4: Raphael.getRGB("#838B83 "), // 131 139 131 + LavenderBlush1: Raphael.getRGB("#FFF0F5 "), // 255 240 245 + LavenderBlush2: Raphael.getRGB("#EEE0E5 "), // 238 224 229 + LavenderBlush3: Raphael.getRGB("#CDC1C5 "), // 205 193 197 + LavenderBlush4: Raphael.getRGB("#8B8386 "), // 139 131 134 + MistyRose1: Raphael.getRGB("#FFE4E1 "), // 255 228 225 + MistyRose2: Raphael.getRGB("#EED5D2 "), // 238 213 210 + MistyRose3: Raphael.getRGB("#CDB7B5 "), // 205 183 181 + MistyRose4: Raphael.getRGB("#8B7D7B "), // 139 125 123 + Azure1: Raphael.getRGB("#F0FFFF "), // 240 255 255 + Azure2: Raphael.getRGB("#E0EEEE "), // 224 238 238 + Azure3: Raphael.getRGB("#C1CDCD "), // 193 205 205 + Azure4: Raphael.getRGB("#838B8B "), // 131 139 139 + SlateBlue1: Raphael.getRGB("#836FFF "), // 131 111 255 + SlateBlue2: Raphael.getRGB("#7A67EE "), // 122 103 238 + SlateBlue3: Raphael.getRGB("#6959CD "), // 105 89 205 + SlateBlue4: Raphael.getRGB("#473C8B "), // 71 60 139 + RoyalBlue1: Raphael.getRGB("#4876FF "), // 72 118 255 + RoyalBlue2: Raphael.getRGB("#436EEE "), // 67 110 238 + RoyalBlue3: Raphael.getRGB("#3A5FCD "), // 58 95 205 + RoyalBlue4: Raphael.getRGB("#27408B "), // 39 64 139 + Blue1: Raphael.getRGB("#0000FF "), // 0 0 255 + Blue2: Raphael.getRGB("#0000EE "), // 0 0 238 + Blue3: Raphael.getRGB("#0000CD "), // 0 0 205 + Blue4: Raphael.getRGB("#00008B "), // 0 0 139 + DodgerBlue1: Raphael.getRGB("#1E90FF "), // 30 144 255 + DodgerBlue2: Raphael.getRGB("#1C86EE "), // 28 134 238 + DodgerBlue3: Raphael.getRGB("#1874CD "), // 24 116 205 + DodgerBlue4: Raphael.getRGB("#104E8B "), // 16 78 139 + SteelBlue1: Raphael.getRGB("#63B8FF "), // 99 184 255 + SteelBlue2: Raphael.getRGB("#5CACEE "), // 92 172 238 + SteelBlue3: Raphael.getRGB("#4F94CD "), // 79 148 205 + SteelBlue4: Raphael.getRGB("#36648B "), // 54 100 139 + DeepSkyBlue1: Raphael.getRGB("#00BFFF "), // 0 191 255 + DeepSkyBlue2: Raphael.getRGB("#00B2EE "), // 0 178 238 + DeepSkyBlue3: Raphael.getRGB("#009ACD "), // 0 154 205 + DeepSkyBlue4: Raphael.getRGB("#00688B "), // 0 104 139 + SkyBlue1: Raphael.getRGB("#87CEFF "), // 135 206 255 + SkyBlue2: Raphael.getRGB("#7EC0EE "), // 126 192 238 + SkyBlue3: Raphael.getRGB("#6CA6CD "), // 108 166 205 + SkyBlue4: Raphael.getRGB("#4A708B "), // 74 112 139 + LightSkyBlue1: Raphael.getRGB("#B0E2FF "), // 176 226 255 + LightSkyBlue2: Raphael.getRGB("#A4D3EE "), // 164 211 238 + LightSkyBlue3: Raphael.getRGB("#8DB6CD "), // 141 182 205 + LightSkyBlue4: Raphael.getRGB("#607B8B "), // 96 123 139 + SlateGray1: Raphael.getRGB("#C6E2FF "), // 198 226 255 + SlateGray2: Raphael.getRGB("#B9D3EE "), // 185 211 238 + SlateGray3: Raphael.getRGB("#9FB6CD "), // 159 182 205 + SlateGray4: Raphael.getRGB("#6C7B8B "), // 108 123 139 + LightSteelBlue1: Raphael.getRGB("#CAE1FF "), // 202 225 255 + LightSteelBlue2: Raphael.getRGB("#BCD2EE "), // 188 210 238 + LightSteelBlue3: Raphael.getRGB("#A2B5CD "), // 162 181 205 + LightSteelBlue4: Raphael.getRGB("#6E7B8B "), // 110 123 139 + LightBlue1: Raphael.getRGB("#BFEFFF "), // 191 239 255 + LightBlue2: Raphael.getRGB("#B2DFEE "), // 178 223 238 + LightBlue3: Raphael.getRGB("#9AC0CD "), // 154 192 205 + LightBlue4: Raphael.getRGB("#68838B "), // 104 131 139 + LightCyan1: Raphael.getRGB("#E0FFFF "), // 224 255 255 + LightCyan2: Raphael.getRGB("#D1EEEE "), // 209 238 238 + LightCyan3: Raphael.getRGB("#B4CDCD "), // 180 205 205 + LightCyan4: Raphael.getRGB("#7A8B8B "), // 122 139 139 + PaleTurquoise1: Raphael.getRGB("#BBFFFF "), // 187 255 255 + PaleTurquoise2: Raphael.getRGB("#AEEEEE "), // 174 238 238 + PaleTurquoise3: Raphael.getRGB("#96CDCD "), // 150 205 205 + PaleTurquoise4: Raphael.getRGB("#668B8B "), // 102 139 139 + CadetBlue1: Raphael.getRGB("#98F5FF "), // 152 245 255 + CadetBlue2: Raphael.getRGB("#8EE5EE "), // 142 229 238 + CadetBlue3: Raphael.getRGB("#7AC5CD "), // 122 197 205 + CadetBlue4: Raphael.getRGB("#53868B "), // 83 134 139 + Turquoise1: Raphael.getRGB("#00F5FF "), // 0 245 255 + Turquoise2: Raphael.getRGB("#00E5EE "), // 0 229 238 + Turquoise3: Raphael.getRGB("#00C5CD "), // 0 197 205 + Turquoise4: Raphael.getRGB("#00868B "), // 0 134 139 + Cyan1: Raphael.getRGB("#00FFFF "), // 0 255 255 + Cyan2: Raphael.getRGB("#00EEEE "), // 0 238 238 + Cyan3: Raphael.getRGB("#00CDCD "), // 0 205 205 + Cyan4: Raphael.getRGB("#008B8B "), // 0 139 139 + DarkSlateGray1: Raphael.getRGB("#97FFFF "), // 151 255 255 + DarkSlateGray2: Raphael.getRGB("#8DEEEE "), // 141 238 238 + DarkSlateGray3: Raphael.getRGB("#79CDCD "), // 121 205 205 + DarkSlateGray4: Raphael.getRGB("#528B8B "), // 82 139 139 + Aquamarine1: Raphael.getRGB("#7FFFD4 "), // 127 255 212 + Aquamarine2: Raphael.getRGB("#76EEC6 "), // 118 238 198 + Aquamarine3: Raphael.getRGB("#66CDAA "), // 102 205 170 + Aquamarine4: Raphael.getRGB("#458B74 "), // 69 139 116 + DarkSeaGreen1: Raphael.getRGB("#C1FFC1 "), // 193 255 193 + DarkSeaGreen2: Raphael.getRGB("#B4EEB4 "), // 180 238 180 + DarkSeaGreen3: Raphael.getRGB("#9BCD9B "), // 155 205 155 + DarkSeaGreen4: Raphael.getRGB("#698B69 "), // 105 139 105 + SeaGreen1: Raphael.getRGB("#54FF9F "), // 84 255 159 + SeaGreen2: Raphael.getRGB("#4EEE94 "), // 78 238 148 + SeaGreen3: Raphael.getRGB("#43CD80 "), // 67 205 128 + SeaGreen4: Raphael.getRGB("#2E8B57 "), // 46 139 87 + PaleGreen1: Raphael.getRGB("#9AFF9A "), // 154 255 154 + PaleGreen2: Raphael.getRGB("#90EE90 "), // 144 238 144 + PaleGreen3: Raphael.getRGB("#7CCD7C "), // 124 205 124 + PaleGreen4: Raphael.getRGB("#548B54 "), // 84 139 84 + SpringGreen1: Raphael.getRGB("#00FF7F "), // 0 255 127 + SpringGreen2: Raphael.getRGB("#00EE76 "), // 0 238 118 + SpringGreen3: Raphael.getRGB("#00CD66 "), // 0 205 102 + SpringGreen4: Raphael.getRGB("#008B45 "), // 0 139 69 + Green1: Raphael.getRGB("#00FF00 "), // 0 255 0 + Green2: Raphael.getRGB("#00EE00 "), // 0 238 0 + Green3: Raphael.getRGB("#00CD00 "), // 0 205 0 + Green4: Raphael.getRGB("#008B00 "), // 0 139 0 + Chartreuse1: Raphael.getRGB("#7FFF00 "), // 127 255 0 + Chartreuse2: Raphael.getRGB("#76EE00 "), // 118 238 0 + Chartreuse3: Raphael.getRGB("#66CD00 "), // 102 205 0 + Chartreuse4: Raphael.getRGB("#458B00 "), // 69 139 0 + OliveDrab1: Raphael.getRGB("#C0FF3E "), // 192 255 62 + OliveDrab2: Raphael.getRGB("#B3EE3A "), // 179 238 58 + OliveDrab3: Raphael.getRGB("#9ACD32 "), // 154 205 50 + OliveDrab4: Raphael.getRGB("#698B22 "), // 105 139 34 + DarkOliveGreen1: Raphael.getRGB("#CAFF70 "), // 202 255 112 + DarkOliveGreen2: Raphael.getRGB("#BCEE68 "), // 188 238 104 + DarkOliveGreen3: Raphael.getRGB("#A2CD5A "), // 162 205 90 + DarkOliveGreen4: Raphael.getRGB("#6E8B3D "), // 110 139 61 + Khaki1: Raphael.getRGB("#FFF68F "), // 255 246 143 + Khaki2: Raphael.getRGB("#EEE685 "), // 238 230 133 + Khaki3: Raphael.getRGB("#CDC673 "), // 205 198 115 + Khaki4: Raphael.getRGB("#8B864E "), // 139 134 78 + LightGoldenrod1: Raphael.getRGB("#FFEC8B "), // 255 236 139 + LightGoldenrod2: Raphael.getRGB("#EEDC82 "), // 238 220 130 + LightGoldenrod3: Raphael.getRGB("#CDBE70 "), // 205 190 112 + LightGoldenrod4: Raphael.getRGB("#8B814C "), // 139 129 76 + LightYellow1: Raphael.getRGB("#FFFFE0 "), // 255 255 224 + LightYellow2: Raphael.getRGB("#EEEED1 "), // 238 238 209 + LightYellow3: Raphael.getRGB("#CDCDB4 "), // 205 205 180 + LightYellow4: Raphael.getRGB("#8B8B7A "), // 139 139 122 + Yellow1: Raphael.getRGB("#FFFF00 "), // 255 255 0 + Yellow2: Raphael.getRGB("#EEEE00 "), // 238 238 0 + Yellow3: Raphael.getRGB("#CDCD00 "), // 205 205 0 + Yellow4: Raphael.getRGB("#8B8B00 "), // 139 139 0 + Gold1: Raphael.getRGB("#FFD700 "), // 255 215 0 + Gold2: Raphael.getRGB("#EEC900 "), // 238 201 0 + Gold3: Raphael.getRGB("#CDAD00 "), // 205 173 0 + Gold4: Raphael.getRGB("#8B7500 "), // 139 117 0 + Goldenrod1: Raphael.getRGB("#FFC125 "), // 255 193 37 + Goldenrod2: Raphael.getRGB("#EEB422 "), // 238 180 34 + Goldenrod3: Raphael.getRGB("#CD9B1D "), // 205 155 29 + Goldenrod4: Raphael.getRGB("#8B6914 "), // 139 105 20 + DarkGoldenrod1: Raphael.getRGB("#FFB90F "), // 255 185 15 + DarkGoldenrod2: Raphael.getRGB("#EEAD0E "), // 238 173 14 + DarkGoldenrod3: Raphael.getRGB("#CD950C "), // 205 149 12 + DarkGoldenrod4: Raphael.getRGB("#8B658B "), // 139 101 8 + RosyBrown1: Raphael.getRGB("#FFC1C1 "), // 255 193 193 + RosyBrown2: Raphael.getRGB("#EEB4B4 "), // 238 180 180 + RosyBrown3: Raphael.getRGB("#CD9B9B "), // 205 155 155 + RosyBrown4: Raphael.getRGB("#8B6969 "), // 139 105 105 + IndianRed1: Raphael.getRGB("#FF6A6A "), // 255 106 106 + IndianRed2: Raphael.getRGB("#EE6363 "), // 238 99 99 + IndianRed3: Raphael.getRGB("#CD5555 "), // 205 85 85 + IndianRed4: Raphael.getRGB("#8B3A3A "), // 139 58 58 + Sienna1: Raphael.getRGB("#FF8247 "), // 255 130 71 + Sienna2: Raphael.getRGB("#EE7942 "), // 238 121 66 + Sienna3: Raphael.getRGB("#CD6839 "), // 205 104 57 + Sienna4: Raphael.getRGB("#8B4726 "), // 139 71 38 + Burlywood1: Raphael.getRGB("#FFD39B "), // 255 211 155 + Burlywood2: Raphael.getRGB("#EEC591 "), // 238 197 145 + Burlywood3: Raphael.getRGB("#CDAA7D "), // 205 170 125 + Burlywood4: Raphael.getRGB("#8B7355 "), // 139 115 85 + Wheat1: Raphael.getRGB("#FFE7BA "), // 255 231 186 + Wheat2: Raphael.getRGB("#EED8AE "), // 238 216 174 + Wheat3: Raphael.getRGB("#CDBA96 "), // 205 186 150 + Wheat4: Raphael.getRGB("#8B7E66 "), // 139 126 102 + Tan1: Raphael.getRGB("#FFA54F "), // 255 165 79 + Tan2: Raphael.getRGB("#EE9A49 "), // 238 154 73 + Tan3: Raphael.getRGB("#CD853F "), // 205 133 63 + Tan4: Raphael.getRGB("#8B5A2B "), // 139 90 43 + Chocolate1: Raphael.getRGB("#FF7F24 "), // 255 127 36 + Chocolate2: Raphael.getRGB("#EE7621 "), // 238 118 33 + Chocolate3: Raphael.getRGB("#CD661D "), // 205 102 29 + Chocolate4: Raphael.getRGB("#8B4513 "), // 139 69 19 + Firebrick1: Raphael.getRGB("#FF3030 "), // 255 48 48 + Firebrick2: Raphael.getRGB("#EE2C2C "), // 238 44 44 + Firebrick3: Raphael.getRGB("#CD2626 "), // 205 38 38 + Firebrick4: Raphael.getRGB("#8B1A1A "), // 139 26 26 + Brown1: Raphael.getRGB("#FF4040 "), // 255 64 64 + Brown2: Raphael.getRGB("#EE3B3B "), // 238 59 59 + Brown3: Raphael.getRGB("#CD3333 "), // 205 51 51 + Brown4: Raphael.getRGB("#8B2323 "), // 139 35 35 + Salmon1: Raphael.getRGB("#FF8C69 "), // 255 140 105 + Salmon2: Raphael.getRGB("#EE8262 "), // 238 130 98 + Salmon3: Raphael.getRGB("#CD7054 "), // 205 112 84 + Salmon4: Raphael.getRGB("#8B4C39 "), // 139 76 57 + LightSalmon1: Raphael.getRGB("#FFA07A "), // 255 160 122 + LightSalmon2: Raphael.getRGB("#EE9572 "), // 238 149 114 + LightSalmon3: Raphael.getRGB("#CD8162 "), // 205 129 98 + LightSalmon4: Raphael.getRGB("#8B5742 "), // 139 87 66 + Orange1: Raphael.getRGB("#FFA500 "), // 255 165 0 + Orange2: Raphael.getRGB("#EE9A00 "), // 238 154 0 + Orange3: Raphael.getRGB("#CD8500 "), // 205 133 0 + Orange4: Raphael.getRGB("#8B5A00 "), // 139 90 0 + DarkOrange1: Raphael.getRGB("#FF7F00 "), // 255 127 0 + DarkOrange2: Raphael.getRGB("#EE7600 "), // 238 118 0 + DarkOrange3: Raphael.getRGB("#CD6600 "), // 205 102 0 + DarkOrange4: Raphael.getRGB("#8B4500 "), // 139 69 0 + Coral1: Raphael.getRGB("#FF7256 "), // 255 114 86 + Coral2: Raphael.getRGB("#EE6A50 "), // 238 106 80 + Coral3: Raphael.getRGB("#CD5B45 "), // 205 91 69 + Coral4: Raphael.getRGB("#8B3E2F "), // 139 62 47 + Tomato1: Raphael.getRGB("#FF6347 "), // 255 99 71 + Tomato2: Raphael.getRGB("#EE5C42 "), // 238 92 66 + Tomato3: Raphael.getRGB("#CD4F39 "), // 205 79 57 + Tomato4: Raphael.getRGB("#8B3626 "), // 139 54 38 + OrangeRed1: Raphael.getRGB("#FF4500 "), // 255 69 0 + OrangeRed2: Raphael.getRGB("#EE4000 "), // 238 64 0 + OrangeRed3: Raphael.getRGB("#CD3700 "), // 205 55 0 + OrangeRed4: Raphael.getRGB("#8B2500 "), // 139 37 0 + Red1: Raphael.getRGB("#FF0000 "), // 255 0 0 + Red2: Raphael.getRGB("#EE0000 "), // 238 0 0 + Red3: Raphael.getRGB("#CD0000 "), // 205 0 0 + Red4: Raphael.getRGB("#8B0000 "), // 139 0 0 + DeepPink1: Raphael.getRGB("#FF1493 "), // 255 20 147 + DeepPink2: Raphael.getRGB("#EE1289 "), // 238 18 137 + DeepPink3: Raphael.getRGB("#CD1076 "), // 205 16 118 + DeepPink4: Raphael.getRGB("#8B0A50 "), // 139 10 80 + HotPink1: Raphael.getRGB("#FF6EB4 "), // 255 110 180 + HotPink2: Raphael.getRGB("#EE6AA7 "), // 238 106 167 + HotPink3: Raphael.getRGB("#CD6090 "), // 205 96 144 + HotPink4: Raphael.getRGB("#8B3A62 "), // 139 58 98 + Pink1: Raphael.getRGB("#FFB5C5 "), // 255 181 197 + Pink2: Raphael.getRGB("#EEA9B8 "), // 238 169 184 + Pink3: Raphael.getRGB("#CD919E "), // 205 145 158 + Pink4: Raphael.getRGB("#8B636C "), // 139 99 108 + LightPink1: Raphael.getRGB("#FFAEB9 "), // 255 174 185 + LightPink2: Raphael.getRGB("#EEA2AD "), // 238 162 173 + LightPink3: Raphael.getRGB("#CD8C95 "), // 205 140 149 + LightPink4: Raphael.getRGB("#8B5F65 "), // 139 95 101 + PaleVioletRed1: Raphael.getRGB("#FF82AB "), // 255 130 171 + PaleVioletRed2: Raphael.getRGB("#EE799F "), // 238 121 159 + PaleVioletRed3: Raphael.getRGB("#CD6889 "), // 205 104 137 + PaleVioletRed4: Raphael.getRGB("#8B475D "), // 139 71 93 + Maroon1: Raphael.getRGB("#FF34B3 "), // 255 52 179 + Maroon2: Raphael.getRGB("#EE30A7 "), // 238 48 167 + Maroon3: Raphael.getRGB("#CD2990 "), // 205 41 144 + Maroon4: Raphael.getRGB("#8B1C62 "), // 139 28 98 + VioletRed1: Raphael.getRGB("#FF3E96 "), // 255 62 150 + VioletRed2: Raphael.getRGB("#EE3A8C "), // 238 58 140 + VioletRed3: Raphael.getRGB("#CD3278 "), // 205 50 120 + VioletRed4: Raphael.getRGB("#8B2252 "), // 139 34 82 + Magenta1: Raphael.getRGB("#FF00FF "), // 255 0 255 + Magenta2: Raphael.getRGB("#EE00EE "), // 238 0 238 + Magenta3: Raphael.getRGB("#CD00CD "), // 205 0 205 + Magenta4: Raphael.getRGB("#8B008B "), // 139 0 139 + Orchid1: Raphael.getRGB("#FF83FA "), // 255 131 250 + Orchid2: Raphael.getRGB("#EE7AE9 "), // 238 122 233 + Orchid3: Raphael.getRGB("#CD69C9 "), // 205 105 201 + Orchid4: Raphael.getRGB("#8B4789 "), // 139 71 137 + Plum1: Raphael.getRGB("#FFBBFF "), // 255 187 255 + Plum2: Raphael.getRGB("#EEAEEE "), // 238 174 238 + Plum3: Raphael.getRGB("#CD96CD "), // 205 150 205 + Plum4: Raphael.getRGB("#8B668B "), // 139 102 139 + MediumOrchid1: Raphael.getRGB("#E066FF "), // 224 102 255 + MediumOrchid2: Raphael.getRGB("#D15FEE "), // 209 95 238 + MediumOrchid3: Raphael.getRGB("#B452CD "), // 180 82 205 + MediumOrchid4: Raphael.getRGB("#7A378B "), // 122 55 139 + DarkOrchid1: Raphael.getRGB("#BF3EFF "), // 191 62 255 + DarkOrchid2: Raphael.getRGB("#B23AEE "), // 178 58 238 + DarkOrchid3: Raphael.getRGB("#9A32CD "), // 154 50 205 + DarkOrchid4: Raphael.getRGB("#68228B "), // 104 34 139 + Purple1: Raphael.getRGB("#9B30FF "), // 155 48 255 + Purple2: Raphael.getRGB("#912CEE "), // 145 44 238 + Purple3: Raphael.getRGB("#7D26CD "), // 125 38 205 + Purple4: Raphael.getRGB("#551A8B "), // 85 26 139 + MediumPurple1: Raphael.getRGB("#AB82FF "), // 171 130 255 + MediumPurple2: Raphael.getRGB("#9F79EE "), // 159 121 238 + MediumPurple3: Raphael.getRGB("#8968CD "), // 137 104 205 + MediumPurple4: Raphael.getRGB("#5D478B "), // 93 71 139 + Thistle1: Raphael.getRGB("#FFE1FF "), // 255 225 255 + Thistle2: Raphael.getRGB("#EED2EE "), // 238 210 238 + Thistle3: Raphael.getRGB("#CDB5CD "), // 205 181 205 + Thistle4: Raphael.getRGB("#8B7B8B "), // 139 123 139 + grey11: Raphael.getRGB("#1C1C1C "), // 28 28 28 + grey21: Raphael.getRGB("#363636 "), // 54 54 54 + grey31: Raphael.getRGB("#4F4F4F "), // 79 79 79 + grey41: Raphael.getRGB("#696969 "), // 105 105 105 + grey51: Raphael.getRGB("#828282 "), // 130 130 130 + grey61: Raphael.getRGB("#9C9C9C "), // 156 156 156 + grey71: Raphael.getRGB("#B5B5B5 "), // 181 181 181 + gray81: Raphael.getRGB("#CFCFCF "), // 207 207 207 + gray91: Raphael.getRGB("#E8E8E8 "), // 232 232 232 + DarkGrey: Raphael.getRGB("#A9A9A9 "), // 169 169 169 + DarkBlue: Raphael.getRGB("#00008B "), // 0 0 139 + DarkCyan: Raphael.getRGB("#008B8B "), // 0 139 139 + DarkMagenta: Raphael.getRGB("#8B008B "), // 139 0 139 + DarkRed: Raphael.getRGB("#8B0000 "), // 139 0 0 + LightGreen: Raphael.getRGB("#90EE90 "), // 144 238 144 + + + get: function (R, G, B) { + return Raphael.getRGB("rgb(" + R + ", " + G + ", " + B + ")"); + } +}; diff --git a/len-activiti/src/main/resources/static/diagram-viewer/js/LineBreakMeasurer.js b/len-activiti/src/main/resources/static/diagram-viewer/js/LineBreakMeasurer.js index edba1a0..26730ed 100644 --- a/len-activiti/src/main/resources/static/diagram-viewer/js/LineBreakMeasurer.js +++ b/len-activiti/src/main/resources/static/diagram-viewer/js/LineBreakMeasurer.js @@ -1,270 +1,270 @@ /** * Word wrapping - * + * * @author (Javascript) Dmitry Farafonov */ - var AttributedStringIterator = function(text){ - //this.text = this.rtrim(this.ltrim(text)); - text = text.replace(/(\s)+/, " "); - this.text = this.rtrim(text); +var AttributedStringIterator = function (text) { + //this.text = this.rtrim(this.ltrim(text)); + text = text.replace(/(\s)+/, " "); + this.text = this.rtrim(text); + /* + if (beginIndex < 0 || beginIndex > endIndex || endIndex > length()) { + throw new IllegalArgumentException("Invalid substring range"); + } + */ + this.beginIndex = 0; + this.endIndex = this.text.length; + this.currentIndex = this.beginIndex; + + //console.group("[AttributedStringIterator]"); + var i = 0; + var string = this.text; + var fullPos = 0; + + //console.log("string: \"" + string + "\", length: " + string.length); + this.startWordOffsets = []; + this.startWordOffsets.push(fullPos); + + // TODO: remove i 1000 + while (i < 1000) { + var pos = string.search(/[ \t\n\f-\.\,]/); + if (pos == -1) + break; + + // whitespace start + fullPos += pos; + string = string.substr(pos); + ////console.log("fullPos: " + fullPos + ", pos: " + pos + ", string: ", string); + + // remove whitespaces + var pos = string.search(/[^ \t\n\f-\.\,]/); + if (pos == -1) + break; + + // whitespace end + fullPos += pos; + string = string.substr(pos); + + ////console.log("fullPos: " + fullPos); + this.startWordOffsets.push(fullPos); + + i++; + } + //console.log("startWordOffsets: ", this.startWordOffsets); + //console.groupEnd(); +}; +AttributedStringIterator.prototype = { + getEndIndex: function (pos) { + if (typeof (pos) == "undefined") + return this.endIndex; + + var string = this.text.substr(pos, this.endIndex - pos); + + var posEndOfLine = string.search(/[\n]/); + if (posEndOfLine == -1) + return this.endIndex; + else + return pos + posEndOfLine; + }, + getBeginIndex: function () { + return this.beginIndex; + }, + isWhitespace: function (pos) { + var str = this.text[pos]; + var whitespaceChars = " \t\n\f"; + + return (whitespaceChars.indexOf(str) != -1); + }, + isNewLine: function (pos) { + var str = this.text[pos]; + var whitespaceChars = "\n"; + + return (whitespaceChars.indexOf(str) != -1); + }, + preceding: function (pos) { + //console.group("[AttributedStringIterator.preceding]"); + for (var i in this.startWordOffsets) { + var startWordOffset = this.startWordOffsets[i]; + if (pos < startWordOffset && i > 0) { + //console.log("startWordOffset: " + this.startWordOffsets[i-1]); + //console.groupEnd(); + return this.startWordOffsets[i - 1]; + } + } + //console.log("pos: " + pos); + //console.groupEnd(); + return this.startWordOffsets[i]; + }, + following: function (pos) { + //console.group("[AttributedStringIterator.following]"); + for (var i in this.startWordOffsets) { + var startWordOffset = this.startWordOffsets[i]; + if (pos < startWordOffset && i > 0) { + //console.log("startWordOffset: " + this.startWordOffsets[i]); + //console.groupEnd(); + return this.startWordOffsets[i]; + } + } + //console.log("pos: " + pos); + //console.groupEnd(); + return this.startWordOffsets[i]; + }, + ltrim: function (str) { + var patt2 = /^\s+/g; + return str.replace(patt2, ""); + }, + rtrim: function (str) { + var patt2 = /\s+$/g; + return str.replace(patt2, ""); + }, + getLayout: function (start, limit) { + return this.text.substr(start, limit - start); + }, + getCharAtPos: function (pos) { + return this.text[pos]; + } +}; + +var LineBreakMeasurer = function (paper, x, y, text, fontAttrs) { + this.paper = paper; + this.text = new AttributedStringIterator(text); + this.fontAttrs = fontAttrs; + + if (this.text.getEndIndex() - this.text.getBeginIndex() < 1) { + throw {message: "Text must contain at least one character.", code: "IllegalArgumentException"}; + } + + //this.measurer = new TextMeasurer(paper, this.text, this.fontAttrs); + this.limit = this.text.getEndIndex(); + this.pos = this.start = this.text.getBeginIndex(); + + this.rafaelTextObject = this.paper.text(x, y, this.text.text).attr(fontAttrs).attr("text-anchor", "start"); + this.svgTextObject = this.rafaelTextObject[0]; +}; +LineBreakMeasurer.prototype = { + nextOffset: function (wrappingWidth, offsetLimit, requireNextWord) { + //console.group("[nextOffset]"); + var nextOffset = this.pos; + if (this.pos < this.limit) { + if (offsetLimit <= this.pos) { + throw {message: "offsetLimit must be after current position", code: "IllegalArgumentException"}; + } + + var charAtMaxAdvance = this.getLineBreakIndex(this.pos, wrappingWidth); + //charAtMaxAdvance --; + //console.log("charAtMaxAdvance:", charAtMaxAdvance, ", [" + this.text.getCharAtPos(charAtMaxAdvance) + "]"); + + if (charAtMaxAdvance == this.limit) { + nextOffset = this.limit; + //console.log("charAtMaxAdvance == this.limit"); + } else if (this.text.isNewLine(charAtMaxAdvance)) { + //console.log("isNewLine"); + nextOffset = charAtMaxAdvance + 1; + } else if (this.text.isWhitespace(charAtMaxAdvance)) { + // TODO: find next noSpaceChar + //return nextOffset; + nextOffset = this.text.following(charAtMaxAdvance); + } else { + // Break is in a word; back up to previous break. /* - if (beginIndex < 0 || beginIndex > endIndex || endIndex > length()) { - throw new IllegalArgumentException("Invalid substring range"); + var testPos = charAtMaxAdvance + 1; + if (testPos == this.limit) { + console.error("hbz..."); + } else { + nextOffset = this.text.preceding(charAtMaxAdvance); } */ - this.beginIndex = 0; - this.endIndex = this.text.length; - this.currentIndex = this.beginIndex; - - //console.group("[AttributedStringIterator]"); - var i = 0; - var string = this.text; - var fullPos = 0; - - //console.log("string: \"" + string + "\", length: " + string.length); - this.startWordOffsets = []; - this.startWordOffsets.push(fullPos); - - // TODO: remove i 1000 - while (i<1000) { - var pos = string.search(/[ \t\n\f-\.\,]/); - if (pos == -1) - break; - - // whitespace start - fullPos += pos; - string = string.substr(pos); - ////console.log("fullPos: " + fullPos + ", pos: " + pos + ", string: ", string); - - // remove whitespaces - var pos = string.search(/[^ \t\n\f-\.\,]/); - if (pos == -1) - break; - - // whitespace end - fullPos += pos; - string = string.substr(pos); - - ////console.log("fullPos: " + fullPos); - this.startWordOffsets.push(fullPos); - - i++; + nextOffset = this.text.preceding(charAtMaxAdvance); + + if (nextOffset <= this.pos) { + nextOffset = Math.max(this.pos + 1, charAtMaxAdvance); } - //console.log("startWordOffsets: ", this.startWordOffsets); + } + } + if (nextOffset > offsetLimit) { + nextOffset = offsetLimit; + } + //console.log("nextOffset: " + nextOffset); + //console.groupEnd(); + return nextOffset; + }, + nextLayout: function (wrappingWidth) { + //console.groupCollapsed("[nextLayout]"); + if (this.pos < this.limit) { + var requireNextWord = false; + var layoutLimit = this.nextOffset(wrappingWidth, this.limit, requireNextWord); + //console.log("layoutLimit:", layoutLimit); + if (layoutLimit == this.pos) { //console.groupEnd(); - }; - AttributedStringIterator.prototype = { - getEndIndex: function(pos){ - if (typeof(pos) == "undefined") - return this.endIndex; - - var string = this.text.substr(pos, this.endIndex - pos); - - var posEndOfLine = string.search(/[\n]/); - if (posEndOfLine == -1) - return this.endIndex; - else - return pos + posEndOfLine; - }, - getBeginIndex: function(){ - return this.beginIndex; - }, - isWhitespace: function(pos){ - var str = this.text[pos]; - var whitespaceChars = " \t\n\f"; - - return (whitespaceChars.indexOf(str) != -1); - }, - isNewLine: function(pos){ - var str = this.text[pos]; - var whitespaceChars = "\n"; - - return (whitespaceChars.indexOf(str) != -1); - }, - preceding: function(pos){ - //console.group("[AttributedStringIterator.preceding]"); - for(var i in this.startWordOffsets) { - var startWordOffset = this.startWordOffsets[i]; - if (pos < startWordOffset && i>0) { - //console.log("startWordOffset: " + this.startWordOffsets[i-1]); - //console.groupEnd(); - return this.startWordOffsets[i-1]; - } - } - //console.log("pos: " + pos); - //console.groupEnd(); - return this.startWordOffsets[i]; - }, - following: function(pos){ - //console.group("[AttributedStringIterator.following]"); - for(var i in this.startWordOffsets) { - var startWordOffset = this.startWordOffsets[i]; - if (pos < startWordOffset && i>0) { - //console.log("startWordOffset: " + this.startWordOffsets[i]); - //console.groupEnd(); - return this.startWordOffsets[i]; - } - } - //console.log("pos: " + pos); - //console.groupEnd(); - return this.startWordOffsets[i]; - }, - ltrim: function(str){ - var patt2=/^\s+/g; - return str.replace(patt2, ""); - }, - rtrim: function(str){ - var patt2=/\s+$/g; - return str.replace(patt2, ""); - }, - getLayout: function(start, limit){ - return this.text.substr(start, limit - start); - }, - getCharAtPos: function(pos) { - return this.text[pos]; - } - }; + return null; + } + var result = this.text.getLayout(this.pos, layoutLimit); + //console.log("layout: \"" + result + "\""); - var LineBreakMeasurer = function(paper, x, y, text, fontAttrs){ - this.paper = paper; - this.text = new AttributedStringIterator(text); - this.fontAttrs = fontAttrs; - - if (this.text.getEndIndex() - this.text.getBeginIndex() < 1) { - throw {message: "Text must contain at least one character.", code: "IllegalArgumentException"}; - } - - //this.measurer = new TextMeasurer(paper, this.text, this.fontAttrs); - this.limit = this.text.getEndIndex(); - this.pos = this.start = this.text.getBeginIndex(); - - this.rafaelTextObject = this.paper.text(x, y, this.text.text).attr(fontAttrs).attr("text-anchor", "start"); - this.svgTextObject = this.rafaelTextObject[0]; - }; - LineBreakMeasurer.prototype = { - nextOffset: function(wrappingWidth, offsetLimit, requireNextWord) { - //console.group("[nextOffset]"); - var nextOffset = this.pos; - if (this.pos < this.limit) { - if (offsetLimit <= this.pos) { - throw {message: "offsetLimit must be after current position", code: "IllegalArgumentException"}; - } - - var charAtMaxAdvance = this.getLineBreakIndex(this.pos, wrappingWidth); - //charAtMaxAdvance --; - //console.log("charAtMaxAdvance:", charAtMaxAdvance, ", [" + this.text.getCharAtPos(charAtMaxAdvance) + "]"); - - if (charAtMaxAdvance == this.limit) { - nextOffset = this.limit; - //console.log("charAtMaxAdvance == this.limit"); - } else if (this.text.isNewLine(charAtMaxAdvance)) { - //console.log("isNewLine"); - nextOffset = charAtMaxAdvance+1; - } else if (this.text.isWhitespace(charAtMaxAdvance)) { - // TODO: find next noSpaceChar - //return nextOffset; - nextOffset = this.text.following(charAtMaxAdvance); - } else { - // Break is in a word; back up to previous break. - /* - var testPos = charAtMaxAdvance + 1; - if (testPos == this.limit) { - console.error("hbz..."); - } else { - nextOffset = this.text.preceding(charAtMaxAdvance); - } - */ - nextOffset = this.text.preceding(charAtMaxAdvance); - - if (nextOffset <= this.pos) { - nextOffset = Math.max(this.pos+1, charAtMaxAdvance); - } - } - } - if (nextOffset > offsetLimit) { - nextOffset = offsetLimit; - } - //console.log("nextOffset: " + nextOffset); - //console.groupEnd(); - return nextOffset; - }, - nextLayout: function(wrappingWidth) { - //console.groupCollapsed("[nextLayout]"); - if (this.pos < this.limit) { - var requireNextWord = false; - var layoutLimit = this.nextOffset(wrappingWidth, this.limit, requireNextWord); - //console.log("layoutLimit:", layoutLimit); - if (layoutLimit == this.pos) { - //console.groupEnd(); - return null; - } - var result = this.text.getLayout(this.pos, layoutLimit); - //console.log("layout: \"" + result + "\""); - - // remove end of line - - //var posEndOfLine = this.text.getEndIndex(this.pos); - //if (posEndOfLine < result.length) - // result = result.substr(0, posEndOfLine); - - this.pos = layoutLimit; - - //console.groupEnd(); - return result; - } else { - //console.groupEnd(); - return null; - } - }, - getLineBreakIndex: function(pos, wrappingWidth) { - //console.group("[getLineBreakIndex]"); - //console.log("pos:"+pos + ", text: \""+ this.text.text.replace(/\n/g, "_").substr(pos, 1) + "\""); - - var bb = this.rafaelTextObject.getBBox(); - - var charNum = -1; - try { - var svgPoint = this.svgTextObject.getStartPositionOfChar(pos); - //var dot = this.paper.ellipse(svgPoint.x, svgPoint.y, 1, 1).attr({"stroke-width": 0, fill: Color.blue}); - svgPoint.x = svgPoint.x + wrappingWidth; - //svgPoint.y = bb.y; - //console.log("svgPoint:", svgPoint); - - //var dot = this.paper.ellipse(svgPoint.x, svgPoint.y, 1, 1).attr({"stroke-width": 0, fill: Color.red}); - - charNum = this.svgTextObject.getCharNumAtPosition(svgPoint); - } catch (e){ - console.warn("getStartPositionOfChar error, pos:" + pos); - /* - var testPos = pos + 1; - if (testPos < this.limit) { - return testPos - } - */ - } - //console.log("charNum:", charNum); - if (charNum == -1) { - //console.groupEnd(); - return this.text.getEndIndex(pos); - } else { - // When case there is new line between pos and charnum then use this new line - var newLineIndex = this.text.getEndIndex(pos); - if (newLineIndex < charNum ) { - console.log("newLineIndex <= charNum, newLineIndex:"+newLineIndex+", charNum:"+charNum, "\"" + this.text.text.substr(newLineIndex+1).replace(/\n/g, "?") + "\""); - //console.groupEnd(); - - return newLineIndex; - } - - //var charAtMaxAdvance = this.text.text.substring(charNum, charNum + 1); - var charAtMaxAdvance = this.text.getCharAtPos(charNum); - //console.log("!!charAtMaxAdvance: " + charAtMaxAdvance); - //console.groupEnd(); - return charNum; - } - }, - getPosition: function() { - return this.pos; - } - }; \ No newline at end of file + // remove end of line + + //var posEndOfLine = this.text.getEndIndex(this.pos); + //if (posEndOfLine < result.length) + // result = result.substr(0, posEndOfLine); + + this.pos = layoutLimit; + + //console.groupEnd(); + return result; + } else { + //console.groupEnd(); + return null; + } + }, + getLineBreakIndex: function (pos, wrappingWidth) { + //console.group("[getLineBreakIndex]"); + //console.log("pos:"+pos + ", text: \""+ this.text.text.replace(/\n/g, "_").substr(pos, 1) + "\""); + + var bb = this.rafaelTextObject.getBBox(); + + var charNum = -1; + try { + var svgPoint = this.svgTextObject.getStartPositionOfChar(pos); + //var dot = this.paper.ellipse(svgPoint.x, svgPoint.y, 1, 1).attr({"stroke-width": 0, fill: Color.blue}); + svgPoint.x = svgPoint.x + wrappingWidth; + //svgPoint.y = bb.y; + //console.log("svgPoint:", svgPoint); + + //var dot = this.paper.ellipse(svgPoint.x, svgPoint.y, 1, 1).attr({"stroke-width": 0, fill: Color.red}); + + charNum = this.svgTextObject.getCharNumAtPosition(svgPoint); + } catch (e) { + console.warn("getStartPositionOfChar error, pos:" + pos); + /* + var testPos = pos + 1; + if (testPos < this.limit) { + return testPos + } + */ + } + //console.log("charNum:", charNum); + if (charNum == -1) { + //console.groupEnd(); + return this.text.getEndIndex(pos); + } else { + // When case there is new line between pos and charnum then use this new line + var newLineIndex = this.text.getEndIndex(pos); + if (newLineIndex < charNum) { + console.log("newLineIndex <= charNum, newLineIndex:" + newLineIndex + ", charNum:" + charNum, "\"" + this.text.text.substr(newLineIndex + 1).replace(/\n/g, "?") + "\""); + //console.groupEnd(); + + return newLineIndex; + } + + //var charAtMaxAdvance = this.text.text.substring(charNum, charNum + 1); + var charAtMaxAdvance = this.text.getCharAtPos(charNum); + //console.log("!!charAtMaxAdvance: " + charAtMaxAdvance); + //console.groupEnd(); + return charNum; + } + }, + getPosition: function () { + return this.pos; + } +}; diff --git a/len-activiti/src/main/resources/static/diagram-viewer/js/Polyline.js b/len-activiti/src/main/resources/static/diagram-viewer/js/Polyline.js index e7e4c30..881ab98 100644 --- a/len-activiti/src/main/resources/static/diagram-viewer/js/Polyline.js +++ b/len-activiti/src/main/resources/static/diagram-viewer/js/Polyline.js @@ -3,8 +3,8 @@ * * @author Dmitry Farafonov */ - -var ANCHOR_TYPE= { + +var ANCHOR_TYPE = { main: "main", middle: "middle", first: "first", @@ -12,7 +12,7 @@ var ANCHOR_TYPE= { }; function Anchor(uuid, type, x, y) { - this.uuid = uuid; + this.uuid = uuid; this.x = x this.y = y this.type = (type == ANCHOR_TYPE.middle) ? ANCHOR_TYPE.middle : ANCHOR_TYPE.main; @@ -37,19 +37,19 @@ function Polyline(uuid, points, strokeWidth) { * {x: 650, y: 370}]; 4 */ this.points = points; - + /* * path for graph * [["M", x1, y1], ["L", x2, y2], ["C", ax, ay, bx, by, x3, y3], ["L", x3, y3]] */ this.path = []; - + this.anchors = []; - + if (strokeWidth) this.strokeWidth = strokeWidth; - + this.closePath = false; - + this.init(); }; @@ -64,78 +64,78 @@ Polyline.prototype = { element: null, isDefaultConditionAvailable: false, closePath: false, - - init: function(points){ + + init: function (points) { var linesCount = this.getLinesCount(); if (linesCount < 1) return; - + this.normalizeCoordinates(); - + // create anchors - + this.pushAnchor(ANCHOR_TYPE.first, this.getLine(0).x1, this.getLine(0).y1); - - for(var i = 1; i < linesCount; i++){ - var line1 = this.getLine(i-1), + + for (var i = 1; i < linesCount; i++) { + var line1 = this.getLine(i - 1), line2 = this.getLine(i); - + //this.pushAnchor(ANCHOR_TYPE.middle, line1.x1 + line1.x2-line1.x1, line1.y1 + line1.y2-line1.y1); - this.pushAnchor(ANCHOR_TYPE.main, line1.x2, line1.y2); + this.pushAnchor(ANCHOR_TYPE.main, line1.x2, line1.y2); //this.pushAnchor(ANCHOR_TYPE.middle, line2.x1 + line2.x2-line2.x1, line2.y1 + line2.y2-line2.y1); } - - this.pushAnchor(ANCHOR_TYPE.last, this.getLine(linesCount-1).x2, this.getLine(linesCount-1).y2); - + + this.pushAnchor(ANCHOR_TYPE.last, this.getLine(linesCount - 1).x2, this.getLine(linesCount - 1).y2); + this.rebuildPath(); }, - - normalizeCoordinates: function(){ - for(var i=0; i < this.points.length; i++){ + + normalizeCoordinates: function () { + for (var i = 0; i < this.points.length; i++) { this.points[i].x = parseFloat(this.points[i].x); this.points[i].y = parseFloat(this.points[i].y); } }, - - getLinesCount: function(){ - return this.points.length-1; + + getLinesCount: function () { + return this.points.length - 1; }, - _getLine: function(i){ - return {x1: this.points[i].x, y1: this.points[i].y, x2: this.points[i+1].x, y2: this.points[i+1].y}; + _getLine: function (i) { + return {x1: this.points[i].x, y1: this.points[i].y, x2: this.points[i + 1].x, y2: this.points[i + 1].y}; }, - getLine: function(i){ + getLine: function (i) { var line = this._getLine(i); - line.angle = this.getLineAngle(i) ; + line.angle = this.getLineAngle(i); return line; }, - getLineAngle: function(i){ + getLineAngle: function (i) { var line = this._getLine(i); return Math.atan2(line.y2 - line.y1, line.x2 - line.x1); }, - getLineLengthX: function(i){ + getLineLengthX: function (i) { var line = this.getLine(i); return (line.x2 - line.x1); }, - getLineLengthY: function(i){ + getLineLengthY: function (i) { var line = this.getLine(i); return (line.y2 - line.y1); }, - getLineLength: function(i){ + getLineLength: function (i) { var line = this.getLine(i); return Math.sqrt(Math.pow(this.getLineLengthX(i), 2) + Math.pow(this.getLineLengthY(i), 2)); }, - - getAnchors: function(){ - // + + getAnchors: function () { + // ������� ��������������� ������ // ???? return this.anchors; }, - getAnchorsCount: function(type){ + getAnchorsCount: function (type) { if (!type) return this.anchors.length; else { var count = 0; - for(var i=0; i < this.getAnchorsCount(); i++){ + for (var i = 0; i < this.getAnchorsCount(); i++) { var anchor = this.anchors[i]; if (anchor.getType() == type) { count++; @@ -144,8 +144,8 @@ Polyline.prototype = { return count; } }, - - pushAnchor: function(type, x, y, index){ + + pushAnchor: function (type, x, y, index) { if (type == ANCHOR_TYPE.first) { index = 0; typeIndex = 0; @@ -155,9 +155,9 @@ Polyline.prototype = { } else if (!index) { index = this.anchors.length; } else { - // anchors, , index + // ��������� anchors, �������� ������� ��� �������, ������� � index //var anchor = this.getAnchor() - for(var i=0; i < this.getAnchorsCount(); i++){ + for (var i = 0; i < this.getAnchorsCount(); i++) { var anchor = this.anchors[i]; if (anchor.index > index) { anchor.index++; @@ -165,83 +165,84 @@ Polyline.prototype = { } } } - + var anchor = new Anchor(this.id, ANCHOR_TYPE.main, x, y, index, typeIndex); - + this.anchors.push(anchor); }, - - getAnchor: function(position){ + + getAnchor: function (position) { return this.anchors[position]; }, - - getAnchorByType: function(type, position){ + + getAnchorByType: function (type, position) { if (type == ANCHOR_TYPE.first) return this.anchors[0]; if (type == ANCHOR_TYPE.last) - return this.anchors[this.getAnchorsCount()-1]; - - for(var i=0; i < this.getAnchorsCount(); i++){ + return this.anchors[this.getAnchorsCount() - 1]; + + for (var i = 0; i < this.getAnchorsCount(); i++) { var anchor = this.anchors[i]; if (anchor.type == type) { - if( position == anchor.position) + if (position == anchor.position) return anchor; } } return null; }, - - addNewPoint: function(position, x, y){ - // - for(var i = 0; i < this.getLinesCount(); i++){ + + addNewPoint: function (position, x, y) { + // + for (var i = 0; i < this.getLinesCount(); i++) { var line = this.getLine(i); if (x > line.x1 && x < line.x2 && y > line.y1 && y < line.y2) { - this.points.splice(i+1,0,{x: x, y: y}); + this.points.splice(i + 1, 0, {x: x, y: y}); break; } } - + this.rebuildPath(); }, - - rebuildPath: function(){ + + rebuildPath: function () { var path = []; - - for(var i = 0; i < this.getAnchorsCount(); i++){ + + for (var i = 0; i < this.getAnchorsCount(); i++) { var anchor = this.getAnchor(i); - + var pathType = "" - if (i==0) + if (i == 0) pathType = "M"; - else + else pathType = "L"; - + // TODO: save previous points and calculate new path just if points are updated, and then save currents values as previous - + var targetX = anchor.x, targetY = anchor.y; - if (i>0 && i < this.getAnchorsCount()-1) { + if (i > 0 && i < this.getAnchorsCount() - 1) { // get new x,y var cx = anchor.x, cy = anchor.y; - + // pivot point of prev line - var AO = this.getLineLength(i-1); + var AO = this.getLineLength(i - 1); if (AO < this.radius) { AO = this.radius; } - + this.isDefaultConditionAvailable = (this.isDefaultConditionAvailable || (i == 1 && AO > 10)); //console.log("isDefaultConditionAvailable", this.isDefaultConditionAvailable); - - var ED = this.getLineLengthY(i-1) * this.radius / AO; - var OD = this.getLineLengthX(i-1) * this.radius / AO; - targetX = anchor.x - OD; - targetY = anchor.y - ED; - - if (AO < 2*this.radius && i>1) { - targetX = anchor.x - this.getLineLengthX(i-1)/2; - targetY = anchor.y - this.getLineLengthY(i-1)/2;; + + var ED = this.getLineLengthY(i - 1) * this.radius / AO; + var OD = this.getLineLengthX(i - 1) * this.radius / AO; + targetX = anchor.x - OD; + targetY = anchor.y - ED; + + if (AO < 2 * this.radius && i > 1) { + targetX = anchor.x - this.getLineLengthX(i - 1) / 2; + targetY = anchor.y - this.getLineLengthY(i - 1) / 2; + ; } - + // pivot point of next line var AO = this.getLineLength(i); if (AO < this.radius) { @@ -249,38 +250,45 @@ Polyline.prototype = { } var ED = this.getLineLengthY(i) * this.radius / AO; var OD = this.getLineLengthX(i) * this.radius / AO; - var nextSrcX = anchor.x + OD; - var nextSrcY = anchor.y + ED; - - if (AO < 2*this.radius && i0 && i < this.getAnchorsCount()-1) { + + if (i > 0 && i < this.getAnchorsCount() - 1) { path.push(["C", ax, ay, bx, by, zx, zy]); } } - + if (this.closePath) { console.log("closePath:", this.closePath); path.push(["Z"]); } - + this.path = path; }, - - transform: function(transformation){ + + transform: function (transformation) { this.element.transform(transformation); }, - attr: function(attrs){ + attr: function (attrs) { //console.log("attrs: " +attrs, "", this.element); // TODO: foreach and set each this.element.attr(attrs); @@ -328,17 +336,17 @@ function Polygone(points, strokeWidth) { * {x: 650, y: 370}]; 4 */ this.points = points; - + /* * path for graph * [["M", x1, y1], ["L", x2, y2], ["C", ax, ay, bx, by, x3, y3], ["L", x3, y3]] */ this.path = []; - + this.anchors = []; - + if (strokeWidth) this.strokeWidth = strokeWidth; - + this.closePath = true; this.init(); }; @@ -348,40 +356,41 @@ function Polygone(points, strokeWidth) { * Poligone is inherited from Poliline: draws closedPath of polyline */ -var Foo = function () { }; +var Foo = function () { +}; Foo.prototype = Polyline.prototype; Polygone.prototype = new Foo(); -Polygone.prototype.rebuildPath = function(){ +Polygone.prototype.rebuildPath = function () { var path = []; //console.log("Polygone rebuildPath"); - for(var i = 0; i < this.getAnchorsCount(); i++){ + for (var i = 0; i < this.getAnchorsCount(); i++) { var anchor = this.getAnchor(i); - + var pathType = "" - if (i==0) + if (i == 0) pathType = "M"; - else + else pathType = "L"; - + var targetX = anchor.x, targetY = anchor.y; - + // anti smoothing - if (this.strokeWidth%2 == 1) { + if (this.strokeWidth % 2 == 1) { targetX += 0.5; targetY += 0.5; } - - path.push([pathType, targetX, targetY]); + + path.push([pathType, targetX, targetY]); } if (this.closePath) path.push(["Z"]); - + this.path = path; }; /* Polygone.prototype.transform = function(transformation){ this.element.transform(transformation); }; -*/ \ No newline at end of file +*/ diff --git a/len-activiti/src/main/resources/static/diagram-viewer/js/ProcessDiagramCanvas.js b/len-activiti/src/main/resources/static/diagram-viewer/js/ProcessDiagramCanvas.js index eadbe9c..4c0f9a9 100644 --- a/len-activiti/src/main/resources/static/diagram-viewer/js/ProcessDiagramCanvas.js +++ b/len-activiti/src/main/resources/static/diagram-viewer/js/ProcessDiagramCanvas.js @@ -1,14 +1,14 @@ /** * Represents a canvas on which BPMN 2.0 constructs can be drawn. - * + * * Some of the icons used are licenced under a Creative Commons Attribution 2.5 * License, see http://www.famfamfam.com/lab/icons/silk/ - * + * * @see ProcessDiagramGenerator * @author (Java) Joram Barrez * @author (Javascript) Dmitry Farafonov */ - + //Color.Cornsilk var ARROW_HEAD_SIMPLE = "simple"; @@ -39,9 +39,9 @@ var HIGHLIGHT_COLOR = Color.Firebrick1; var SEQUENCEFLOW_COLOR = Color.black; var CATCHING_EVENT_COLOR = Color.black; /* Color.SlateGrey; */ -var START_EVENT_COLOR = Color.get(251,251,251); +var START_EVENT_COLOR = Color.get(251, 251, 251); var START_EVENT_STROKE_COLOR = Color.black; /* Color.SlateGrey; */ -var END_EVENT_COLOR = Color.get(251,251,251); +var END_EVENT_COLOR = Color.get(251, 251, 251); //var END_EVENT_STROKE_COLOR = Color.black; var NONE_END_EVENT_COLOR = Color.Firebrick4; var NONE_END_EVENT_STROKE_COLOR = Color.Firebrick4; @@ -52,10 +52,17 @@ var LABEL_COLOR = Color.get(72, 106, 150); // Fonts var NORMAL_FONT = {font: "10px Arial", opacity: 1, fill: Color.black}; -var LABEL_FONT = {font: "11px Arial", "font-style":"italic", opacity: 1, "fill": LABEL_COLOR}; -var LABEL_FONT_SMOOTH = {font: "10px Arial", "font-style":"italic", opacity: 1, "fill": LABEL_COLOR, stroke: LABEL_COLOR, "stroke-width":.4}; +var LABEL_FONT = {font: "11px Arial", "font-style": "italic", opacity: 1, "fill": LABEL_COLOR}; +var LABEL_FONT_SMOOTH = { + font: "10px Arial", + "font-style": "italic", + opacity: 1, + "fill": LABEL_COLOR, + stroke: LABEL_COLOR, + "stroke-width": .4 +}; var TASK_FONT = {font: "11px Arial", opacity: 1, fill: Color.black}; -var TASK_FONT_SMOOTH = {font: "11px Arial", opacity: 1, fill: Color.black, stroke: LABEL_COLOR, "stroke-width":.4}; +var TASK_FONT_SMOOTH = {font: "11px Arial", opacity: 1, fill: Color.black, stroke: LABEL_COLOR, "stroke-width": .4}; var POOL_LANE_FONT = {font: "11px Arial", opacity: 1, fill: Color.black}; var EXPANDED_SUBPROCESS_FONT = {font: "11px Arial", opacity: 1, fill: Color.black}; @@ -65,9 +72,9 @@ var SEQUENCEFLOW_STROKE = 1.5; var SEQUENCEFLOW_HIGHLIGHT_STROKE = 2; var THICK_TASK_BORDER_STROKE = 2.5; var GATEWAY_TYPE_STROKE = 3.2; -var END_EVENT_STROKE = NORMAL_STROKE+2; +var END_EVENT_STROKE = NORMAL_STROKE + 2; var MULTI_INSTANCE_STROKE = 1.3; -var EVENT_SUBPROCESS_ATTRS = {"stroke": Color.black, "stroke-width": NORMAL_STROKE, "stroke-dasharray": ". "}; +var EVENT_SUBPROCESS_ATTRS = {"stroke": Color.black, "stroke-width": NORMAL_STROKE, "stroke-dasharray": ". "}; //var EXPANDED_SUBPROCESS_ATTRS = {"stroke": Color.black, "stroke-width": NORMAL_STROKE, "fill": Color.FloralWhite}; var EXPANDED_SUBPROCESS_ATTRS = {"stroke": Color.black, "stroke-width": NORMAL_STROKE, "fill": Color.WhiteSmoke}; var NON_INTERRUPTING_EVENT_STROKE = "- "; @@ -78,21 +85,21 @@ var EXPANDED_SUBPROCESS_CORNER_ROUND = 10; // icons var ICON_SIZE = 16; var ICON_PADDING = 4; -var USERTASK_IMAGE = "images/deployer/user.png"; -var SCRIPTTASK_IMAGE = "images/deployer/script.png"; -var SERVICETASK_IMAGE = "images/deployer/service.png"; -var RECEIVETASK_IMAGE = "images/deployer/receive.png"; -var SENDTASK_IMAGE = "images/deployer/send.png"; -var MANUALTASK_IMAGE = "images/deployer/manual.png"; +var USERTASK_IMAGE = "images/deployer/user.png"; +var SCRIPTTASK_IMAGE = "images/deployer/script.png"; +var SERVICETASK_IMAGE = "images/deployer/service.png"; +var RECEIVETASK_IMAGE = "images/deployer/receive.png"; +var SENDTASK_IMAGE = "images/deployer/send.png"; +var MANUALTASK_IMAGE = "images/deployer/manual.png"; var BUSINESS_RULE_TASK_IMAGE = "images/deployer/business_rule.png"; -var TIMER_IMAGE = "images/deployer/timer.png"; -var MESSAGE_CATCH_IMAGE = "images/deployer/message_catch.png"; -var MESSAGE_THROW_IMAGE = "images/deployer/message_throw.png"; -var ERROR_THROW_IMAGE = "images/deployer/error_throw.png"; -var ERROR_CATCH_IMAGE = "images/deployer/error_catch.png"; -var SIGNAL_CATCH_IMAGE = "images/deployer/signal_catch.png"; -var SIGNAL_THROW_IMAGE = "images/deployer/signal_throw.png"; -var MULTIPLE_CATCH_IMAGE = "images/deployer/multiple_catch.png"; +var TIMER_IMAGE = "images/deployer/timer.png"; +var MESSAGE_CATCH_IMAGE = "images/deployer/message_catch.png"; +var MESSAGE_THROW_IMAGE = "images/deployer/message_throw.png"; +var ERROR_THROW_IMAGE = "images/deployer/error_throw.png"; +var ERROR_CATCH_IMAGE = "images/deployer/error_catch.png"; +var SIGNAL_CATCH_IMAGE = "images/deployer/signal_catch.png"; +var SIGNAL_THROW_IMAGE = "images/deployer/signal_throw.png"; +var MULTIPLE_CATCH_IMAGE = "images/deployer/multiple_catch.png"; var ObjectType = { @@ -102,14 +109,12 @@ var ObjectType = { RHOMBUS: "rhombus" }; -function OBJ(type){ +function OBJ(type) { this.c = null; this.type = type; this.nestedElements = []; }; -OBJ.prototype = { - -}; +OBJ.prototype = {}; var CONNECTION_TYPE = { SEQUENCE_FLOW: "sequence_flow", @@ -117,83 +122,83 @@ var CONNECTION_TYPE = { ASSOCIATION: "association" }; -var ProcessDiagramCanvas = function(){ +var ProcessDiagramCanvas = function () { }; ProcessDiagramCanvas.prototype = { // var DefaultProcessDiagramCanvas = { canvasHolder: "holder", - canvasWidth: 0, + canvasWidth: 0, canvasHeight: 0, paint: Color.black, strokeWidth: 0, font: null, fontSmoothing: null, - + g: null, ninjaPaper: null, - + objects: [], - + processDefinitionId: null, activity: null, - + frame: null, - - + + debug: false, - + /** - * Creates an empty canvas with given width and height. - */ - init: function(width, height, processDefinitionId){ + * Creates an empty canvas with given width and height. + */ + init: function (width, height, processDefinitionId) { this.canvasWidth = width; this.canvasHeight = height; - + // TODO: name it as 'canvasName' if (!processDefinitionId) processDefinitionId = "holder"; - + this.processDefinitionId = processDefinitionId; this.canvasHolder = this.processDefinitionId; var h = document.getElementById(this.canvasHolder); if (!h) return; - + h.style.width = this.canvasWidth; h.style.height = this.canvasHeight; - + this.g = Raphael(this.canvasHolder); this.g.clear(); - + //this.setPaint(Color.DimGrey); this.setPaint(Color.black); //this.setPaint(Color.white); this.setStroke(NORMAL_STROKE); - + //this.setFont("Arial", 11); this.setFont(NORMAL_FONT); //this.font = this.g.getFont("Arial"); - + this.fontSmoothing = true; - + // ninja! var RaphaelOriginal = Raphael; - this.ninjaPaper =(function (local_raphael) { + this.ninjaPaper = (function (local_raphael) { var paper = local_raphael(1, 1, 1, 1, processDefinitionId); return paper; })(Raphael.ninja()); Raphael = RaphaelOriginal; }, - setPaint: function(color){ + setPaint: function (color) { this.paint = color; }, - getPaint: function(){ + getPaint: function () { return this.paint; }, - setStroke: function(strokeWidth){ + setStroke: function (strokeWidth) { this.strokeWidth = strokeWidth; }, - getStroke: function(){ + getStroke: function () { return this.strokeWidth; }, /* @@ -201,127 +206,137 @@ ProcessDiagramCanvas.prototype = { this.font = this.g.getFont(family, weight); }, */ - setFont: function(font){ + setFont: function (font) { this.font = font; }, - getFont: function(){ + getFont: function () { return this.font; }, - drawShaddow: function(object){ + drawShaddow: function (object) { var border = object.clone(); - border.attr({"stroke-width": this.strokeWidth + 6, - "stroke": Color.white, - "fill": Color.white, - "opacity": 1, - "stroke-dasharray":null}); + border.attr({ + "stroke-width": this.strokeWidth + 6, + "stroke": Color.white, + "fill": Color.white, + "opacity": 1, + "stroke-dasharray": null + }); //border.toBack(); object.toFront(); - + return border; }, - - setConextObject: function(obj){ + + setConextObject: function (obj) { this.contextObject = obj; }, - getConextObject: function(){ + getConextObject: function () { return this.contextObject; }, - setContextToElement: function(object){ + setContextToElement: function (object) { var contextObject = this.getConextObject(); object.id = contextObject.id; object.data("contextObject", contextObject); }, - onClick: function(event, instance, element){ - var overlay = element; - var set = overlay.data("set"); - var contextObject = overlay.data("contextObject"); - //console.log("["+contextObject.getProperty("type")+"], activityId: " + contextObject.getId()); - if (ProcessDiagramGenerator.options && ProcessDiagramGenerator.options.on && ProcessDiagramGenerator.options.on.click) { - var args = [instance, element, contextObject]; - ProcessDiagramGenerator.options.on.click.apply(event, args); - } - }, - onRightClick: function(event, instance, element){ - var overlay = element; - var set = overlay.data("set"); - var contextObject = overlay.data("contextObject"); - //console.log("[%s], activityId: %s (RIGHTCLICK)", contextObject.getProperty("type"), contextObject.getId()); - - if (ProcessDiagramGenerator.options && ProcessDiagramGenerator.options.on && ProcessDiagramGenerator.options.on.rightClick) { - var args = [instance, element, contextObject]; - ProcessDiagramGenerator.options.on.rightClick.apply(event, args); - } - }, - onHoverIn: function(event, instance, element){ - var overlay = element; - var set = overlay.data("set"); - var contextObject = overlay.data("contextObject"); - - var border = instance.g.getById(contextObject.id + "_border"); - border.attr("opacity", 0.3); - - // provide callback - if (ProcessDiagramGenerator.options && ProcessDiagramGenerator.options.on && ProcessDiagramGenerator.options.on.over) { - var args = [instance, element, contextObject]; - ProcessDiagramGenerator.options.on.over.apply(event, args); - } - }, - onHoverOut: function(event, instance, element){ - var overlay = element; - var set = overlay.data("set"); - var contextObject = overlay.data("contextObject"); - - var border = instance.g.getById(contextObject.id + "_border"); - border.attr("opacity", 0.0); - // provide callback - if (ProcessDiagramGenerator.options && ProcessDiagramGenerator.options.on && ProcessDiagramGenerator.options.on.out) { - var args = [instance, element, contextObject]; - ProcessDiagramGenerator.options.on.out.apply(event, args); - } - }, - addHandlers: function(set, x, y, width, height, type){ - var contextObject = this.getConextObject(); - - var cx = x+width/2, cy = y+height/2; - if (type == "event") { - var border = this.g.ellipse(cx, cy, width/2+4, height/2+4); - var overlay = this.g.ellipse(cx, cy, width/2, height/2); - } else if (type == "gateway") { - // rhombus - var border = this.g.path( "M" + (x - 4) + " " + (y + (height / 2)) + - "L" + (x + (width / 2)) + " " + (y + height + 4) + - "L" + (x + width + 4) + " " + (y + (height / 2)) + - "L" + (x + (width / 2)) + " " + (y - 4) + - "z" ); - var overlay = this.g.path( "M" + x + " " + (y + (height / 2)) + - "L" + (x + (width / 2)) + " " + (y + height) + - "L" + (x + width) + " " + (y + (height / 2)) + - "L" + (x + (width / 2)) + " " + y + - "z" ); - } else if (type == "task") { - var border = this.g.rect(x - 4, y - 4, width+9, height+9, TASK_CORNER_ROUND+4); - var overlay = this.g.rect(x, y, width, height, TASK_CORNER_ROUND); - } - - border.attr({stroke: Color.get(132,112,255)/*Color.Tan1*/,"stroke-width": 4, opacity: 0.0}); - border.id = contextObject.id + "_border"; - - set.push(border); - - overlay.attr({stroke: Color.Orange,"stroke-width": 3, fill: Color.get(0,0,0), opacity: 0.0, cursor: "hand"}); - overlay.data("set",set); - overlay.id = contextObject.id; - overlay.data("contextObject",contextObject); - - var instance = this; - overlay.mousedown(function(event){if (event.button == 2) instance.onRightClick(event, instance, this);}); - overlay.click(function(event){instance.onClick(event, instance, this);}); - overlay.hover(function(event){instance.onHoverIn(event, instance, this);}, function(event){instance.onHoverOut(event, instance, this);}); - }, - + onClick: function (event, instance, element) { + var overlay = element; + var set = overlay.data("set"); + var contextObject = overlay.data("contextObject"); + //console.log("["+contextObject.getProperty("type")+"], activityId: " + contextObject.getId()); + if (ProcessDiagramGenerator.options && ProcessDiagramGenerator.options.on && ProcessDiagramGenerator.options.on.click) { + var args = [instance, element, contextObject]; + ProcessDiagramGenerator.options.on.click.apply(event, args); + } + }, + onRightClick: function (event, instance, element) { + var overlay = element; + var set = overlay.data("set"); + var contextObject = overlay.data("contextObject"); + //console.log("[%s], activityId: %s (RIGHTCLICK)", contextObject.getProperty("type"), contextObject.getId()); + + if (ProcessDiagramGenerator.options && ProcessDiagramGenerator.options.on && ProcessDiagramGenerator.options.on.rightClick) { + var args = [instance, element, contextObject]; + ProcessDiagramGenerator.options.on.rightClick.apply(event, args); + } + }, + onHoverIn: function (event, instance, element) { + var overlay = element; + var set = overlay.data("set"); + var contextObject = overlay.data("contextObject"); + + var border = instance.g.getById(contextObject.id + "_border"); + border.attr("opacity", 0.3); + + // provide callback + if (ProcessDiagramGenerator.options && ProcessDiagramGenerator.options.on && ProcessDiagramGenerator.options.on.over) { + var args = [instance, element, contextObject]; + ProcessDiagramGenerator.options.on.over.apply(event, args); + } + }, + onHoverOut: function (event, instance, element) { + var overlay = element; + var set = overlay.data("set"); + var contextObject = overlay.data("contextObject"); + + var border = instance.g.getById(contextObject.id + "_border"); + border.attr("opacity", 0.0); + // provide callback + if (ProcessDiagramGenerator.options && ProcessDiagramGenerator.options.on && ProcessDiagramGenerator.options.on.out) { + var args = [instance, element, contextObject]; + ProcessDiagramGenerator.options.on.out.apply(event, args); + } + }, + addHandlers: function (set, x, y, width, height, type) { + var contextObject = this.getConextObject(); + + var cx = x + width / 2, cy = y + height / 2; + if (type == "event") { + var border = this.g.ellipse(cx, cy, width / 2 + 4, height / 2 + 4); + var overlay = this.g.ellipse(cx, cy, width / 2, height / 2); + } else if (type == "gateway") { + // rhombus + var border = this.g.path("M" + (x - 4) + " " + (y + (height / 2)) + + "L" + (x + (width / 2)) + " " + (y + height + 4) + + "L" + (x + width + 4) + " " + (y + (height / 2)) + + "L" + (x + (width / 2)) + " " + (y - 4) + + "z"); + var overlay = this.g.path("M" + x + " " + (y + (height / 2)) + + "L" + (x + (width / 2)) + " " + (y + height) + + "L" + (x + width) + " " + (y + (height / 2)) + + "L" + (x + (width / 2)) + " " + y + + "z"); + } else if (type == "task") { + var border = this.g.rect(x - 4, y - 4, width + 9, height + 9, TASK_CORNER_ROUND + 4); + var overlay = this.g.rect(x, y, width, height, TASK_CORNER_ROUND); + } + + border.attr({stroke: Color.get(132, 112, 255)/*Color.Tan1*/, "stroke-width": 4, opacity: 0.0}); + border.id = contextObject.id + "_border"; + + set.push(border); + + overlay.attr({stroke: Color.Orange, "stroke-width": 3, fill: Color.get(0, 0, 0), opacity: 0.0, cursor: "hand"}); + overlay.data("set", set); + overlay.id = contextObject.id; + overlay.data("contextObject", contextObject); + + var instance = this; + overlay.mousedown(function (event) { + if (event.button == 2) instance.onRightClick(event, instance, this); + }); + overlay.click(function (event) { + instance.onClick(event, instance, this); + }); + overlay.hover(function (event) { + instance.onHoverIn(event, instance, this); + }, function (event) { + instance.onHoverOut(event, instance, this); + }); + }, + /* * Start Events: - * + * * drawNoneStartEvent * drawTimerStartEvent * drawMessageStartEvent @@ -330,129 +345,131 @@ ProcessDiagramCanvas.prototype = { * _drawStartEventImage * _drawStartEvent */ - - drawNoneStartEvent: function(x, y, width, height) { - this.g.setStart(); - + + drawNoneStartEvent: function (x, y, width, height) { + this.g.setStart(); + var isInterrupting = undefined; this._drawStartEvent(x, y, width, height, isInterrupting, null); - + var set = this.g.setFinish(); this.addHandlers(set, x, y, width, height, "event"); }, - - drawTimerStartEvent: function(x, y, width, height, isInterrupting, name) { - this.g.setStart(); - + + drawTimerStartEvent: function (x, y, width, height, isInterrupting, name) { + this.g.setStart(); + this._drawStartEvent(x, y, width, height, isInterrupting, null); - - var cx = x + width/2 - this.getStroke()/4; - var cy = y + height/2 - this.getStroke()/4; - - var w = width*.9;// - this.getStroke()*2; - var h = height*.9;// - this.getStroke()*2; - + + var cx = x + width / 2 - this.getStroke() / 4; + var cy = y + height / 2 - this.getStroke() / 4; + + var w = width * .9;// - this.getStroke()*2; + var h = height * .9;// - this.getStroke()*2; + this._drawClock(cx, cy, w, h); - + if (this.gebug) - var center = this.g.ellipse(cx, cy, 3, 3).attr({stroke:"none", fill: Color.green}); - + var center = this.g.ellipse(cx, cy, 3, 3).attr({stroke: "none", fill: Color.green}); + var set = this.g.setFinish(); this.addHandlers(set, x, y, width, height, "event"); }, - - drawMessageStartEvent: function(x, y, width, height, isInterrupting, name) { - this.g.setStart(); - + + drawMessageStartEvent: function (x, y, width, height, isInterrupting, name) { + this.g.setStart(); + this._drawStartEvent(x, y, width, height, isInterrupting, null); - + this._drawStartEventImage(x, y, width, height, MESSAGE_CATCH_IMAGE); - + var set = this.g.setFinish(); - this.addHandlers(set, x, y, width, height, "event"); + this.addHandlers(set, x, y, width, height, "event"); }, - - drawErrorStartEvent: function(x, y, width, height, name) { - this.g.setStart(); + + drawErrorStartEvent: function (x, y, width, height, name) { + this.g.setStart(); var isInterrupting = undefined; this._drawStartEvent(x, y, width, height, isInterrupting); this._drawStartEventImage(x, y, width, height, ERROR_CATCH_IMAGE); - + var set = this.g.setFinish(); - this.addHandlers(set, x, y, width, height, "event"); + this.addHandlers(set, x, y, width, height, "event"); }, - - drawSignalStartEvent: function(x, y, width, height, isInterrupting, name) { - this.g.setStart(); + + drawSignalStartEvent: function (x, y, width, height, isInterrupting, name) { + this.g.setStart(); this._drawStartEvent(x, y, width, height, isInterrupting, null); - + this._drawStartEventImage(x, y, width, height, SIGNAL_CATCH_IMAGE); - + var set = this.g.setFinish(); - this.addHandlers(set, x, y, width, height, "event"); - }, - - drawMultipleStartEvent: function(x, y, width, height, isInterrupting, name) { - this.g.setStart(); - - this._drawStartEvent(x, y, width, height, isInterrupting, null); - - var cx = x + width/2 - this.getStroke()/4; - var cy = y + height/2 - this.getStroke()/4; - - var w = width*1; - var h = height*1; - + this.addHandlers(set, x, y, width, height, "event"); + }, + + drawMultipleStartEvent: function (x, y, width, height, isInterrupting, name) { + this.g.setStart(); + + this._drawStartEvent(x, y, width, height, isInterrupting, null); + + var cx = x + width / 2 - this.getStroke() / 4; + var cy = y + height / 2 - this.getStroke() / 4; + + var w = width * 1; + var h = height * 1; + this._drawPentagon(cx, cy, w, h); - + var set = this.g.setFinish(); - this.addHandlers(set, x, y, width, height, "event"); - }, - - _drawStartEventImage: function(x, y, width, height, image){ - var cx = x + width/2 - this.getStroke()/2; - var cy = y + height/2 - this.getStroke()/2; - - var w = width*.65;// - this.getStroke()*2; - var h = height*.65;// - this.getStroke()*2; - - var img = this.g.image(image, cx-w/2, cy-h/2, w, h); - }, - _drawStartEvent: function(x, y, width, height, isInterrupting){ + this.addHandlers(set, x, y, width, height, "event"); + }, + + _drawStartEventImage: function (x, y, width, height, image) { + var cx = x + width / 2 - this.getStroke() / 2; + var cy = y + height / 2 - this.getStroke() / 2; + + var w = width * .65;// - this.getStroke()*2; + var h = height * .65;// - this.getStroke()*2; + + var img = this.g.image(image, cx - w / 2, cy - h / 2, w, h); + }, + _drawStartEvent: function (x, y, width, height, isInterrupting) { var originalPaint = this.getPaint(); - if (typeof(START_EVENT_STROKE_COLOR) != "undefined") + if (typeof (START_EVENT_STROKE_COLOR) != "undefined") this.setPaint(START_EVENT_STROKE_COLOR); - - + + width -= this.strokeWidth / 2; height -= this.strokeWidth / 2; - - x = x + width/2; - y = y + height/2; - - var circle = this.g.ellipse(x, y, width/2, height/2); - - circle.attr({"stroke-width": this.strokeWidth, - "stroke": this.paint, - //"stroke": START_EVENT_STROKE_COLOR, - "fill": START_EVENT_COLOR}); - + + x = x + width / 2; + y = y + height / 2; + + var circle = this.g.ellipse(x, y, width / 2, height / 2); + + circle.attr({ + "stroke-width": this.strokeWidth, + "stroke": this.paint, + //"stroke": START_EVENT_STROKE_COLOR, + "fill": START_EVENT_COLOR + }); + // white shaddow this.drawShaddow(circle); - - if (isInterrupting!=null && isInterrupting!=undefined && !isInterrupting) + + if (isInterrupting != null && isInterrupting != undefined && !isInterrupting) circle.attr({"stroke-dasharray": NON_INTERRUPTING_EVENT_STROKE}); this.setContextToElement(circle); - - + + this.setPaint(originalPaint); }, - + /* * End Events: - * + * * drawNoneEndEvent * drawErrorEndEvent * drawMessageEndEvent @@ -461,146 +478,150 @@ ProcessDiagramCanvas.prototype = { * _drawEndEventImage * _drawNoneEndEvent */ - - drawNoneEndEvent: function(x, y, width, height) { - this.g.setStart(); - + + drawNoneEndEvent: function (x, y, width, height) { + this.g.setStart(); + this._drawNoneEndEvent(x, y, width, height, null, "noneEndEvent"); - + var set = this.g.setFinish(); - this.addHandlers(set, x, y, width, height, "event"); + this.addHandlers(set, x, y, width, height, "event"); }, - - drawErrorEndEvent: function(x, y, width, height) { - this.g.setStart(); + + drawErrorEndEvent: function (x, y, width, height) { + this.g.setStart(); var type = "errorEndEvent"; this._drawNoneEndEvent(x, y, width, height, null, type); - + this._drawEndEventImage(x, y, width, height, ERROR_THROW_IMAGE); - + var set = this.g.setFinish(); - this.addHandlers(set, x, y, width, height, "event"); + this.addHandlers(set, x, y, width, height, "event"); }, - - drawMessageEndEvent: function(x, y, width, height, name) { - this.g.setStart(); + + drawMessageEndEvent: function (x, y, width, height, name) { + this.g.setStart(); var type = "errorEndEvent"; this._drawNoneEndEvent(x, y, width, height, null, type); - + this._drawEndEventImage(x, y, width, height, MESSAGE_THROW_IMAGE); - + var set = this.g.setFinish(); - this.addHandlers(set, x, y, width, height, "event"); + this.addHandlers(set, x, y, width, height, "event"); }, - - drawSignalEndEvent: function(x, y, width, height, name) { - this.g.setStart(); + + drawSignalEndEvent: function (x, y, width, height, name) { + this.g.setStart(); var type = "errorEndEvent"; this._drawNoneEndEvent(x, y, width, height, null, type); - + this._drawEndEventImage(x, y, width, height, SIGNAL_THROW_IMAGE); - + var set = this.g.setFinish(); - this.addHandlers(set, x, y, width, height, "event"); + this.addHandlers(set, x, y, width, height, "event"); }, - - drawMultipleEndEvent: function(x, y, width, height, name) { - this.g.setStart(); + + drawMultipleEndEvent: function (x, y, width, height, name) { + this.g.setStart(); var type = "errorEndEvent"; this._drawNoneEndEvent(x, y, width, height, null, type); - - var cx = x + width/2;// - this.getStroke(); - var cy = y + height/2;// - this.getStroke(); - - var w = width*1; - var h = height*1; - + + var cx = x + width / 2;// - this.getStroke(); + var cy = y + height / 2;// - this.getStroke(); + + var w = width * 1; + var h = height * 1; + var filled = true; this._drawPentagon(cx, cy, w, h, filled); - + var set = this.g.setFinish(); - this.addHandlers(set, x, y, width, height, "event"); + this.addHandlers(set, x, y, width, height, "event"); }, - - drawTerminateEndEvent: function(x, y, width, height) { - this.g.setStart(); + + drawTerminateEndEvent: function (x, y, width, height) { + this.g.setStart(); var type = "errorEndEvent"; this._drawNoneEndEvent(x, y, width, height, null, type); - - var cx = x + width/2;// - this.getStroke()/2; - var cy = y + height/2;// - this.getStroke()/2; - - var w = width/2*.6; - var h = height/2*.6; - + + var cx = x + width / 2;// - this.getStroke()/2; + var cy = y + height / 2;// - this.getStroke()/2; + + var w = width / 2 * .6; + var h = height / 2 * .6; + var circle = this.g.ellipse(cx, cy, w, h).attr({fill: Color.black}); - + var set = this.g.setFinish(); - this.addHandlers(set, x, y, width, height, "event"); - }, - - _drawEndEventImage: function(x, y, width, height, image){ - var cx = x + width/2 - this.getStroke()/2; - var cy = y + height/2 - this.getStroke()/2; - - var w = width*.65; - var h = height*.65; - - var img = this.g.image(image, cx-w/2, cy-h/2, w, h); - }, - - _drawNoneEndEvent: function(x, y, width, height, image, type) { + this.addHandlers(set, x, y, width, height, "event"); + }, + + _drawEndEventImage: function (x, y, width, height, image) { + var cx = x + width / 2 - this.getStroke() / 2; + var cy = y + height / 2 - this.getStroke() / 2; + + var w = width * .65; + var h = height * .65; + + var img = this.g.image(image, cx - w / 2, cy - h / 2, w, h); + }, + + _drawNoneEndEvent: function (x, y, width, height, image, type) { var originalPaint = this.getPaint(); - if (typeof(CATCHING_EVENT_COLOR) != "undefined") + if (typeof (CATCHING_EVENT_COLOR) != "undefined") this.setPaint(CATCHING_EVENT_COLOR); - + var strokeColor = this.getPaint(); var fillColor = this.getPaint(); - + if (type == "errorEndEvent") { strokeColor = ERROR_END_EVENT_STROKE_COLOR; fillColor = ERROR_END_EVENT_COLOR; } else if (type == "noneEndEvent") { strokeColor = NONE_END_EVENT_STROKE_COLOR; fillColor = NONE_END_EVENT_COLOR; - } else - - // event circles - width -= this.strokeWidth / 2; + } else + + // event circles + width -= this.strokeWidth / 2; height -= this.strokeWidth / 2; - - x = x + width/2;// + this.strokeWidth/2; - y = y + width/2;// + this.strokeWidth/2; - + + x = x + width / 2;// + this.strokeWidth/2; + y = y + width / 2;// + this.strokeWidth/2; + // outerCircle - var outerCircle = this.g.ellipse(x, y, width/2, height/2); - + var outerCircle = this.g.ellipse(x, y, width / 2, height / 2); + // white shaddow var shaddow = this.drawShaddow(outerCircle); - - outerCircle.attr({"stroke-width": this.strokeWidth, - "stroke": strokeColor, - "fill": fillColor}); - + + outerCircle.attr({ + "stroke-width": this.strokeWidth, + "stroke": strokeColor, + "fill": fillColor + }); + var innerCircleX = x; var innerCircleY = y; - var innerCircleWidth = width/2 - 2; - var innerCircleHeight = height/2 - 2; + var innerCircleWidth = width / 2 - 2; + var innerCircleHeight = height / 2 - 2; var innerCircle = this.g.ellipse(innerCircleX, innerCircleY, innerCircleWidth, innerCircleHeight); - innerCircle.attr({"stroke-width": this.strokeWidth, - "stroke": strokeColor, - "fill": Color.white}); + innerCircle.attr({ + "stroke-width": this.strokeWidth, + "stroke": strokeColor, + "fill": Color.white + }); // TODO: implement it //var originalPaint = this.getPaint(); //this.g.setPaint(BOUNDARY_EVENT_COLOR); - + this.setPaint(originalPaint); }, - + /* * Catching Events: - * + * * drawCatchingTimerEvent * drawCatchingErrorEvent * drawCatchingSignalEvent @@ -609,135 +630,139 @@ ProcessDiagramCanvas.prototype = { * _drawCatchingEventImage * _drawCatchingEvent */ - - - drawCatchingTimerEvent: function(x, y, width, height, isInterrupting, name) { - this.g.setStart(); + + + drawCatchingTimerEvent: function (x, y, width, height, isInterrupting, name) { + this.g.setStart(); this._drawCatchingEvent(x, y, width, height, isInterrupting, null); - + var innerCircleWidth = width - 4; var innerCircleHeight = height - 4; - - var cx = x + width/2 - this.getStroke()/4; - var cy = y + height/2 - this.getStroke()/4; - - var w = innerCircleWidth*.9;// - this.getStroke()*2; - var h = innerCircleHeight*.9;// - this.getStroke()*2; - + + var cx = x + width / 2 - this.getStroke() / 4; + var cy = y + height / 2 - this.getStroke() / 4; + + var w = innerCircleWidth * .9;// - this.getStroke()*2; + var h = innerCircleHeight * .9;// - this.getStroke()*2; + this._drawClock(cx, cy, w, h); - + var set = this.g.setFinish(); this.addHandlers(set, x, y, width, height, "event"); }, - drawCatchingErrorEvent: function(x, y, width, height, isInterrupting, name) { - this.g.setStart(); + drawCatchingErrorEvent: function (x, y, width, height, isInterrupting, name) { + this.g.setStart(); this._drawCatchingEvent(x, y, width, height, isInterrupting, null); - + this._drawCatchingEventImage(x, y, width, height, ERROR_CATCH_IMAGE); - + var set = this.g.setFinish(); - this.addHandlers(set, x, y, width, height, "event"); + this.addHandlers(set, x, y, width, height, "event"); }, - - drawCatchingSignalEvent: function(x, y, width, height, isInterrupting, name) { - this.g.setStart(); + + drawCatchingSignalEvent: function (x, y, width, height, isInterrupting, name) { + this.g.setStart(); this._drawCatchingEvent(x, y, width, height, isInterrupting, null); - + this._drawCatchingEventImage(x, y, width, height, SIGNAL_CATCH_IMAGE); - + var set = this.g.setFinish(); - this.addHandlers(set, x, y, width, height, "event"); + this.addHandlers(set, x, y, width, height, "event"); }, - - drawCatchingMessageEvent: function(x, y, width, height, isInterrupting, name) { - this.g.setStart(); + + drawCatchingMessageEvent: function (x, y, width, height, isInterrupting, name) { + this.g.setStart(); this._drawCatchingEvent(x, y, width, height, isInterrupting, null); - + this._drawCatchingEventImage(x, y, width, height, MESSAGE_CATCH_IMAGE); - + var set = this.g.setFinish(); - this.addHandlers(set, x, y, width, height, "event"); + this.addHandlers(set, x, y, width, height, "event"); }, - - drawCatchingMultipleEvent: function(x, y, width, height, isInterrupting, name) { - this.g.setStart(); + + drawCatchingMultipleEvent: function (x, y, width, height, isInterrupting, name) { + this.g.setStart(); this._drawCatchingEvent(x, y, width, height, isInterrupting, null); - - var cx = x + width/2 - this.getStroke(); - var cy = y + height/2 - this.getStroke(); - - var w = width*.9; - var h = height*.9; - + + var cx = x + width / 2 - this.getStroke(); + var cy = y + height / 2 - this.getStroke(); + + var w = width * .9; + var h = height * .9; + this._drawPentagon(cx, cy, w, h); - + var set = this.g.setFinish(); - this.addHandlers(set, x, y, width, height, "event"); + this.addHandlers(set, x, y, width, height, "event"); }, - - _drawCatchingEventImage: function(x, y, width, height, image){ + + _drawCatchingEventImage: function (x, y, width, height, image) { var innerCircleWidth = width - 4; var innerCircleHeight = height - 4; - - var cx = x + width/2 - this.getStroke()/2; - var cy = y + height/2 - this.getStroke()/2; - - var w = innerCircleWidth*.6;// - this.getStroke()*2; - var h = innerCircleHeight*.6;// - this.getStroke()*2; - - var img = this.g.image(image, cx-w/2, cy-h/2, w, h); - }, - - _drawCatchingEvent: function(x, y, width, height, isInterrupting, image) { + + var cx = x + width / 2 - this.getStroke() / 2; + var cy = y + height / 2 - this.getStroke() / 2; + + var w = innerCircleWidth * .6;// - this.getStroke()*2; + var h = innerCircleHeight * .6;// - this.getStroke()*2; + + var img = this.g.image(image, cx - w / 2, cy - h / 2, w, h); + }, + + _drawCatchingEvent: function (x, y, width, height, isInterrupting, image) { var originalPaint = this.getPaint(); - if (typeof(CATCHING_EVENT_COLOR) != "undefined") + if (typeof (CATCHING_EVENT_COLOR) != "undefined") this.setPaint(CATCHING_EVENT_COLOR); - + // event circles width -= this.strokeWidth / 2; height -= this.strokeWidth / 2; - - x = x + width/2;// + this.strokeWidth/2; - y = y + width/2;// + this.strokeWidth/2; - + + x = x + width / 2;// + this.strokeWidth/2; + y = y + width / 2;// + this.strokeWidth/2; + // outerCircle - var outerCircle = this.g.ellipse(x, y, width/2, height/2); - + var outerCircle = this.g.ellipse(x, y, width / 2, height / 2); + // white shaddow var shaddow = this.drawShaddow(outerCircle); - + //console.log("isInterrupting: " + isInterrupting, "x:" , x, "y:",y); - if (isInterrupting!=null && isInterrupting!=undefined && !isInterrupting) + if (isInterrupting != null && isInterrupting != undefined && !isInterrupting) outerCircle.attr({"stroke-dasharray": NON_INTERRUPTING_EVENT_STROKE}); - - outerCircle.attr({"stroke-width": this.strokeWidth, - "stroke": this.getPaint(), - "fill": BOUNDARY_EVENT_COLOR}); - + + outerCircle.attr({ + "stroke-width": this.strokeWidth, + "stroke": this.getPaint(), + "fill": BOUNDARY_EVENT_COLOR + }); + var innerCircleX = x; var innerCircleY = y; - var innerCircleRadiusX = width/2 - 4; - var innerCircleRadiusY = height/2 - 4; + var innerCircleRadiusX = width / 2 - 4; + var innerCircleRadiusY = height / 2 - 4; var innerCircle = this.g.ellipse(innerCircleX, innerCircleY, innerCircleRadiusX, innerCircleRadiusY); - innerCircle.attr({"stroke-width": this.strokeWidth, - "stroke": this.getPaint()}); + innerCircle.attr({ + "stroke-width": this.strokeWidth, + "stroke": this.getPaint() + }); if (image) { - var imageWidth = imageHeight = innerCircleRadiusX*1.2 + this.getStroke()*2; - var imageX = innerCircleX-imageWidth/2 - this.strokeWidth/2; - var imageY = innerCircleY-imageWidth/2 - this.strokeWidth/2; + var imageWidth = imageHeight = innerCircleRadiusX * 1.2 + this.getStroke() * 2; + var imageX = innerCircleX - imageWidth / 2 - this.strokeWidth / 2; + var imageY = innerCircleY - imageWidth / 2 - this.strokeWidth / 2; var img = this.g.image(image, imageX, imageY, imageWidth, imageHeight); } - + this.setPaint(originalPaint); - + var set = this.g.set(); set.push(outerCircle, innerCircle, shaddow); this.setContextToElement(outerCircle); - + // TODO: add shapes to set - + /* var st = this.g.set(); st.push( @@ -747,64 +772,64 @@ ProcessDiagramCanvas.prototype = { st.attr({fill: "red", "stroke-width":0}); */ }, - + /* * Catching Events: - * + * * drawThrowingNoneEvent * drawThrowingSignalEvent * drawThrowingMessageEvent * drawThrowingMultipleEvent */ - - drawThrowingNoneEvent: function(x, y, width, height, name) { - this.g.setStart(); + + drawThrowingNoneEvent: function (x, y, width, height, name) { + this.g.setStart(); this._drawCatchingEvent(x, y, width, height, null, null); - + var set = this.g.setFinish(); - this.addHandlers(set, x, y, width, height, "event"); + this.addHandlers(set, x, y, width, height, "event"); }, - - drawThrowingSignalEvent: function(x, y, width, height, name) { - this.g.setStart(); + + drawThrowingSignalEvent: function (x, y, width, height, name) { + this.g.setStart(); this._drawCatchingEvent(x, y, width, height, null, null); - + this._drawCatchingEventImage(x, y, width, height, SIGNAL_THROW_IMAGE); - + var set = this.g.setFinish(); - this.addHandlers(set, x, y, width, height, "event"); + this.addHandlers(set, x, y, width, height, "event"); }, - - drawThrowingMessageEvent: function(x, y, width, height, name) { - this.g.setStart(); + + drawThrowingMessageEvent: function (x, y, width, height, name) { + this.g.setStart(); this._drawCatchingEvent(x, y, width, height, null, null); - + this._drawCatchingEventImage(x, y, width, height, MESSAGE_THROW_IMAGE); - + var set = this.g.setFinish(); - this.addHandlers(set, x, y, width, height, "event"); + this.addHandlers(set, x, y, width, height, "event"); }, - - drawThrowingMultipleEvent: function(x, y, width, height, name) { - this.g.setStart(); + + drawThrowingMultipleEvent: function (x, y, width, height, name) { + this.g.setStart(); this._drawCatchingEvent(x, y, width, height, null, null); - - var cx = x + width/2 - this.getStroke(); - var cy = y + height/2 - this.getStroke(); - - var w = width*.9; - var h = height*.9; - + + var cx = x + width / 2 - this.getStroke(); + var cy = y + height / 2 - this.getStroke(); + + var w = width * .9; + var h = height * .9; + var filled = true; this._drawPentagon(cx, cy, w, h, filled); - + var set = this.g.setFinish(); - this.addHandlers(set, x, y, width, height, "event"); + this.addHandlers(set, x, y, width, height, "event"); }, - + /* * Draw flows: - * + * * _connectFlowToActivity * _drawFlow * _drawDefaultSequenceFlowIndicator @@ -816,87 +841,99 @@ ProcessDiagramCanvas.prototype = { * _drawConditionalSequenceFlowIndicator * drawSequenceflowWithoutArrow */ - - _connectFlowToActivity: function(sourceActivityId, destinationActivityId, waypoints){ + + _connectFlowToActivity: function (sourceActivityId, destinationActivityId, waypoints) { var sourceActivity = this.g.getById(sourceActivityId); var destinationActivity = this.g.getById(destinationActivityId); if (sourceActivity == null || destinationActivity == null) { if (sourceActivity == null) - console.error("source activity["+sourceActivityId+"] not found"); + console.error("source activity[" + sourceActivityId + "] not found"); else - console.error("destination activity["+destinationActivityId+"] not found"); + console.error("destination activity[" + destinationActivityId + "] not found"); return null; } - var bbSourceActivity = sourceActivity.getBBox() - var bbDestinationActivity = destinationActivity.getBBox() - - var path = []; - var newWaypoints = []; - for(var i = 0; i < waypoints.length; i++){ - var pathType = "" - if (i==0) - pathType = "M"; - else - pathType = "L"; - - path.push([pathType, waypoints[i].x, waypoints[i].y]); - newWaypoints.push({x:waypoints[i].x, y:waypoints[i].y}); - } + var bbSourceActivity = sourceActivity.getBBox() + var bbDestinationActivity = destinationActivity.getBBox() - var ninjaPathSourceActivity = this.ninjaPaper.path(sourceActivity.realPath); - var ninjaPathDestinationActivity = this.ninjaPaper.path(destinationActivity.realPath); - var ninjaBBSourceActivity = ninjaPathSourceActivity.getBBox(); - var ninjaBBDestinationActivity = ninjaPathDestinationActivity.getBBox(); - - // set target of the flow to the center of the taskObject - var newPath = path; - var originalSource = {x: newPath[0][1], y: newPath[0][2]}; - var originalTarget = {x: newPath[newPath.length-1][1], y: newPath[newPath.length-1][2]}; - newPath[0][1] = ninjaBBSourceActivity.x + (ninjaBBSourceActivity.x2 - ninjaBBSourceActivity.x ) / 2; - newPath[0][2] = ninjaBBSourceActivity.y + (ninjaBBSourceActivity.y2 - ninjaBBSourceActivity.y ) / 2; - newPath[newPath.length-1][1] = ninjaBBDestinationActivity.x + (ninjaBBDestinationActivity.x2 - ninjaBBDestinationActivity.x ) / 2; - newPath[newPath.length-1][2] = ninjaBBDestinationActivity.y + (ninjaBBDestinationActivity.y2 - ninjaBBDestinationActivity.y ) / 2; - - var ninjaPathFlowObject = this.ninjaPaper.path(newPath); - var ninjaBBFlowObject = ninjaPathFlowObject.getBBox(); - - var intersectionsSource = Raphael.pathIntersection(ninjaPathSourceActivity.realPath, ninjaPathFlowObject.realPath); - var intersectionsDestination = Raphael.pathIntersection(ninjaPathDestinationActivity.realPath, ninjaPathFlowObject.realPath); - var intersectionSource = intersectionsSource.pop(); - var intersectionDestination = intersectionsDestination.pop(); - - if (intersectionSource != undefined) { - if (this.gebug) { - var diameter = 5; - var dotOriginal = this.g.ellipse(originalSource.x, originalSource.y, diameter, diameter).attr({"fill": Color.white, "stroke": Color.Pink}); - var dot = this.g.ellipse(intersectionSource.x, intersectionSource.y, diameter, diameter).attr({"fill": Color.white, "stroke": Color.Green}); - } - - newWaypoints[0].x = intersectionSource.x; - newWaypoints[0].y = intersectionSource.y; + var path = []; + var newWaypoints = []; + for (var i = 0; i < waypoints.length; i++) { + var pathType = "" + if (i == 0) + pathType = "M"; + else + pathType = "L"; + + path.push([pathType, waypoints[i].x, waypoints[i].y]); + newWaypoints.push({x: waypoints[i].x, y: waypoints[i].y}); + } + + var ninjaPathSourceActivity = this.ninjaPaper.path(sourceActivity.realPath); + var ninjaPathDestinationActivity = this.ninjaPaper.path(destinationActivity.realPath); + var ninjaBBSourceActivity = ninjaPathSourceActivity.getBBox(); + var ninjaBBDestinationActivity = ninjaPathDestinationActivity.getBBox(); + + // set target of the flow to the center of the taskObject + var newPath = path; + var originalSource = {x: newPath[0][1], y: newPath[0][2]}; + var originalTarget = {x: newPath[newPath.length - 1][1], y: newPath[newPath.length - 1][2]}; + newPath[0][1] = ninjaBBSourceActivity.x + (ninjaBBSourceActivity.x2 - ninjaBBSourceActivity.x) / 2; + newPath[0][2] = ninjaBBSourceActivity.y + (ninjaBBSourceActivity.y2 - ninjaBBSourceActivity.y) / 2; + newPath[newPath.length - 1][1] = ninjaBBDestinationActivity.x + (ninjaBBDestinationActivity.x2 - ninjaBBDestinationActivity.x) / 2; + newPath[newPath.length - 1][2] = ninjaBBDestinationActivity.y + (ninjaBBDestinationActivity.y2 - ninjaBBDestinationActivity.y) / 2; + + var ninjaPathFlowObject = this.ninjaPaper.path(newPath); + var ninjaBBFlowObject = ninjaPathFlowObject.getBBox(); + + var intersectionsSource = Raphael.pathIntersection(ninjaPathSourceActivity.realPath, ninjaPathFlowObject.realPath); + var intersectionsDestination = Raphael.pathIntersection(ninjaPathDestinationActivity.realPath, ninjaPathFlowObject.realPath); + var intersectionSource = intersectionsSource.pop(); + var intersectionDestination = intersectionsDestination.pop(); + + if (intersectionSource != undefined) { + if (this.gebug) { + var diameter = 5; + var dotOriginal = this.g.ellipse(originalSource.x, originalSource.y, diameter, diameter).attr({ + "fill": Color.white, + "stroke": Color.Pink + }); + var dot = this.g.ellipse(intersectionSource.x, intersectionSource.y, diameter, diameter).attr({ + "fill": Color.white, + "stroke": Color.Green + }); } - if (intersectionDestination != undefined) { - if (this.gebug) { - var diameter = 5; - var dotOriginal = this.g.ellipse(originalTarget.x, originalTarget.y, diameter, diameter).attr({"fill": Color.white, "stroke": Color.Red}); - var dot = this.g.ellipse(intersectionDestination.x, intersectionDestination.y, diameter, diameter).attr({"fill": Color.white, "stroke": Color.Blue}); - } - - newWaypoints[newWaypoints.length-1].x = intersectionDestination.x; - newWaypoints[newWaypoints.length-1].y = intersectionDestination.y; + + newWaypoints[0].x = intersectionSource.x; + newWaypoints[0].y = intersectionSource.y; + } + if (intersectionDestination != undefined) { + if (this.gebug) { + var diameter = 5; + var dotOriginal = this.g.ellipse(originalTarget.x, originalTarget.y, diameter, diameter).attr({ + "fill": Color.white, + "stroke": Color.Red + }); + var dot = this.g.ellipse(intersectionDestination.x, intersectionDestination.y, diameter, diameter).attr({ + "fill": Color.white, + "stroke": Color.Blue + }); } - - this.ninjaPaper.clear(); + + newWaypoints[newWaypoints.length - 1].x = intersectionDestination.x; + newWaypoints[newWaypoints.length - 1].y = intersectionDestination.y; + } + + this.ninjaPaper.clear(); return newWaypoints; }, - - _drawFlow: function(waypoints, conditional, isDefault, highLighted, withArrowHead, connectionType){ + + _drawFlow: function (waypoints, conditional, isDefault, highLighted, withArrowHead, connectionType) { var originalPaint = this.getPaint(); var originalStroke = this.getStroke(); - + this.setPaint(SEQUENCEFLOW_COLOR); this.setStroke(SEQUENCEFLOW_STROKE); - + if (highLighted) { this.setPaint(HIGHLIGHT_COLOR); this.setStroke(SEQUENCEFLOW_HIGHLIGHT_STROKE); @@ -904,32 +941,32 @@ ProcessDiagramCanvas.prototype = { // TODO: generate polylineId or do something!! var uuid = Raphael.createUUID(); - + var contextObject = this.getConextObject(); var newWaypoints = waypoints; if (contextObject) { var newWaypoints = this._connectFlowToActivity(contextObject.sourceActivityId, contextObject.destinationActivityId, waypoints); - + if (!newWaypoints) { - console.error("Error draw flow from '"+contextObject.sourceActivityId+"' to '"+contextObject.destinationActivityId+"' "); + console.error("Error draw flow from '" + contextObject.sourceActivityId + "' to '" + contextObject.destinationActivityId + "' "); return; } } var polyline = new Polyline(uuid, newWaypoints, this.getStroke()); //var polyline = new Polyline(waypoints, 3); - + polyline.element = this.g.path(polyline.path); polyline.element.attr("stroke-width", this.getStroke()); polyline.element.attr("stroke", this.getPaint()); - + if (contextObject) { polyline.element.id = contextObject.id; polyline.element.data("contextObject", contextObject); } else { polyline.element.id = uuid; } - - + + /* polyline.element.mouseover(function(){ this.attr({"stroke-width": NORMAL_STROKE + 2}); @@ -937,16 +974,16 @@ ProcessDiagramCanvas.prototype = { this.attr({"stroke-width": NORMAL_STROKE}); }); */ - - var last = polyline.getAnchorsCount()-1; + + var last = polyline.getAnchorsCount() - 1; var x = polyline.getAnchor(last).x; var y = polyline.getAnchor(last).y; //var c = this.g.ellipse(x, y, 5, 5); - - var lastLineIndex = polyline.getLinesCount()-1; + + var lastLineIndex = polyline.getLinesCount() - 1; var line = polyline.getLine(lastLineIndex); var firstLine = polyline.getLine(0); - + var arrowHead = null, circleTail = null, defaultSequenceFlowIndicator = null, @@ -955,57 +992,62 @@ ProcessDiagramCanvas.prototype = { if (connectionType == CONNECTION_TYPE.MESSAGE_FLOW) { circleTail = this._drawCircleTail(firstLine, connectionType); } - if(withArrowHead) + if (withArrowHead) arrowHead = this._drawArrowHead(line, connectionType); - + //console.log("isDefault: ", isDefault, ", isDefaultConditionAvailable: ", polyline.isDefaultConditionAvailable); if (isDefault && polyline.isDefaultConditionAvailable) { //var angle = polyline.getLineAngle(0); //console.log("firstLine", firstLine); defaultSequenceFlowIndicator = this._drawDefaultSequenceFlowIndicator(firstLine); } - + if (conditional) { conditionalSequenceFlowIndicator = this._drawConditionalSequenceFlowIndicator(firstLine); } - // draw flow name - var flowName = contextObject.name; - if (flowName) { - var xPointArray = contextObject.xPointArray; - var yPointArray = contextObject.yPointArray; - var textX = xPointArray[0] < xPointArray[1] ? xPointArray[0] : xPointArray[1]; - var textY = yPointArray[0] < yPointArray[1] ? yPointArray[1] : yPointArray[0]; - // fix xy - textX += 20; - textY -= 10; - this.g.text(textX, textY, flowName).attr(LABEL_FONT); - } - + // draw flow name + var flowName = contextObject.name; + if (flowName) { + var xPointArray = contextObject.xPointArray; + var yPointArray = contextObject.yPointArray; + var textX = xPointArray[0] < xPointArray[1] ? xPointArray[0] : xPointArray[1]; + var textY = yPointArray[0] < yPointArray[1] ? yPointArray[1] : yPointArray[0]; + // fix xy + textX += 20; + textY -= 10; + this.g.text(textX, textY, flowName).attr(LABEL_FONT); + } + var st = this.g.set(); st.push(polyline.element, arrowHead, circleTail, conditionalSequenceFlowIndicator); polyline.element.data("set", st); polyline.element.data("withArrowHead", withArrowHead); - - var polyCloneAttrNormal = {"stroke-width": this.getStroke() + 5, stroke: Color.get(132,112,255), opacity: 0.0, cursor: "hand"}; + + var polyCloneAttrNormal = { + "stroke-width": this.getStroke() + 5, + stroke: Color.get(132, 112, 255), + opacity: 0.0, + cursor: "hand" + }; var polyClone = st.clone().attr(polyCloneAttrNormal).hover(function () { - //if (polyLine.data("isSelected")) return; - polyClone.attr({opacity: 0.2}); - }, function () { - //if (polyLine.data("isSelected")) return; - polyClone.attr({opacity: 0.0}); - }); + //if (polyLine.data("isSelected")) return; + polyClone.attr({opacity: 0.2}); + }, function () { + //if (polyLine.data("isSelected")) return; + polyClone.attr({opacity: 0.0}); + }); polyClone.data("objectId", polyline.element.id); - polyClone.click(function(){ + polyClone.click(function () { var instance = this; var objectId = instance.data("objectId"); var object = this.paper.getById(objectId); var contextObject = object.data("contextObject"); if (contextObject) { - console.log("[flow], objectId: " + object.id +", flow: " + contextObject.flow); + console.log("[flow], objectId: " + object.id + ", flow: " + contextObject.flow); ProcessDiagramGenerator.showFlowInfo(contextObject); } - }).dblclick(function(){ + }).dblclick(function () { console.log("!!! DOUBLE CLICK !!!"); }).hover(function (mouseEvent) { var instance = this; @@ -1016,128 +1058,129 @@ ProcessDiagramCanvas.prototype = { ProcessDiagramGenerator.showFlowInfo(contextObject); }); polyClone.data("parentId", uuid); - + if (!connectionType || connectionType == CONNECTION_TYPE.SEQUENCE_FLOW) polyline.element.attr("stroke-width", this.getStroke()); else if (connectionType == CONNECTION_TYPE.MESSAGE_FLOW) polyline.element.attr({"stroke-dasharray": "--"}); else if (connectionType == CONNECTION_TYPE.ASSOCIATION) polyline.element.attr({"stroke-dasharray": ". "}); - + this.setPaint(originalPaint); this.setStroke(originalStroke); }, - - _drawDefaultSequenceFlowIndicator: function(line) { + + _drawDefaultSequenceFlowIndicator: function (line) { //console.log("line: ", line); - - var len = 10; c = len/2, f = 8; + + var len = 10; + c = len / 2, f = 8; var defaultIndicator = this.g.path("M" + (-c) + " " + 0 + "L" + (c) + " " + 0); - defaultIndicator.attr("stroke-width", this.getStroke()+0); + defaultIndicator.attr("stroke-width", this.getStroke() + 0); defaultIndicator.attr("stroke", this.getPaint()); - - + + var cosAngle = Math.cos((line.angle)); var sinAngle = Math.sin((line.angle)); - + var dx = f * cosAngle; var dy = f * sinAngle; - - var x1 = line.x1 + dx + 0*c*cosAngle; - var y1 = line.y1 + dy + 0*c*sinAngle; - + + var x1 = line.x1 + dx + 0 * c * cosAngle; + var y1 = line.y1 + dy + 0 * c * sinAngle; + defaultIndicator.transform("t" + (x1) + "," + (y1) + ""); - defaultIndicator.transform("...r" + Raphael.deg(line.angle - 3*Math.PI / 4) + " " + 0 + " " + 0); + defaultIndicator.transform("...r" + Raphael.deg(line.angle - 3 * Math.PI / 4) + " " + 0 + " " + 0); /* var c0 = this.g.ellipse(0, 0, 1, 1).attr({stroke: Color.Blue}); c0.transform("t" + (line.x1) + "," + (line.y1) + ""); var center = this.g.ellipse(0, 0, 1, 1).attr({stroke: Color.Red}); center.transform("t" + (line.x1+dx) + "," + (line.y1+dy) + ""); */ - + return defaultIndicator; }, - - drawSequenceflow: function(waypoints, conditional, isDefault, highLighted) { + + drawSequenceflow: function (waypoints, conditional, isDefault, highLighted) { var withArrowHead = true; this._drawFlow(waypoints, conditional, isDefault, highLighted, withArrowHead, CONNECTION_TYPE.SEQUENCE_FLOW); }, - - drawMessageflow: function(waypoints, highLighted) { + + drawMessageflow: function (waypoints, highLighted) { var withArrowHead = true; - var conditional=isDefault=false; + var conditional = isDefault = false; this._drawFlow(waypoints, conditional, isDefault, highLighted, withArrowHead, CONNECTION_TYPE.MESSAGE_FLOW); }, - - drawAssociation: function(waypoints, withArrowHead, highLighted) { + + drawAssociation: function (waypoints, withArrowHead, highLighted) { var withArrowHead = withArrowHead; - var conditional=isDefault=false; + var conditional = isDefault = false; this._drawFlow(waypoints, conditional, isDefault, highLighted, withArrowHead, CONNECTION_TYPE.ASSOCIATION); }, - - _drawCircleTail: function(line, connectionType){ - var diameter = ARROW_WIDTH/2*1.5; - + + _drawCircleTail: function (line, connectionType) { + var diameter = ARROW_WIDTH / 2 * 1.5; + // anti smoothing - if (this.strokeWidth%2 == 1) + if (this.strokeWidth % 2 == 1) line.x1 += .5, line.y1 += .5; - + var circleTail = this.g.ellipse(line.x1, line.y1, diameter, diameter); circleTail.attr("fill", Color.white); circleTail.attr("stroke", this.getPaint()); - + return circleTail; }, - - _drawArrowHead: function(line, connectionType){ + + _drawArrowHead: function (line, connectionType) { var doubleArrowWidth = 2 * ARROW_WIDTH; - + if (connectionType == CONNECTION_TYPE.ASSOCIATION) - var arrowHead = this.g.path("M-" + (ARROW_WIDTH/2+.5) + " -" + doubleArrowWidth + "L 0 0 L" + (ARROW_WIDTH/2+.5) + " -" + doubleArrowWidth); + var arrowHead = this.g.path("M-" + (ARROW_WIDTH / 2 + .5) + " -" + doubleArrowWidth + "L 0 0 L" + (ARROW_WIDTH / 2 + .5) + " -" + doubleArrowWidth); else - var arrowHead = this.g.path("M0 0L-" + (ARROW_WIDTH/2+.5) + " -" + doubleArrowWidth + "L" + (ARROW_WIDTH/2+.5) + " -" + doubleArrowWidth + "z"); - + var arrowHead = this.g.path("M0 0L-" + (ARROW_WIDTH / 2 + .5) + " -" + doubleArrowWidth + "L" + (ARROW_WIDTH / 2 + .5) + " -" + doubleArrowWidth + "z"); + //arrowHead.transform("t" + 0 + ",-" + this.getStroke() + ""); - + // anti smoothing - if (this.strokeWidth%2 == 1) + if (this.strokeWidth % 2 == 1) line.x2 += .5, line.y2 += .5; - + arrowHead.transform("t" + line.x2 + "," + line.y2 + ""); arrowHead.transform("...r" + Raphael.deg(line.angle - Math.PI / 2) + " " + 0 + " " + 0); - + if (!connectionType || connectionType == CONNECTION_TYPE.SEQUENCE_FLOW) arrowHead.attr("fill", this.getPaint()); else if (connectionType == CONNECTION_TYPE.MESSAGE_FLOW) arrowHead.attr("fill", Color.white); - + arrowHead.attr("stroke-width", this.getStroke()); arrowHead.attr("stroke", this.getPaint()); - + return arrowHead; }, - + /* drawArrowHead2: function(srcX, srcY, targetX, targetY) { var doubleArrowWidth = 2 * ARROW_WIDTH; - + //var arrowHead = this.g.path("M-" + ARROW_WIDTH/2 + " -" + doubleArrowWidth + "L0 0" + "L" + ARROW_WIDTH/2 + " -" + doubleArrowWidth + "z"); - + var arrowHead = this.g.path("M0 0L-" + ARROW_WIDTH/1.5 + " -" + doubleArrowWidth + "L" + ARROW_WIDTH/1.5 + " -" + doubleArrowWidth + "z"); //var c = DefaultProcessDiagramCanvas.g.ellipse(0, 0, 3, 3); //c.transform("t"+targetX+","+targetY+""); - + var angle = Math.atan2(targetY - srcY, targetX - srcX); - + arrowHead.transform("t"+targetX+","+targetY+""); arrowHead.transform("...r" + Raphael.deg(angle - Math.PI / 2) + " "+0+" "+0); - + //console.log(arrowHead.transform()); //console.log("--> " + Raphael.deg(angle - Math.PI / 2)); - + arrowHead.attr("fill", this.getPaint()); arrowHead.attr("stroke", this.getPaint()); - + / * // shaddow var c0 = arrowHead.clone(); @@ -1149,17 +1192,17 @@ ProcessDiagramCanvas.prototype = { * / }, */ - - _drawConditionalSequenceFlowIndicator: function(line){ + + _drawConditionalSequenceFlowIndicator: function (line) { var horizontal = (CONDITIONAL_INDICATOR_WIDTH * 0.7); var halfOfHorizontal = horizontal / 2; var halfOfVertical = CONDITIONAL_INDICATOR_WIDTH / 2; var uuid = null; var waypoints = [{x: 0, y: 0}, - {x: -halfOfHorizontal, y: halfOfVertical}, - {x: 0, y: CONDITIONAL_INDICATOR_WIDTH}, - {x: halfOfHorizontal, y: halfOfVertical}]; + {x: -halfOfHorizontal, y: halfOfVertical}, + {x: 0, y: CONDITIONAL_INDICATOR_WIDTH}, + {x: halfOfHorizontal, y: halfOfVertical}]; /* var polyline = new Polyline(uuid, waypoints, this.getStroke()); polyline.element = this.g.path(polyline.path); @@ -1170,88 +1213,88 @@ ProcessDiagramCanvas.prototype = { var polygone = new Polygone(waypoints, this.getStroke()); polygone.element = this.g.path(polygone.path); polygone.element.attr("fill", Color.white); - + polygone.transform("t" + line.x1 + "," + line.y1 + ""); polygone.transform("...r" + Raphael.deg(line.angle - Math.PI / 2) + " " + 0 + " " + 0); - - + + var cosAngle = Math.cos((line.angle)); var sinAngle = Math.sin((line.angle)); - + //polygone.element.attr("stroke-width", this.getStroke()); //polygone.element.attr("stroke", this.getPaint()); - + polygone.attr({"stroke-width": this.getStroke(), "stroke": this.getPaint()}); - + return polygone.element; }, - - drawSequenceflowWithoutArrow: function(waypoints, conditional, isDefault, highLighted) { + + drawSequenceflowWithoutArrow: function (waypoints, conditional, isDefault, highLighted) { var withArrowHead = false; this._drawFlow(waypoints, conditional, isDefault, highLighted, withArrowHead, CONNECTION_TYPE.SEQUENCE_FLOW); }, - + /* * Draw artifacts */ - - drawPoolOrLane: function(x, y, width, height, name){ + + drawPoolOrLane: function (x, y, width, height, name) { // anti smoothing - if (this.strokeWidth%2 == 1) + if (this.strokeWidth % 2 == 1) x = Math.round(x) + .5, y = Math.round(y) + .5; - + // shape var rect = this.g.rect(x, y, width, height); var attr = {"stroke-width": NORMAL_STROKE, stroke: TASK_STROKE_COLOR}; rect.attr(attr); - + // Add the name as text, vertical - if(name != null && name.length > 0) { + if (name != null && name.length > 0) { var attr = POOL_LANE_FONT; - + // Include some padding var availableTextSpace = height - 6; - + // Create rotation for derived font var truncated = this.fitTextToWidth(name, availableTextSpace); var realWidth = this.getStringWidth(truncated, attr); var realHeight = this.getStringHeight(truncated, attr); - + //console.log("truncated:", truncated, ", height:", height, ", realHeight:", realHeight, ", availableTextSpace:", availableTextSpace, ", realWidth:", realWidth); - var newX = x + 2 + realHeight*1 - realHeight/2; - var newY = 3 + y + availableTextSpace - (availableTextSpace - realWidth) / 2 - realWidth/2; + var newX = x + 2 + realHeight * 1 - realHeight / 2; + var newY = 3 + y + availableTextSpace - (availableTextSpace - realWidth) / 2 - realWidth / 2; var textElement = this.g.text(newX, newY, truncated).attr(attr); //console.log(".getBBox(): ", t.getBBox()); - textElement.transform("r" + Raphael.deg(270 * Math.PI/180) + " " + newX + " " + newY); + textElement.transform("r" + Raphael.deg(270 * Math.PI / 180) + " " + newX + " " + newY); } - + // TODO: add to set }, - - _drawTask: function(name, x, y, width, height, thickBorder) { + + _drawTask: function (name, x, y, width, height, thickBorder) { var originalPaint = this.getPaint(); this.setPaint(TASK_COLOR); - + // anti smoothing - if (this.strokeWidth%2 == 1) + if (this.strokeWidth % 2 == 1) x = Math.round(x) + .5, y = Math.round(y) + .5; - + // shape var shape = this.g.rect(x, y, width, height, TASK_CORNER_ROUND); var attr = {"stroke-width": this.strokeWidth, stroke: TASK_STROKE_COLOR, fill: this.getPaint()}; shape.attr(attr); //shape.attr({fill: "90-"+this.getPaint()+"-" + Color.get(250, 250, 244)}); - + var contextObject = this.getConextObject(); if (contextObject) { shape.id = contextObject.id; shape.data("contextObject", contextObject); } - + //var activity = this.getConextObject(); //console.log("activity: " + activity.getId(), activity); //Object.clone(activity); - + /* c.mouseover(function(){ this.attr({"stroke-width": NORMAL_STROKE + 2}); @@ -1259,28 +1302,28 @@ ProcessDiagramCanvas.prototype = { this.attr({"stroke-width": NORMAL_STROKE}); }); */ - + this.setPaint(originalPaint); // white shaddow this.drawShaddow(shape); - - + + if (thickBorder) { shape.attr({"stroke-width": THICK_TASK_BORDER_STROKE}); } else { //g.draw(rect); } - + // text if (name) { var fontAttr = TASK_FONT; - + // Include some padding var paddingX = 5; var paddingY = 5; - var availableTextSpace = width - paddingX*2; - + var availableTextSpace = width - paddingX * 2; + // TODO: this.setFont // var originalFont = this.getFont(); // this.setFont(TASK_FONT) @@ -1288,117 +1331,117 @@ ProcessDiagramCanvas.prototype = { var truncated = this.fitTextToWidth(name, availableTextSpace); var realWidth = this.getStringWidth(truncated, fontAttr); var realHeight = this.getStringHeight(truncated, fontAttr); - + //var t = this.g.text(x + width/2 + realWidth*0/2 + paddingX*0, y + height/2, truncated).attr(fontAttr); */ //console.log("draw task name: " + name); var boxWidth = width - (2 * TEXT_PADDING); var boxHeight = height - ICON_SIZE - ICON_PADDING - ICON_PADDING - MARKER_WIDTH - 2 - 2; - var boxX = x + width/2 - boxWidth/2; - var boxY = y + height/2 - boxHeight/2 + ICON_PADDING + ICON_PADDING - 2 - 2; + var boxX = x + width / 2 - boxWidth / 2; + var boxY = y + height / 2 - boxHeight / 2 + ICON_PADDING + ICON_PADDING - 2 - 2; /* var boxWidth = width - (2 * ANNOTATION_TEXT_PADDING); var boxHeight = height - (2 * ANNOTATION_TEXT_PADDING); var boxX = x + width/2 - boxWidth/2; var boxY = y + height/2 - boxHeight/2; */ - + this.drawTaskLabel(name, boxX, boxY, boxWidth, boxHeight); } }, - - drawTaskLabel: function(text, x, y, boxWidth, boxHeight){ + + drawTaskLabel: function (text, x, y, boxWidth, boxHeight) { var originalFont = this.getFont(); this.setFont(TASK_FONT); - + this._drawMultilineText(text, x, y, boxWidth, boxHeight, MULTILINE_VERTICAL_ALIGN_MIDDLE, MULTILINE_HORIZONTAL_ALIGN_MIDDLE); - + this.setFont(originalFont); }, - - drawAnnotationText: function(text, x, y, width, height){ + + drawAnnotationText: function (text, x, y, width, height) { //this._drawMultilineText(text, x, y, width, height, "start"); - + var originalPaint = this.getPaint(); var originalFont = this.getFont(); - + this.setPaint(Color.black); this.setFont(TASK_FONT); - + this._drawMultilineText(text, x, y, width, height, MULTILINE_VERTICAL_ALIGN_TOP, MULTILINE_HORIZONTAL_ALIGN_LEFT); - + this.setPaint(originalPaint); this.setFont(originalFont); }, - - drawLabel: function(text, x, y, width, height){ + + drawLabel: function (text, x, y, width, height) { //this._drawMultilineText(text, x, y, width, height, "start"); - + var originalPaint = this.getPaint(); var originalFont = this.getFont(); - + this.setPaint(LABEL_COLOR); //this.setFont(LABEL_FONT); this.setFont(LABEL_FONT_SMOOTH); - + // predefined box width for labels // TODO: use label width as is, but not height (for stretching) if (!width || !height) { - width = 100; - height = 0; + width = 100; + height = 0; } - + // TODO: remove it. It is debug - x = x - width/2; - + x = x - width / 2; + this._drawMultilineText(text, x, y, width, height, MULTILINE_VERTICAL_ALIGN_TOP, MULTILINE_HORIZONTAL_ALIGN_MIDDLE); - + this.setPaint(originalPaint); this.setFont(originalFont); }, - + /* drawMultilineLabel: function(text, x, y){ var originalFont = this.getFont(); this.setFont(LABEL_FONT_SMOOTH); - + var boxWidth = 80; x = x - boxWidth/2 - + this._drawMultilineText(text, x, y, boxWidth, null, "middle"); this.setFont(originalFont); }, */ - - getStringWidth: function(text, fontAttrs){ + + getStringWidth: function (text, fontAttrs) { var textElement = this.g.text(0, 0, text).attr(fontAttrs).hide(); var bb = textElement.getBBox(); - + //console.log("string width: ", t.getBBox().width); return textElement.getBBox().width; }, - getStringHeight: function(text, fontAttrs){ + getStringHeight: function (text, fontAttrs) { var textElement = this.g.text(0, 0, text).attr(fontAttrs).hide(); var bb = textElement.getBBox(); - + //console.log("string height: ", t.getBBox().height); return textElement.getBBox().height; }, - fitTextToWidth: function(original, width) { + fitTextToWidth: function (original, width) { var text = original; // TODO: move attr on parameters var attr = {font: "11px Arial", opacity: 0}; - + // remove length for "..." var dots = this.g.text(0, 0, "...").attr(attr).hide(); var dotsBB = dots.getBBox(); - + var maxWidth = width - dotsBB.width; - + var textElement = this.g.text(0, 0, text).attr(attr).hide(); var bb = textElement.getBBox(); - + // it's a little bit incorrect with "..." while (bb.width > maxWidth && text.length > 0) { text = text.substring(0, text.length - 1); @@ -1408,258 +1451,258 @@ ProcessDiagramCanvas.prototype = { // remove element from paper textElement.remove(); - + if (text != original) { text = text + "..."; } return text; }, - wrapTextToWidth: function(original, width){ - + wrapTextToWidth: function (original, width) { + //return original; - + var text = original; var wrappedText = "\n"; - + // TODO: move attr on parameters var attr = {font: "11px Arial", opacity: 0}; - + var textElement = this.g.text(0, 0, wrappedText).attr(attr).hide(); var bb = textElement.getBBox(); - + var resultText = ""; var i = 0, j = 0; while (text.length > 0) { - while (bb.width < width && text.length>0) { + while (bb.width < width && text.length > 0) { // remove "\n" - wrappedText = wrappedText.substring(0,wrappedText.length-1); + wrappedText = wrappedText.substring(0, wrappedText.length - 1); // add new char, add "\n" - wrappedText = wrappedText + text.substring(0,1) + "\n"; + wrappedText = wrappedText + text.substring(0, 1) + "\n"; text = text.substring(1); - + textElement.attr({"text": wrappedText}); bb = textElement.getBBox(); i++; - if (i>200) break; + if (i > 200) break; } // remove "\n" wrappedText = wrappedText.substring(0, wrappedText.length - 1); - + if (text.length == 0) { resultText += wrappedText; break; } - + // return last char to text - text = wrappedText.substring(wrappedText.length-1) + text; + text = wrappedText.substring(wrappedText.length - 1) + text; // remove last char from wrappedText - wrappedText = wrappedText.substring(0, wrappedText.length-1) + "\n"; - + wrappedText = wrappedText.substring(0, wrappedText.length - 1) + "\n"; + textElement.attr({"text": wrappedText}); bb = textElement.getBBox(); - + //console.log(">> ", wrappedText, ", ", text); resultText += wrappedText; wrappedText = "\n"; - + j++; - if (j>20) break; + if (j > 20) break; } // remove element from paper textElement.remove(); - + return resultText; }, - - wrapTextToWidth2: function(original, width){ + + wrapTextToWidth2: function (original, width) { var text = original; var wrappedText = "\n"; - + // TODO: move attr on parameters var attr = {font: "11px Arial", opacity: 0}; - + var textElement = this.g.text(0, 0, wrappedText).attr(attr).hide(); var bb = textElement.getBBox(); - + var resultText = ""; var i = 0, j = 0; while (text.length > 0) { - while (bb.width < width && text.length>0) { + while (bb.width < width && text.length > 0) { // remove "\n" - wrappedText = wrappedText.substring(0,wrappedText.length-1); + wrappedText = wrappedText.substring(0, wrappedText.length - 1); // add new char, add "\n" - wrappedText = wrappedText + text.substring(0,1) + "\n"; + wrappedText = wrappedText + text.substring(0, 1) + "\n"; text = text.substring(1); - + textElement.attr({"text": wrappedText}); bb = textElement.getBBox(); i++; - if (i>200) break; + if (i > 200) break; } // remove "\n" wrappedText = wrappedText.substring(0, wrappedText.length - 1); - + if (text.length == 0) { resultText += wrappedText; break; } - + // return last char to text - text = wrappedText.substring(wrappedText.length-1) + text; + text = wrappedText.substring(wrappedText.length - 1) + text; // remove last char from wrappedText - wrappedText = wrappedText.substring(0, wrappedText.length-1) + "\n"; - + wrappedText = wrappedText.substring(0, wrappedText.length - 1) + "\n"; + textElement.attr({"text": wrappedText}); bb = textElement.getBBox(); - + //console.log(">> ", wrappedText, ", ", text); resultText += wrappedText; wrappedText = "\n"; - + j++; - if (j>20) break; + if (j > 20) break; } // remove element from paper textElement.remove(); - + return resultText; }, - - drawUserTask: function(name, x, y, width, height) { - this.g.setStart(); + + drawUserTask: function (name, x, y, width, height) { + this.g.setStart(); this._drawTask(name, x, y, width, height); var img = this.g.image(USERTASK_IMAGE, x + ICON_PADDING, y + ICON_PADDING, ICON_SIZE, ICON_SIZE); var set = this.g.setFinish(); this.addHandlers(set, x, y, width, height, "task"); }, - - drawScriptTask: function(name, x, y, width, height) { - this.g.setStart(); + + drawScriptTask: function (name, x, y, width, height) { + this.g.setStart(); this._drawTask(name, x, y, width, height); var img = this.g.image(SCRIPTTASK_IMAGE, x + ICON_PADDING, y + ICON_PADDING, ICON_SIZE, ICON_SIZE); var set = this.g.setFinish(); - this.addHandlers(set, x, y, width, height, "task"); + this.addHandlers(set, x, y, width, height, "task"); }, - - drawServiceTask: function(name, x, y, width, height) { - this.g.setStart(); + + drawServiceTask: function (name, x, y, width, height) { + this.g.setStart(); this._drawTask(name, x, y, width, height); var img = this.g.image(SERVICETASK_IMAGE, x + ICON_PADDING, y + ICON_PADDING, ICON_SIZE, ICON_SIZE); var set = this.g.setFinish(); - this.addHandlers(set, x, y, width, height, "task"); + this.addHandlers(set, x, y, width, height, "task"); }, - - drawReceiveTask: function(name, x, y, width, height) { - this.g.setStart(); + + drawReceiveTask: function (name, x, y, width, height) { + this.g.setStart(); this._drawTask(name, x, y, width, height); var img = this.g.image(RECEIVETASK_IMAGE, x + 7, y + 7, ICON_SIZE, ICON_SIZE); var set = this.g.setFinish(); - this.addHandlers(set, x, y, width, height, "task"); + this.addHandlers(set, x, y, width, height, "task"); }, - - drawSendTask: function(name, x, y, width, height) { - this.g.setStart(); + + drawSendTask: function (name, x, y, width, height) { + this.g.setStart(); this._drawTask(name, x, y, width, height); var img = this.g.image(SENDTASK_IMAGE, x + 7, y + 7, ICON_SIZE, ICON_SIZE); var set = this.g.setFinish(); - this.addHandlers(set, x, y, width, height, "task"); + this.addHandlers(set, x, y, width, height, "task"); }, - - drawManualTask: function(name, x, y, width, height) { - this.g.setStart(); + + drawManualTask: function (name, x, y, width, height) { + this.g.setStart(); this._drawTask(name, x, y, width, height); var img = this.g.image(MANUALTASK_IMAGE, x + 7, y + 7, ICON_SIZE, ICON_SIZE); var set = this.g.setFinish(); - this.addHandlers(set, x, y, width, height, "task"); + this.addHandlers(set, x, y, width, height, "task"); }, - - drawBusinessRuleTask: function(name, x, y, width, height) { - this.g.setStart(); + + drawBusinessRuleTask: function (name, x, y, width, height) { + this.g.setStart(); this._drawTask(name, x, y, width, height); var img = this.g.image(BUSINESS_RULE_TASK_IMAGE, x + 7, y + 7, ICON_SIZE, ICON_SIZE); var set = this.g.setFinish(); - this.addHandlers(set, x, y, width, height, "task"); + this.addHandlers(set, x, y, width, height, "task"); }, - - drawExpandedSubProcess: function(name, x, y, width, height, isTriggeredByEvent){ - this.g.setStart(); + + drawExpandedSubProcess: function (name, x, y, width, height, isTriggeredByEvent) { + this.g.setStart(); // anti smoothing - if (this.strokeWidth%2 == 1) + if (this.strokeWidth % 2 == 1) x = Math.round(x) + .5, y = Math.round(y) + .5; - + // shape var rect = this.g.rect(x, y, width, height, EXPANDED_SUBPROCESS_CORNER_ROUND); - + // Use different stroke (dashed) - if(isTriggeredByEvent) { + if (isTriggeredByEvent) { rect.attr(EVENT_SUBPROCESS_ATTRS); } else { rect.attr(EXPANDED_SUBPROCESS_ATTRS); } - + this.setContextToElement(rect); - + var fontAttr = EXPANDED_SUBPROCESS_FONT; - + // Include some padding var paddingX = 10; var paddingY = 5; - var availableTextSpace = width - paddingX*2; - + var availableTextSpace = width - paddingX * 2; + var truncated = this.fitTextToWidth(name, availableTextSpace); var realWidth = this.getStringWidth(truncated, fontAttr); var realHeight = this.getStringHeight(truncated, fontAttr); - - var textElement = this.g.text(x + width/2 - realWidth*0/2 + 0*paddingX, y + realHeight/2 + paddingY, truncated).attr(fontAttr); - + + var textElement = this.g.text(x + width / 2 - realWidth * 0 / 2 + 0 * paddingX, y + realHeight / 2 + paddingY, truncated).attr(fontAttr); + var set = this.g.setFinish(); // TODO: Expanded Sub Process may has specific handlers //this.addHandlers(set, x, y, width, height, "task"); }, - - drawCollapsedSubProcess: function(name, x, y, width, height, isTriggeredByEvent) { - this.g.setStart(); - this._drawCollapsedTask(name, x, y, width, height, false); - var set = this.g.setFinish(); - this.addHandlers(set, x, y, width, height, "task"); + + drawCollapsedSubProcess: function (name, x, y, width, height, isTriggeredByEvent) { + this.g.setStart(); + this._drawCollapsedTask(name, x, y, width, height, false); + var set = this.g.setFinish(); + this.addHandlers(set, x, y, width, height, "task"); }, - - drawCollapsedCallActivity: function(name, x, y, width, height) { - this.g.setStart(); + + drawCollapsedCallActivity: function (name, x, y, width, height) { + this.g.setStart(); this._drawCollapsedTask(name, x, y, width, height, true); var set = this.g.setFinish(); - this.addHandlers(set, x, y, width, height, "task"); + this.addHandlers(set, x, y, width, height, "task"); }, - _drawCollapsedTask: function(name, x, y, width, height, thickBorder) { + _drawCollapsedTask: function (name, x, y, width, height, thickBorder) { // The collapsed marker is now visualized separately this._drawTask(name, x, y, width, height, thickBorder); }, - - drawCollapsedMarker: function(x, y, width, height){ + + drawCollapsedMarker: function (x, y, width, height) { // rectangle var rectangleWidth = MARKER_WIDTH; var rectangleHeight = MARKER_WIDTH; - + // anti smoothing - if (this.strokeWidth%2 == 1) + if (this.strokeWidth % 2 == 1) y += .5; - + var rect = this.g.rect(x + (width - rectangleWidth) / 2, y + height - rectangleHeight - 3, rectangleWidth, rectangleHeight); - + // plus inside rectangle - var cx = rect.attr("x") + rect.attr("width")/2; - var cy = rect.attr("y") + rect.attr("height")/2; - + var cx = rect.attr("x") + rect.attr("width") / 2; + var cy = rect.attr("y") + rect.attr("height") / 2; + var line = this.g.path( - "M" + cx + " " + (cy+2) + "L" + cx + " " + (cy-2) + - "M" + (cx-2) + " " + cy + "L" + (cx+2) + " " + cy + "M" + cx + " " + (cy + 2) + "L" + cx + " " + (cy - 2) + + "M" + (cx - 2) + " " + cy + "L" + (cx + 2) + " " + cy ).attr({"stroke-width": this.strokeWidth}); - + }, - - drawActivityMarkers: function(x, y, width, height, multiInstanceSequential, multiInstanceParallel, collapsed){ + + drawActivityMarkers: function (x, y, width, height, multiInstanceSequential, multiInstanceParallel, collapsed) { if (collapsed) { if (!multiInstanceSequential && !multiInstanceParallel) { this.drawCollapsedMarker(x, y, width, height); @@ -1683,126 +1726,126 @@ ProcessDiagramCanvas.prototype = { } } }, - - drawGateway: function(x, y, width, height) { - - var rhombus = this.g.path( "M" + x + " " + (y + (height / 2)) + - "L" + (x + (width / 2)) + " " + (y + height) + - "L" + (x + width) + " " + (y + (height / 2)) + - "L" + (x + (width / 2)) + " " + y + - "z" - ); - + + drawGateway: function (x, y, width, height) { + + var rhombus = this.g.path("M" + x + " " + (y + (height / 2)) + + "L" + (x + (width / 2)) + " " + (y + height) + + "L" + (x + width) + " " + (y + (height / 2)) + + "L" + (x + (width / 2)) + " " + y + + "z" + ); + // white shaddow this.drawShaddow(rhombus); - + rhombus.attr("stroke-width", this.strokeWidth); rhombus.attr("stroke", Color.SlateGrey); rhombus.attr({fill: Color.white}); - + this.setContextToElement(rhombus); - + return rhombus; }, - - drawParallelGateway: function(x, y, width, height) { - this.g.setStart(); - + + drawParallelGateway: function (x, y, width, height) { + this.g.setStart(); + // rhombus this.drawGateway(x, y, width, height); // plus inside rhombus var originalStroke = this.getStroke(); this.setStroke(GATEWAY_TYPE_STROKE); - + var plus = this.g.path( "M" + (x + 10) + " " + (y + height / 2) + "L" + (x + width - 10) + " " + (y + height / 2) + // horizontal "M" + (x + width / 2) + " " + (y + height - 10) + "L" + (x + width / 2) + " " + (y + 10) // vertical ); plus.attr({"stroke-width": this.getStroke(), "stroke": this.getPaint()}); - + this.setStroke(originalStroke); - + var set = this.g.setFinish(); this.addHandlers(set, x, y, width, height, "gateway"); }, - - drawExclusiveGateway: function(x, y, width, height) { - this.g.setStart(); - + + drawExclusiveGateway: function (x, y, width, height) { + this.g.setStart(); + // rhombus var rhombus = this.drawGateway(x, y, width, height); var quarterWidth = width / 4; var quarterHeight = height / 4; - + // X inside rhombus var originalStroke = this.getStroke(); this.setStroke(GATEWAY_TYPE_STROKE); - + var iks = this.g.path( - "M" + (x + quarterWidth + 3) + " " + (y + quarterHeight + 3) + "L" + (x + 3 * quarterWidth - 3) + " " + (y + 3 * quarterHeight - 3) + + "M" + (x + quarterWidth + 3) + " " + (y + quarterHeight + 3) + "L" + (x + 3 * quarterWidth - 3) + " " + (y + 3 * quarterHeight - 3) + "M" + (x + quarterWidth + 3) + " " + (y + 3 * quarterHeight - 3) + "L" + (x + 3 * quarterWidth - 3) + " " + (y + quarterHeight + 3) ); iks.attr({"stroke-width": this.getStroke(), "stroke": this.getPaint()}); - + this.setStroke(originalStroke); - + var set = this.g.setFinish(); - this.addHandlers(set, x, y, width, height, "gateway"); + this.addHandlers(set, x, y, width, height, "gateway"); }, - - drawInclusiveGateway: function(x, y, width, height){ - this.g.setStart(); - + + drawInclusiveGateway: function (x, y, width, height) { + this.g.setStart(); + // rhombus this.drawGateway(x, y, width, height); - + var diameter = width / 4; - + // circle inside rhombus var originalStroke = this.getStroke(); this.setStroke(GATEWAY_TYPE_STROKE); - var circle = this.g.ellipse(width/2 + x, height/2 + y, diameter, diameter); + var circle = this.g.ellipse(width / 2 + x, height / 2 + y, diameter, diameter); circle.attr({"stroke-width": this.getStroke(), "stroke": this.getPaint()}); - + this.setStroke(originalStroke); - + var set = this.g.setFinish(); - this.addHandlers(set, x, y, width, height, "gateway"); + this.addHandlers(set, x, y, width, height, "gateway"); }, - - drawEventBasedGateway: function(x, y, width, height){ - this.g.setStart(); - + + drawEventBasedGateway: function (x, y, width, height) { + this.g.setStart(); + // rhombus this.drawGateway(x, y, width, height); - + var diameter = width / 2; - // rombus inside rhombus - var originalStroke = this.getStroke(); + // rombus inside rhombus + var originalStroke = this.getStroke(); this.setStroke(GATEWAY_TYPE_STROKE); - - - // draw GeneralPath (polygon) - var n=5; - var angle = 2*Math.PI/n; - var x1Points = []; - var y1Points = []; - - for ( var index = 0; index < n; index++ ) { - var v = index*angle - Math.PI/2; - x1Points[index] = x + parseInt(Math.round(width/2)) + parseInt(Math.round((width/4)*Math.cos(v))); - y1Points[index] = y + parseInt(Math.round(height/2)) + parseInt(Math.round((height/4)*Math.sin(v))); + + + // draw GeneralPath (polygon) + var n = 5; + var angle = 2 * Math.PI / n; + var x1Points = []; + var y1Points = []; + + for (var index = 0; index < n; index++) { + var v = index * angle - Math.PI / 2; + x1Points[index] = x + parseInt(Math.round(width / 2)) + parseInt(Math.round((width / 4) * Math.cos(v))); + y1Points[index] = y + parseInt(Math.round(height / 2)) + parseInt(Math.round((height / 4) * Math.sin(v))); } //g.drawPolygon(x1Points, y1Points, n); - + var path = ""; - for ( var index = 0; index < n; index++ ) { - if (index == 0) + for (var index = 0; index < n; index++) { + if (index == 0) path += "M"; - else + else path += "L"; path += x1Points[index] + "," + y1Points[index]; } @@ -1810,209 +1853,209 @@ ProcessDiagramCanvas.prototype = { var polygone = this.g.path(path); polygone.attr("stroke-width", this.strokeWidth); polygone.attr("stroke", this.getPaint()); - + this.setStroke(originalStroke); - + var set = this.g.setFinish(); - this.addHandlers(set, x, y, width, height, "gateway"); + this.addHandlers(set, x, y, width, height, "gateway"); }, - + /* * drawMultiInstanceMarker * drawHighLight * highLightFlow */ - - drawMultiInstanceMarker: function(sequential, x, y, width, height) { + + drawMultiInstanceMarker: function (sequential, x, y, width, height) { var rectangleWidth = MARKER_WIDTH; var rectangleHeight = MARKER_WIDTH; - + // anti smoothing - if (this.strokeWidth%2 == 1) + if (this.strokeWidth % 2 == 1) x += .5;//, y += .5; - + var lineX = x + (width - rectangleWidth) / 2; var lineY = y + height - rectangleHeight - 3; - + var originalStroke = this.getStroke(); this.setStroke(MULTI_INSTANCE_STROKE); - + if (sequential) { var line = this.g.path( - "M" + lineX + " " + lineY + "L" + (lineX + rectangleWidth) + " " + lineY + - "M" + lineX + " " + (lineY + rectangleHeight / 2) + "L" + (lineX + rectangleWidth) + " " + (lineY + rectangleHeight / 2) + - "M" + lineX + " " + (lineY + rectangleHeight) + "L" + (lineX + rectangleWidth) + " " + (lineY + rectangleHeight) + "M" + lineX + " " + lineY + "L" + (lineX + rectangleWidth) + " " + lineY + + "M" + lineX + " " + (lineY + rectangleHeight / 2) + "L" + (lineX + rectangleWidth) + " " + (lineY + rectangleHeight / 2) + + "M" + lineX + " " + (lineY + rectangleHeight) + "L" + (lineX + rectangleWidth) + " " + (lineY + rectangleHeight) ).attr({"stroke-width": this.strokeWidth}); } else { var line = this.g.path( - "M" + lineX + " " + lineY + "L" + lineX + " " + (lineY + rectangleHeight) + - "M" + (lineX + rectangleWidth / 2) + " " + lineY + "L" + (lineX + rectangleWidth / 2) + " " + (lineY + rectangleHeight) + - "M" + (lineX + rectangleWidth) + " " + lineY + "L" + (lineX + rectangleWidth) + " " + (lineY + rectangleHeight) + "M" + lineX + " " + lineY + "L" + lineX + " " + (lineY + rectangleHeight) + + "M" + (lineX + rectangleWidth / 2) + " " + lineY + "L" + (lineX + rectangleWidth / 2) + " " + (lineY + rectangleHeight) + + "M" + (lineX + rectangleWidth) + " " + lineY + "L" + (lineX + rectangleWidth) + " " + (lineY + rectangleHeight) ).attr({"stroke-width": this.strokeWidth}); } - + this.setStroke(originalStroke); }, - - drawHighLight: function(x, y, width, height){ + + drawHighLight: function (x, y, width, height) { var originalPaint = this.getPaint(); var originalStroke = this.getStroke(); - + this.setPaint(HIGHLIGHT_COLOR); this.setStroke(THICK_TASK_BORDER_STROKE); //var c = this.g.rect(x - width/2 - THICK_TASK_BORDER_STROKE, y - height/2 - THICK_TASK_BORDER_STROKE, width + THICK_TASK_BORDER_STROKE*2, height + THICK_TASK_BORDER_STROKE*2, 5); - var rect = this.g.rect(x - THICK_TASK_BORDER_STROKE, y - THICK_TASK_BORDER_STROKE, width + THICK_TASK_BORDER_STROKE*2, height + THICK_TASK_BORDER_STROKE*2, TASK_CORNER_ROUND); + var rect = this.g.rect(x - THICK_TASK_BORDER_STROKE, y - THICK_TASK_BORDER_STROKE, width + THICK_TASK_BORDER_STROKE * 2, height + THICK_TASK_BORDER_STROKE * 2, TASK_CORNER_ROUND); rect.attr("stroke-width", this.strokeWidth); rect.attr("stroke", this.getPaint()); - + this.setPaint(originalPaint); this.setStroke(originalStroke); }, - - highLightActivity: function(activityId){ + + highLightActivity: function (activityId) { var shape = this.g.getById(activityId); if (!shape) { console.error("Activity " + activityId + " not found"); return; } - + var contextObject = shape.data("contextObject"); if (contextObject) - console.log("--> highLightActivity: ["+contextObject.getProperty("type")+"], activityId: " + contextObject.getId()); + console.log("--> highLightActivity: [" + contextObject.getProperty("type") + "], activityId: " + contextObject.getId()); else console.log("--> highLightActivity: ", shape, shape.data("contextObject")); - + shape.attr("stroke-width", THICK_TASK_BORDER_STROKE); shape.attr("stroke", HIGHLIGHT_COLOR); }, - - highLightFlow: function(flowId){ + + highLightFlow: function (flowId) { var shapeFlow = this.g.getById(flowId); if (!shapeFlow) { console.error("Flow " + flowId + " not found"); return; } - + var contextObject = shapeFlow.data("contextObject"); if (contextObject) - console.log("--> highLightFlow: ["+contextObject.id+"] " + contextObject.flow); + console.log("--> highLightFlow: [" + contextObject.id + "] " + contextObject.flow); //console.log("--> highLightFlow: ", flow.flow, flow.data("set")); - + var st = shapeFlow.data("set"); - + st.attr("stroke-width", SEQUENCEFLOW_HIGHLIGHT_STROKE); st.attr("stroke", HIGHLIGHT_COLOR); var withArrowHead = shapeFlow.data("withArrowHead"); if (withArrowHead) st[1].attr("fill", HIGHLIGHT_COLOR); - - st.forEach(function(el){ + + st.forEach(function (el) { //console.log("---->", el); //el.attr("") }); }, - - _drawClock: function(cx, cy, width, height){ - - var circle = this.g.ellipse(cx, cy, 1, 1).attr({stroke:"none", fill: Color.get(232, 239, 241)}); + + _drawClock: function (cx, cy, width, height) { + + var circle = this.g.ellipse(cx, cy, 1, 1).attr({stroke: "none", fill: Color.get(232, 239, 241)}); //var c = this.g.ellipse(cx, cy, width, height).attr({stroke:"none", fill: Color.red}); //x = cx - width/2; //y = cy - height/2; - + var clock = this.g.path( - /* outer circle */ "M15.5,2.374 C8.251,2.375,2.376,8.251,2.374,15.5 C2.376,22.748,8.251,28.623,15.5,28.627c7.249-0.004,13.124-5.879,13.125-13.127C28.624,8.251,22.749,2.375,15.5,2.374z" + - /* inner circle */ "M15.5,26.623 C8.909,26.615,4.385,22.09,4.375,15.5 C4.385,8.909,8.909,4.384,15.5,4.374c4.59,0.01,11.115,3.535,11.124,11.125C26.615,22.09,22.091,26.615,15.5,26.623z" + - /* 9 */ "M8.625,15.5c-0.001-0.552-0.448-0.999-1.001-1c-0.553,0-1,0.448-1,1c0,0.553,0.449,1,1,1C8.176,16.5,8.624,16.053,8.625,15.5z" + - /* 8 */ "M8.179,18.572c-0.478,0.277-0.642,0.889-0.365,1.367c0.275,0.479,0.889,0.641,1.365,0.365c0.479-0.275,0.643-0.887,0.367-1.367C9.27,18.461,8.658,18.297,8.179,18.572z" + - /* 10 */ "M9.18,10.696c-0.479-0.276-1.09-0.112-1.366,0.366s-0.111,1.09,0.365,1.366c0.479,0.276,1.09,0.113,1.367-0.366C9.821,11.584,9.657,10.973,9.18,10.696z" + - /* 2 */ "M22.822,12.428c0.478-0.275,0.643-0.888,0.366-1.366c-0.275-0.478-0.89-0.642-1.366-0.366c-0.479,0.278-0.642,0.89-0.366,1.367C21.732,12.54,22.344,12.705,22.822,12.428z" + - /* 7 */ "M12.062,21.455c-0.478-0.275-1.089-0.111-1.366,0.367c-0.275,0.479-0.111,1.09,0.366,1.365c0.478,0.277,1.091,0.111,1.365-0.365C12.704,22.344,12.54,21.732,12.062,21.455z" + - /* 11 */ "M12.062,9.545c0.479-0.276,0.642-0.888,0.366-1.366c-0.276-0.478-0.888-0.642-1.366-0.366s-0.642,0.888-0.366,1.366C10.973,9.658,11.584,9.822,12.062,9.545z" + - /* 4 */ "M22.823,18.572c-0.48-0.275-1.092-0.111-1.367,0.365c-0.275,0.479-0.112,1.092,0.367,1.367c0.477,0.275,1.089,0.113,1.365-0.365C23.464,19.461,23.3,18.848,22.823,18.572z" + - /* 2 */ "M19.938,7.813c-0.477-0.276-1.091-0.111-1.365,0.366c-0.275,0.48-0.111,1.091,0.366,1.367s1.089,0.112,1.366-0.366C20.581,8.702,20.418,8.089,19.938,7.813z" + - /* 3 */ "M23.378,14.5c-0.554,0.002-1.001,0.45-1.001,1c0.001,0.552,0.448,1,1.001,1c0.551,0,1-0.447,1-1C24.378,14.949,23.929,14.5,23.378,14.5z" + - /* arrows */ "M15.501,6.624c-0.552,0-1,0.448-1,1l-0.466,7.343l-3.004,1.96c-0.478,0.277-0.642,0.889-0.365,1.365c0.275,0.479,0.889,0.643,1.365,0.367l3.305-1.676C15.39,16.99,15.444,17,15.501,17c0.828,0,1.5-0.671,1.5-1.5l-0.5-7.876C16.501,7.072,16.053,6.624,15.501,6.624z" + - /* 9 */ "M15.501,22.377c-0.552,0-1,0.447-1,1s0.448,1,1,1s1-0.447,1-1S16.053,22.377,15.501,22.377z" + - /* 8 */ "M18.939,21.455c-0.479,0.277-0.643,0.889-0.366,1.367c0.275,0.477,0.888,0.643,1.366,0.365c0.478-0.275,0.642-0.889,0.366-1.365C20.028,21.344,19.417,21.18,18.939,21.455z" + - ""); + /* outer circle */ "M15.5,2.374 C8.251,2.375,2.376,8.251,2.374,15.5 C2.376,22.748,8.251,28.623,15.5,28.627c7.249-0.004,13.124-5.879,13.125-13.127C28.624,8.251,22.749,2.375,15.5,2.374z" + + /* inner circle */ "M15.5,26.623 C8.909,26.615,4.385,22.09,4.375,15.5 C4.385,8.909,8.909,4.384,15.5,4.374c4.59,0.01,11.115,3.535,11.124,11.125C26.615,22.09,22.091,26.615,15.5,26.623z" + + /* 9 */ "M8.625,15.5c-0.001-0.552-0.448-0.999-1.001-1c-0.553,0-1,0.448-1,1c0,0.553,0.449,1,1,1C8.176,16.5,8.624,16.053,8.625,15.5z" + + /* 8 */ "M8.179,18.572c-0.478,0.277-0.642,0.889-0.365,1.367c0.275,0.479,0.889,0.641,1.365,0.365c0.479-0.275,0.643-0.887,0.367-1.367C9.27,18.461,8.658,18.297,8.179,18.572z" + + /* 10 */ "M9.18,10.696c-0.479-0.276-1.09-0.112-1.366,0.366s-0.111,1.09,0.365,1.366c0.479,0.276,1.09,0.113,1.367-0.366C9.821,11.584,9.657,10.973,9.18,10.696z" + + /* 2 */ "M22.822,12.428c0.478-0.275,0.643-0.888,0.366-1.366c-0.275-0.478-0.89-0.642-1.366-0.366c-0.479,0.278-0.642,0.89-0.366,1.367C21.732,12.54,22.344,12.705,22.822,12.428z" + + /* 7 */ "M12.062,21.455c-0.478-0.275-1.089-0.111-1.366,0.367c-0.275,0.479-0.111,1.09,0.366,1.365c0.478,0.277,1.091,0.111,1.365-0.365C12.704,22.344,12.54,21.732,12.062,21.455z" + + /* 11 */ "M12.062,9.545c0.479-0.276,0.642-0.888,0.366-1.366c-0.276-0.478-0.888-0.642-1.366-0.366s-0.642,0.888-0.366,1.366C10.973,9.658,11.584,9.822,12.062,9.545z" + + /* 4 */ "M22.823,18.572c-0.48-0.275-1.092-0.111-1.367,0.365c-0.275,0.479-0.112,1.092,0.367,1.367c0.477,0.275,1.089,0.113,1.365-0.365C23.464,19.461,23.3,18.848,22.823,18.572z" + + /* 2 */ "M19.938,7.813c-0.477-0.276-1.091-0.111-1.365,0.366c-0.275,0.48-0.111,1.091,0.366,1.367s1.089,0.112,1.366-0.366C20.581,8.702,20.418,8.089,19.938,7.813z" + + /* 3 */ "M23.378,14.5c-0.554,0.002-1.001,0.45-1.001,1c0.001,0.552,0.448,1,1.001,1c0.551,0,1-0.447,1-1C24.378,14.949,23.929,14.5,23.378,14.5z" + + /* arrows */ "M15.501,6.624c-0.552,0-1,0.448-1,1l-0.466,7.343l-3.004,1.96c-0.478,0.277-0.642,0.889-0.365,1.365c0.275,0.479,0.889,0.643,1.365,0.367l3.305-1.676C15.39,16.99,15.444,17,15.501,17c0.828,0,1.5-0.671,1.5-1.5l-0.5-7.876C16.501,7.072,16.053,6.624,15.501,6.624z" + + /* 9 */ "M15.501,22.377c-0.552,0-1,0.447-1,1s0.448,1,1,1s1-0.447,1-1S16.053,22.377,15.501,22.377z" + + /* 8 */ "M18.939,21.455c-0.479,0.277-0.643,0.889-0.366,1.367c0.275,0.477,0.888,0.643,1.366,0.365c0.478-0.275,0.642-0.889,0.366-1.365C20.028,21.344,19.417,21.18,18.939,21.455z" + + ""); clock.attr({fill: Color.black, stroke: "none"}); //clock.transform("t " + (cx-29.75/2) + " " + (cy-29.75/2)); //clock.transform("...s 0.85"); - + //clock.transform("...s " + .85 + " " + .85); - clock.transform("t " + (-2.374) + " " + (-2.374) ); - clock.transform("...t -" + (15.5-2.374) + " -" + (15.5-2.374) ); - clock.transform("...s " + 1*(width/35) + " " + 1*(height/35)); + clock.transform("t " + (-2.374) + " " + (-2.374)); + clock.transform("...t -" + (15.5 - 2.374) + " -" + (15.5 - 2.374)); + clock.transform("...s " + 1 * (width / 35) + " " + 1 * (height / 35)); clock.transform("...T " + cx + " " + cy); //clock.transform("t " + (cx-width/2) + " " + (cy-height/2)); - + //console.log(".getBBox(): ", clock.getBBox()); //console.log(".attr(): ", c.attrs); - circle.attr("rx", clock.getBBox().width/2); - circle.attr("ry", clock.getBBox().height/2); - + circle.attr("rx", clock.getBBox().width / 2); + circle.attr("ry", clock.getBBox().height / 2); + //return circle }, - - _drawPentagon: function(cx, cy, width, height, filled){ + + _drawPentagon: function (cx, cy, width, height, filled) { // draw GeneralPath (polygon) - var n=5; - var angle = 2*Math.PI/n; - var waypoints = []; - - for ( var index = 0; index < n; index++ ) { - var v = index*angle - Math.PI/2; + var n = 5; + var angle = 2 * Math.PI / n; + var waypoints = []; + + for (var index = 0; index < n; index++) { + var v = index * angle - Math.PI / 2; var point = {}; - point.x = -width*1.2/2 + parseInt(Math.round(width*1.2/2)) + parseInt(Math.round((width*1.2/4)*Math.cos(v))); - point.y = -height*1.2/2 + parseInt(Math.round(height*1.2/2)) + parseInt(Math.round((height*1.2/4)*Math.sin(v))); + point.x = -width * 1.2 / 2 + parseInt(Math.round(width * 1.2 / 2)) + parseInt(Math.round((width * 1.2 / 4) * Math.cos(v))); + point.y = -height * 1.2 / 2 + parseInt(Math.round(height * 1.2 / 2)) + parseInt(Math.round((height * 1.2 / 4) * Math.sin(v))); waypoints[index] = point; } - + var polygone = new Polygone(waypoints, this.getStroke()); polygone.element = this.g.path(polygone.path); if (filled) polygone.element.attr("fill", Color.black); else polygone.element.attr("fill", Color.white); - - polygone.element.transform("s " + 1*(width/35) + " " + 1*(height/35)); + + polygone.element.transform("s " + 1 * (width / 35) + " " + 1 * (height / 35)); polygone.element.transform("...T " + cx + " " + cy); }, - + //_drawMultilineText: function(text, x, y, boxWidth, boxHeight, textAnchor) { - _drawMultilineText: function(text, x, y, boxWidth, boxHeight, verticalAlign, horizontalAlign) { - if (!text || text == "") + _drawMultilineText: function (text, x, y, boxWidth, boxHeight, verticalAlign, horizontalAlign) { + if (!text || text == "") return; - + // Autostretch boxHeight if boxHeight is 0 if (boxHeight == 0) - verticalAlign = MULTILINE_VERTICAL_ALIGN_TOP; - + verticalAlign = MULTILINE_VERTICAL_ALIGN_TOP; + //var TEXT_PADDING = 3; var width = boxWidth; if (boxHeight) var height = boxHeight; - + var layouts = []; - + //var font = {font: "11px Arial", opacity: 1, "fill": LABEL_COLOR}; var font = this.getFont(); var measurer = new LineBreakMeasurer(this.g, x, y, text, font); var lineHeight = measurer.rafaelTextObject.getBBox().height; //console.log("text: ", text.replace(/\n/g, "?")); - + if (height) { - var availableLinesCount = parseInt(height/lineHeight); + var availableLinesCount = parseInt(height / lineHeight); //console.log("availableLinesCount: " + availableLinesCount); } - + var i = 1; while (measurer.getPosition() < measurer.text.getEndIndex()) { var layout = measurer.nextLayout(width); //console.log("LAYOUT: " + layout + ", getPosition: " + measurer.getPosition()); - + if (layout != null) { // TODO: and check if measurer has next layout. If no then don't draw dots if (!availableLinesCount || i < availableLinesCount) { @@ -2023,150 +2066,159 @@ ProcessDiagramCanvas.prototype = { } } i++; - }; + } + ; //console.log(layouts); - + measurer.rafaelTextObject.attr({"text": layouts.join("\n")}); - + if (horizontalAlign) measurer.rafaelTextObject.attr({"text-anchor": horizontalAlign}); // end, middle, start - + var bb = measurer.rafaelTextObject.getBBox(); // TODO: there is somethin wrong with wertical align. May be: measurer.rafaelTextObject.attr({"y": y + height/2 - bb.height/2}) - measurer.rafaelTextObject.attr({"y": y + bb.height/2}); + measurer.rafaelTextObject.attr({"y": y + bb.height / 2}); //var bb = measurer.rafaelTextObject.getBBox(); - - if (measurer.rafaelTextObject.attr("text-anchor") == MULTILINE_HORIZONTAL_ALIGN_MIDDLE ) - measurer.rafaelTextObject.attr("x", x + boxWidth/2); - else if (measurer.rafaelTextObject.attr("text-anchor") == MULTILINE_HORIZONTAL_ALIGN_RIGHT ) - measurer.rafaelTextObject.attr("x", x + boxWidth); - + + if (measurer.rafaelTextObject.attr("text-anchor") == MULTILINE_HORIZONTAL_ALIGN_MIDDLE) + measurer.rafaelTextObject.attr("x", x + boxWidth / 2); + else if (measurer.rafaelTextObject.attr("text-anchor") == MULTILINE_HORIZONTAL_ALIGN_RIGHT) + measurer.rafaelTextObject.attr("x", x + boxWidth); + var boxStyle = {stroke: Color.LightSteelBlue2, "stroke-width": 1.0, "stroke-dasharray": "- "}; //var box = this.g.rect(x+.5, y + .5, width, height).attr(boxStyle); - var textAreaCX = x + boxWidth/2; - var height = boxHeight; - if (!height) height = bb.height; - var textAreaCY = y + height/2; - var dotLeftTop = this.g.ellipse(x, y, 3, 3).attr({"stroke-width": 0, fill: Color.LightSteelBlue, stroke: "none"}).hide(); - var dotCenter = this.g.ellipse(textAreaCX, textAreaCY, 3, 3).attr({fill: Color.LightSteelBlue2, stroke: "none"}).hide(); - - /* - // real bbox - var bb = measurer.rafaelTextObject.getBBox(); - var rect = paper.rect(bb.x+.5, bb.y + .5, bb.width, bb.height).attr({"stroke-width": 1}); - */ - var rect = this.g.rect(x, y, boxWidth, height).attr({"stroke-width": 1}).attr(boxStyle).hide(); - var debugSet = this.g.set(); - debugSet.push(dotLeftTop, dotCenter, rect); - //debugSet.show(); - }, - - drawTextAnnotation: function(text, x, y, width, height){ + var textAreaCX = x + boxWidth / 2; + var height = boxHeight; + if (!height) height = bb.height; + var textAreaCY = y + height / 2; + var dotLeftTop = this.g.ellipse(x, y, 3, 3).attr({ + "stroke-width": 0, + fill: Color.LightSteelBlue, + stroke: "none" + }).hide(); + var dotCenter = this.g.ellipse(textAreaCX, textAreaCY, 3, 3).attr({ + fill: Color.LightSteelBlue2, + stroke: "none" + }).hide(); + + /* + // real bbox + var bb = measurer.rafaelTextObject.getBBox(); + var rect = paper.rect(bb.x+.5, bb.y + .5, bb.width, bb.height).attr({"stroke-width": 1}); + */ + var rect = this.g.rect(x, y, boxWidth, height).attr({"stroke-width": 1}).attr(boxStyle).hide(); + var debugSet = this.g.set(); + debugSet.push(dotLeftTop, dotCenter, rect); + //debugSet.show(); + }, + + drawTextAnnotation: function (text, x, y, width, height) { var lineLength = 18; var path = []; - path.push(["M", x + lineLength, y]); - path.push(["L", x, y]); - path.push(["L", x, y + height]); - path.push(["L", x + lineLength, y + height]); - - path.push(["L", x + lineLength, y + height -1]); - path.push(["L", x + 1, y + height -1]); - path.push(["L", x + 1, y + 1]); - path.push(["L", x + lineLength, y + 1]); - path.push(["z"]); - + path.push(["M", x + lineLength, y]); + path.push(["L", x, y]); + path.push(["L", x, y + height]); + path.push(["L", x + lineLength, y + height]); + + path.push(["L", x + lineLength, y + height - 1]); + path.push(["L", x + 1, y + height - 1]); + path.push(["L", x + 1, y + 1]); + path.push(["L", x + lineLength, y + 1]); + path.push(["z"]); + var textAreaLines = this.g.path(path); - - var boxWidth = width - (2 * ANNOTATION_TEXT_PADDING); - var boxHeight = height - (2 * ANNOTATION_TEXT_PADDING); - var boxX = x + width/2 - boxWidth/2; - var boxY = y + height/2 - boxHeight/2; - - // for debug - var rectStyle = {stroke: Color(112, 146, 190), "stroke-width": 1.0, "stroke-dasharray": "- "}; - var r = this.g.rect(boxX, boxY, boxWidth, boxHeight).attr(rectStyle); - // - - this.drawAnnotationText(text, boxX, boxY, boxWidth, boxHeight); - }, - - drawLabel111111111: function(text, x, y, width, height, labelAttrs){ - var debug = false; - + + var boxWidth = width - (2 * ANNOTATION_TEXT_PADDING); + var boxHeight = height - (2 * ANNOTATION_TEXT_PADDING); + var boxX = x + width / 2 - boxWidth / 2; + var boxY = y + height / 2 - boxHeight / 2; + + // for debug + var rectStyle = {stroke: Color(112, 146, 190), "stroke-width": 1.0, "stroke-dasharray": "- "}; + var r = this.g.rect(boxX, boxY, boxWidth, boxHeight).attr(rectStyle); + // + + this.drawAnnotationText(text, boxX, boxY, boxWidth, boxHeight); + }, + + drawLabel111111111: function (text, x, y, width, height, labelAttrs) { + var debug = false; + // text if (text != null && text != undefined && text != "") { var attr = LABEL_FONT; - + //console.log("x", x, "y", y, "width", width, "height", height ); - + wrappedText = text; if (labelAttrs && labelAttrs.wrapWidth) { wrappedText = this.wrapTextToWidth(wrappedText, labelAttrs.wrapWidth); } var realWidth = this.getStringWidth(wrappedText, attr); var realHeight = this.getStringHeight(wrappedText, attr); - - var textAreaCX = x + width/2; - var textAreaCY = y + 3 + height + this.getStringHeight(wrappedText, attr)/2; - + + var textAreaCX = x + width / 2; + var textAreaCY = y + 3 + height + this.getStringHeight(wrappedText, attr) / 2; + var textX = textAreaCX; var textY = textAreaCY; var textAttrs = {}; if (labelAttrs && labelAttrs.align) { switch (labelAttrs.align) { - case "left": - textAttrs["text-anchor"] = "start"; - textX = textX - realWidth/2; - break; - case "center": - textAttrs["text-anchor"] = "middle"; - break; - case "right": - textAttrs["text-anchor"] = "end"; - textX = textX + realWidth/2; - break; + case "left": + textAttrs["text-anchor"] = "start"; + textX = textX - realWidth / 2; + break; + case "center": + textAttrs["text-anchor"] = "middle"; + break; + case "right": + textAttrs["text-anchor"] = "end"; + textX = textX + realWidth / 2; + break; } } if (labelAttrs && labelAttrs.wrapWidth) { if (true) { // Draw frameborder var textAreaStyle = {stroke: Color.LightSteelBlue2, "stroke-width": 1.0, "stroke-dasharray": "- "}; - var textAreaX = textAreaCX - realWidth/2; - var textAreaY = textAreaCY+.5 - realHeight/2; + var textAreaX = textAreaCX - realWidth / 2; + var textAreaY = textAreaCY + .5 - realHeight / 2; var textArea = this.g.rect(textAreaX, textAreaY, realWidth, realHeight).attr(textAreaStyle); - - var textAreaLines = this.g.path("M" + textAreaX + " " + textAreaY + "L" + (textAreaX+realWidth) + " " + (textAreaY+realHeight) + "M" + + (textAreaX+realWidth) + " " + textAreaY + "L" + textAreaX + " " + (textAreaY+realHeight)); + + var textAreaLines = this.g.path("M" + textAreaX + " " + textAreaY + "L" + (textAreaX + realWidth) + " " + (textAreaY + realHeight) + "M" + +(textAreaX + realWidth) + " " + textAreaY + "L" + textAreaX + " " + (textAreaY + realHeight)); textAreaLines.attr(textAreaStyle); - + this.g.ellipse(textAreaCX, textAreaCY, 3, 3).attr({fill: Color.LightSteelBlue2, stroke: "none"}); } } - + var label = this.g.text(textX, textY, wrappedText).attr(attr).attr(textAttrs); //label.id = Raphael.createUUID(); //console.log("label ", label.id, ", ", wrappedText); - + if (this.fontSmoothing) { - label.attr({stroke: LABEL_COLOR, "stroke-width":.4}); + label.attr({stroke: LABEL_COLOR, "stroke-width": .4}); } - + // debug if (debug) { var imageAreaStyle = {stroke: Color.grey61, "stroke-width": 1.0, "stroke-dasharray": "- "}; - var imageArea = this.g.rect(x+.5, y+.5, width, height).attr(imageAreaStyle); - var imageAreaLines = this.g.path("M" + x + " " + y + "L" + (x+width) + " " + (y+height) + "M" + + (x+width) + " " + y + "L" + x + " " + (y+height)); + var imageArea = this.g.rect(x + .5, y + .5, width, height).attr(imageAreaStyle); + var imageAreaLines = this.g.path("M" + x + " " + y + "L" + (x + width) + " " + (y + height) + "M" + +(x + width) + " " + y + "L" + x + " " + (y + height)); imageAreaLines.attr(imageAreaStyle); var dotStyle = {fill: Color.Coral, stroke: "none"}; this.g.ellipse(x, y, 3, 3).attr(dotStyle); - this.g.ellipse(x+width, y, 2, 2).attr(dotStyle); - this.g.ellipse(x+width, y+height, 2, 2).attr(dotStyle); - this.g.ellipse(x, y+height, 2, 2).attr(dotStyle); + this.g.ellipse(x + width, y, 2, 2).attr(dotStyle); + this.g.ellipse(x + width, y + height, 2, 2).attr(dotStyle); + this.g.ellipse(x, y + height, 2, 2).attr(dotStyle); } - + return label; } }, - - vvoid: function(){} + + vvoid: function () { + } }; diff --git a/len-activiti/src/main/resources/static/diagram-viewer/js/ProcessDiagramGenerator.js b/len-activiti/src/main/resources/static/diagram-viewer/js/ProcessDiagramGenerator.js index 9fb3fef..65e915e 100644 --- a/len-activiti/src/main/resources/static/diagram-viewer/js/ProcessDiagramGenerator.js +++ b/len-activiti/src/main/resources/static/diagram-viewer/js/ProcessDiagramGenerator.js @@ -1,514 +1,513 @@ - /** +/** * Class to generate an image based the diagram interchange information in a * BPMN 2.0 process. * * @author (Javascript) Dmitry Farafonov */ - -var ProcessDiagramGenerator = { + +var ProcessDiagramGenerator = { options: {}, - + processDiagramCanvas: [], - - activityDrawInstructions:{}, - + + activityDrawInstructions: {}, + processDiagrams: {}, - + diagramBreadCrumbs: null, - - init: function(){ + + init: function () { // start event - this.activityDrawInstructions["startEvent"] = function(){ + this.activityDrawInstructions["startEvent"] = function () { var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); - + processDiagramCanvas.drawNoneStartEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight()); }; - + // start timer event - this.activityDrawInstructions["startTimerEvent"] = function(){ + this.activityDrawInstructions["startTimerEvent"] = function () { var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); - + var isInterrupting = activityImpl.getProperty("isInterrupting"); processDiagramCanvas.drawTimerStartEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), isInterrupting, activityImpl.getProperty("name")); }; - + // start event - this.activityDrawInstructions["messageStartEvent"] = function(){ + this.activityDrawInstructions["messageStartEvent"] = function () { var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); - + var isInterrupting = activityImpl.getProperty("isInterrupting"); processDiagramCanvas.drawMessageStartEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), isInterrupting, activityImpl.getProperty("name")); }; - + // start signal event - this.activityDrawInstructions["startSignalEvent"] = function(){ + this.activityDrawInstructions["startSignalEvent"] = function () { var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); - + var isInterrupting = activityImpl.getProperty("isInterrupting"); processDiagramCanvas.drawSignalStartEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), isInterrupting, activityImpl.getProperty("name")); }; - + // start multiple event - this.activityDrawInstructions["startMultipleEvent"] = function(){ + this.activityDrawInstructions["startMultipleEvent"] = function () { var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); - + var isInterrupting = activityImpl.getProperty("isInterrupting"); processDiagramCanvas.drawMultipleStartEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), isInterrupting, activityImpl.getProperty("name")); }; - + // signal catch - this.activityDrawInstructions["intermediateSignalCatch"] = function(){ + this.activityDrawInstructions["intermediateSignalCatch"] = function () { var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); - + var isInterrupting = activityImpl.getProperty("isInterrupting"); processDiagramCanvas.drawCatchingSignalEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), isInterrupting, null); - + var label = ProcessDiagramGenerator.getActivitiLabel(activityImpl); if (label) - processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); + processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); }; - + // message catch - this.activityDrawInstructions["intermediateMessageCatch"] = function(){ + this.activityDrawInstructions["intermediateMessageCatch"] = function () { var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); - + var isInterrupting = activityImpl.getProperty("isInterrupting"); processDiagramCanvas.drawCatchingMessageEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), isInterrupting, null); - + var label = ProcessDiagramGenerator.getActivitiLabel(activityImpl); - if (label) - processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); + if (label) + processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); }; - + // multiple catch - this.activityDrawInstructions["intermediateMultipleCatch"] = function(){ + this.activityDrawInstructions["intermediateMultipleCatch"] = function () { var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); - + var isInterrupting = activityImpl.getProperty("isInterrupting"); processDiagramCanvas.drawCatchingMultipleEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), isInterrupting, null); - + var label = ProcessDiagramGenerator.getActivitiLabel(activityImpl); - if (label) - processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); + if (label) + processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); }; - - - + + // signal throw - this.activityDrawInstructions["intermediateSignalThrow"] = function(){ + this.activityDrawInstructions["intermediateSignalThrow"] = function () { var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); - + processDiagramCanvas.drawThrowingSignalEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), activityImpl.getProperty("name")); - + var label = ProcessDiagramGenerator.getActivitiLabel(activityImpl); - if (label) - processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); + if (label) + processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); }; - + // message throw - this.activityDrawInstructions["intermediateMessageThrow"] = function(){ + this.activityDrawInstructions["intermediateMessageThrow"] = function () { var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); - + processDiagramCanvas.drawThrowingMessageEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), activityImpl.getProperty("name")); - + var label = ProcessDiagramGenerator.getActivitiLabel(activityImpl); - if (label) - processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); + if (label) + processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); }; - + // multiple throw - this.activityDrawInstructions["intermediateMultipleThrow"] = function(){ + this.activityDrawInstructions["intermediateMultipleThrow"] = function () { var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); - + processDiagramCanvas.drawThrowingMultipleEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), activityImpl.getProperty("name")); - + var label = ProcessDiagramGenerator.getActivitiLabel(activityImpl); - if (label) - processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); + if (label) + processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); }; - + // none throw - this.activityDrawInstructions["intermediateThrowEvent"] = function() { + this.activityDrawInstructions["intermediateThrowEvent"] = function () { var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); - + processDiagramCanvas.drawThrowingNoneEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), activityImpl.getProperty("name")); - + var label = ProcessDiagramGenerator.getActivitiLabel(activityImpl); - if (label) - processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); + if (label) + processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); }; - + // end event - this.activityDrawInstructions["endEvent"] = function(){ + this.activityDrawInstructions["endEvent"] = function () { var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); - + processDiagramCanvas.drawNoneEndEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight()); }; - + // error end event - this.activityDrawInstructions["errorEndEvent"] = function(){ + this.activityDrawInstructions["errorEndEvent"] = function () { var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); - + processDiagramCanvas.drawErrorEndEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), null); - + var label = ProcessDiagramGenerator.getActivitiLabel(activityImpl); - if (label) - processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); + if (label) + processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); }; - + // message end event - this.activityDrawInstructions["messageEndEvent"] = function(){ + this.activityDrawInstructions["messageEndEvent"] = function () { var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); - + processDiagramCanvas.drawMessageEndEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), null); - + var label = ProcessDiagramGenerator.getActivitiLabel(activityImpl); - if (label) - processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); + if (label) + processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); }; - + // signal end event - this.activityDrawInstructions["signalEndEvent"] = function(){ + this.activityDrawInstructions["signalEndEvent"] = function () { var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); - + processDiagramCanvas.drawSignalEndEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), null); - + var label = ProcessDiagramGenerator.getActivitiLabel(activityImpl); - if (label) - processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); + if (label) + processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); }; - + // multiple end event - this.activityDrawInstructions["multipleEndEvent"] = function(){ + this.activityDrawInstructions["multipleEndEvent"] = function () { var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); - + processDiagramCanvas.drawMultipleEndEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), null); - + var label = ProcessDiagramGenerator.getActivitiLabel(activityImpl); - if (label) - processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); + if (label) + processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); }; - + // terminate end event - this.activityDrawInstructions["terminateEndEvent"] = function(){ + this.activityDrawInstructions["terminateEndEvent"] = function () { var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); - + processDiagramCanvas.drawTerminateEndEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight()); - + var label = ProcessDiagramGenerator.getActivitiLabel(activityImpl); - if (label) - processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); + if (label) + processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); }; - + // error start event - this.activityDrawInstructions["errorStartEvent"] = function(){ + this.activityDrawInstructions["errorStartEvent"] = function () { var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); - + processDiagramCanvas.drawErrorStartEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), activityImpl.getProperty("name")); - + var label = ProcessDiagramGenerator.getActivitiLabel(activityImpl); - if (label) - processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); + if (label) + processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); }; - + // task - this.activityDrawInstructions["task"] = function(){ + this.activityDrawInstructions["task"] = function () { var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); - - // TODO: + + // TODO: //console.error("task is not implemented yet"); /* var activityImpl = this; processDiagramCanvas.drawTask(activityImpl.getProperty("name"), activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), thickBorder); */ }; - - + + // user task - this.activityDrawInstructions["userTask"] = function(){ + this.activityDrawInstructions["userTask"] = function () { var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); - + processDiagramCanvas.drawUserTask(activityImpl.getProperty("name"), activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight()); }; - + // script task - this.activityDrawInstructions["scriptTask"] = function(){ + this.activityDrawInstructions["scriptTask"] = function () { var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); - + processDiagramCanvas.drawScriptTask(activityImpl.getProperty("name"), activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight()); }; - + // service task - this.activityDrawInstructions["serviceTask"] = function(){ + this.activityDrawInstructions["serviceTask"] = function () { var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); - + processDiagramCanvas.drawServiceTask(activityImpl.getProperty("name"), activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight()); }; // receive task - this.activityDrawInstructions["receiveTask"] = function(){ + this.activityDrawInstructions["receiveTask"] = function () { var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); - + processDiagramCanvas.drawReceiveTask(activityImpl.getProperty("name"), activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight()); }; - + // send task - this.activityDrawInstructions["sendTask"] = function(){ + this.activityDrawInstructions["sendTask"] = function () { var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); - + processDiagramCanvas.drawSendTask(activityImpl.getProperty("name"), activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight()); }; // manual task - this.activityDrawInstructions["manualTask"] = function(){ + this.activityDrawInstructions["manualTask"] = function () { var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); - + processDiagramCanvas.drawManualTask(activityImpl.getProperty("name"), activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight()); }; // businessRuleTask task - this.activityDrawInstructions["businessRuleTask"] = function(){ + this.activityDrawInstructions["businessRuleTask"] = function () { var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); - + processDiagramCanvas.drawBusinessRuleTask(activityImpl.getProperty("name"), activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight()); }; // exclusive gateway - this.activityDrawInstructions["exclusiveGateway"] = function(){ + this.activityDrawInstructions["exclusiveGateway"] = function () { var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); - + processDiagramCanvas.drawExclusiveGateway(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight()); }; - + // inclusive gateway - this.activityDrawInstructions["inclusiveGateway"] = function(){ + this.activityDrawInstructions["inclusiveGateway"] = function () { var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); - + processDiagramCanvas.drawInclusiveGateway(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight()); }; - + // parallel gateway - this.activityDrawInstructions["parallelGateway"] = function(){ + this.activityDrawInstructions["parallelGateway"] = function () { var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); - + processDiagramCanvas.drawParallelGateway(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight()); }; - + // eventBasedGateway - this.activityDrawInstructions["eventBasedGateway"] = function(){ + this.activityDrawInstructions["eventBasedGateway"] = function () { var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); - + processDiagramCanvas.drawEventBasedGateway(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight()); }; - + // Boundary timer - this.activityDrawInstructions["boundaryTimer"] = function(){ + this.activityDrawInstructions["boundaryTimer"] = function () { var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); - + var isInterrupting = activityImpl.getProperty("isInterrupting"); processDiagramCanvas.drawCatchingTimerEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), isInterrupting, null); - + var label = ProcessDiagramGenerator.getActivitiLabel(activityImpl); - if (label) - processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); + if (label) + processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); }; - + // Boundary catch error - this.activityDrawInstructions["boundaryError"] = function(){ + this.activityDrawInstructions["boundaryError"] = function () { var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); - + var isInterrupting = activityImpl.getProperty("isInterrupting"); processDiagramCanvas.drawCatchingErrorEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), isInterrupting, null); - + var label = ProcessDiagramGenerator.getActivitiLabel(activityImpl); - if (label) - processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); + if (label) + processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); }; - + // Boundary signal event - this.activityDrawInstructions["boundarySignal"] = function(){ + this.activityDrawInstructions["boundarySignal"] = function () { var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); - + var isInterrupting = activityImpl.getProperty("isInterrupting"); processDiagramCanvas.drawCatchingSignalEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), isInterrupting, null); - + var label = ProcessDiagramGenerator.getActivitiLabel(activityImpl); - if (label) - processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); + if (label) + processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); }; - // Boundary message event - this.activityDrawInstructions["boundaryMessage"] = function(){ - var activityImpl = this.activity; - var processDiagramCanvas = this.processDiagramCanvas; - processDiagramCanvas.setConextObject(activityImpl); + // Boundary message event + this.activityDrawInstructions["boundaryMessage"] = function () { + var activityImpl = this.activity; + var processDiagramCanvas = this.processDiagramCanvas; + processDiagramCanvas.setConextObject(activityImpl); + + var isInterrupting = activityImpl.getProperty("isInterrupting"); + processDiagramCanvas.drawCatchingMessageEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), isInterrupting, null); - var isInterrupting = activityImpl.getProperty("isInterrupting"); - processDiagramCanvas.drawCatchingMessageEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), isInterrupting, null); + var label = ProcessDiagramGenerator.getActivitiLabel(activityImpl); + if (label) + processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); + }; - var label = ProcessDiagramGenerator.getActivitiLabel(activityImpl); - if (label) - processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); - }; - // timer catch event - this.activityDrawInstructions["intermediateTimer"] = function(){ + this.activityDrawInstructions["intermediateTimer"] = function () { var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); - + var isInterrupting = null; processDiagramCanvas.drawCatchingTimerEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), isInterrupting, activityImpl.getProperty("name")); }; - + // subprocess - this.activityDrawInstructions["subProcess"] = function(){ + this.activityDrawInstructions["subProcess"] = function () { var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; - // TODO: - + // TODO: + processDiagramCanvas.setConextObject(activityImpl); - + var isExpanded = activityImpl.getProperty("isExpanded"); var isTriggeredByEvent = activityImpl.getProperty("triggeredByEvent"); - if(isTriggeredByEvent == undefined) { - isTriggeredByEvent = true; + if (isTriggeredByEvent == undefined) { + isTriggeredByEvent = true; } // TODO: check why isTriggeredByEvent = true when undefined isTriggeredByEvent = false; - + if (isExpanded != undefined && isExpanded == false) { - processDiagramCanvas.drawCollapsedSubProcess(activityImpl.getProperty("name"), activityImpl.getX(), activityImpl.getY(), - activityImpl.getWidth(), activityImpl.getHeight(), isTriggeredByEvent); + processDiagramCanvas.drawCollapsedSubProcess(activityImpl.getProperty("name"), activityImpl.getX(), activityImpl.getY(), + activityImpl.getWidth(), activityImpl.getHeight(), isTriggeredByEvent); } else { - processDiagramCanvas.drawExpandedSubProcess(activityImpl.getProperty("name"), activityImpl.getX(), activityImpl.getY(), - activityImpl.getWidth(), activityImpl.getHeight(), isTriggeredByEvent); + processDiagramCanvas.drawExpandedSubProcess(activityImpl.getProperty("name"), activityImpl.getX(), activityImpl.getY(), + activityImpl.getWidth(), activityImpl.getHeight(), isTriggeredByEvent); } - + //console.error("subProcess is not implemented yet"); }; - + // call activity - this.activityDrawInstructions["callActivity"] = function(){ + this.activityDrawInstructions["callActivity"] = function () { var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); processDiagramCanvas.drawCollapsedCallActivity(activityImpl.getProperty("name"), activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight()); }; - - $(document).ready(function(){ - // Protect right click on SVG elements (and on canvas too) - document.body.oncontextmenu = function(event) { - if (window.event.srcElement.tagName == "shape" || window.event.srcElement.tagName == "DIV" && window.event.srcElement.parentElement.className == "diagram") { - - // IE DIAGRAM CANVAS OR SHAPE DETECTED! - return false; - } - return (!Object.isSVGElement(window.event.srcElement)); - }; + + $(document).ready(function () { + // Protect right click on SVG elements (and on canvas too) + document.body.oncontextmenu = function (event) { + if (window.event.srcElement.tagName == "shape" || window.event.srcElement.tagName == "DIV" && window.event.srcElement.parentElement.className == "diagram") { + + // IE DIAGRAM CANVAS OR SHAPE DETECTED! + return false; + } + return (!Object.isSVGElement(window.event.srcElement)); + }; }); }, - - getActivitiLabel:function(activityImpl){ - /* - TODO: Label object should be in activityImpl and looks like: - { - x: 250, - y: 250, - width: 80, - height: 30 - } - And then: - if (!activityImpl.label) - return null; - var label = activityImpl.label; - label.text = activityImpl.name; - return label; - */ - - // But now default label for all events is: - return { - text: activityImpl.getProperty("name"), - x: activityImpl.getX() + .5 + activityImpl.getWidth()/2, - y: activityImpl.getY() + .5 + activityImpl.getHeight() + ICON_PADDING, - width: 100, - height: 0 - }; + + getActivitiLabel: function (activityImpl) { + /* + TODO: Label object should be in activityImpl and looks like: + { + x: 250, + y: 250, + width: 80, + height: 30 + } + And then: + if (!activityImpl.label) + return null; + var label = activityImpl.label; + label.text = activityImpl.name; + return label; + */ + + // But now default label for all events is: + return { + text: activityImpl.getProperty("name"), + x: activityImpl.getX() + .5 + activityImpl.getWidth() / 2, + y: activityImpl.getY() + .5 + activityImpl.getHeight() + ICON_PADDING, + width: 100, + height: 0 + }; }, - - generateDiagram: function(processDefinitionDiagramLayout){ + + generateDiagram: function (processDefinitionDiagramLayout) { // Init canvas var processDefinitionId = processDefinitionDiagramLayout.processDefinition.id; //console.log("Init canvas ", processDefinitionId); - + if (this.getProcessDiagram(processDefinitionId) != undefined) { // TODO: may be reset canvas if exists.. Or just show //console.log("ProcessDiagram '" + processDefinitionId + "' is already generated. Just show it."); @@ -516,148 +515,148 @@ var ProcessDiagramGenerator = { } var processDiagram = this.initProcessDiagramCanvas(processDefinitionDiagramLayout); var processDiagramCanvas = processDiagram.diagramCanvas; - + // Draw pool shape, if process is participant in collaboration - - if(processDefinitionDiagramLayout.participantProcess != undefined) { - //console.log("Draw pool shape"); - var pProc = processDefinitionDiagramLayout.participantProcess; - processDiagramCanvas.drawPoolOrLane(pProc.x, pProc.y, pProc.width, pProc.height, pProc.name); + + if (processDefinitionDiagramLayout.participantProcess != undefined) { + //console.log("Draw pool shape"); + var pProc = processDefinitionDiagramLayout.participantProcess; + processDiagramCanvas.drawPoolOrLane(pProc.x, pProc.y, pProc.width, pProc.height, pProc.name); } - + var laneSets = processDefinitionDiagramLayout.laneSets; var activities = processDefinitionDiagramLayout.activities; var sequenceFlows = processDefinitionDiagramLayout.sequenceFlows; - - + + pb1.set('value', 0); var cnt = 0; - if (laneSets) - for(var i in laneSets) { + if (laneSets) + for (var i in laneSets) { cnt += laneSets[i].lanes.length; } - if (activities) + if (activities) cnt += activities.length; - if (sequenceFlows) + if (sequenceFlows) cnt += sequenceFlows.length; - var step = (cnt>0)? 100/cnt : 0; + var step = (cnt > 0) ? 100 / cnt : 0; var progress = 0; //console.log("progress bar step: ", step); - + var task1 = new $.AsyncQueue(); - - // Draw lanes - - task1.add(function (task1) { - if (!laneSets) laneSets = []; - //console.log("> draw lane sets, count:", laneSets.length) - }); - - for(var i in laneSets) { - var laneSet = laneSets[i]; - //laneSet.id, laneSet.name - - task1.add(laneSet.lanes,function (task1, lane) { - progress += step; - pb1.set('value', parseInt(progress)); - - //console.log("--> laneId: " + lane.name + ", name: " + lane.name); - - processDiagramCanvas.drawPoolOrLane(lane.x, lane.y, lane.width, lane.height, lane.name); - }); - } - - // Draw activities - - task1.add(function (task1) { - if (!activities) activities = []; - //console.log("> draw activities, count:", activities.length) - }); - - var activitiesLength = activities.length; - task1.add(activities,function (task1, activityJson) { - var activity = new ActivityImpl(activityJson); - activitiesLength --; - progress += step; - pb1.set('value', parseInt(progress)); - //console.log(activitiesLength, "--> activityId: " + activity.getId() + ", name: " + activity.getProperty("name")); - ProcessDiagramGenerator.drawActivity(processDiagramCanvas, activity); - }); - - // Draw sequence-flows - - task1.add(function (task1) { - if (!sequenceFlows) sequenceFlows = []; - //console.log("> draw sequence flows, count:", sequenceFlows.length) - }); - - var flowsLength = sequenceFlows.length; - task1.add(sequenceFlows,function (task1, flow) { - var waypoints = []; - for(var j in flow.xPointArray) { - waypoints[j] = {x: flow.xPointArray[j], y: flow.yPointArray[j]}; - } - var isDefault = flow.isDefault; - var isConditional = flow.isConditional; - var isHighLighted = flow.isHighLighted; - - // TODO: add source and destination for sequence flows in REST - // parse for test - var f = flow.flow; - var matches = f.match(/\((.*)\)--.*-->\((.*)\)/); - var sourceActivityId, destinationActivityId; - if (matches != null) { - sourceActivityId = matches[1]; - destinationActivityId = matches[2]; - } - flow.sourceActivityId = sourceActivityId; - flow.destinationActivityId = destinationActivityId; - // - flowsLength--; + + // Draw lanes + + task1.add(function (task1) { + if (!laneSets) laneSets = []; + //console.log("> draw lane sets, count:", laneSets.length) + }); + + for (var i in laneSets) { + var laneSet = laneSets[i]; + //laneSet.id, laneSet.name + + task1.add(laneSet.lanes, function (task1, lane) { progress += step; pb1.set('value', parseInt(progress)); - - //console.log(flowsLength, "--> flow: " + flow.flow); - - processDiagramCanvas.setConextObject(flow); - processDiagramCanvas.drawSequenceflow(waypoints, isConditional, isDefault, isHighLighted); - }); - - task1.onComplete(function(){ - if (progress<100) - pb1.set('value', 100); - //console.log("COMPLETE!!!"); - - //console.timeEnd('generateDiagram'); + + //console.log("--> laneId: " + lane.name + ", name: " + lane.name); + + processDiagramCanvas.drawPoolOrLane(lane.x, lane.y, lane.width, lane.height, lane.name); }); - - task1.run(); + } + + // Draw activities + + task1.add(function (task1) { + if (!activities) activities = []; + //console.log("> draw activities, count:", activities.length) + }); + + var activitiesLength = activities.length; + task1.add(activities, function (task1, activityJson) { + var activity = new ActivityImpl(activityJson); + activitiesLength--; + progress += step; + pb1.set('value', parseInt(progress)); + //console.log(activitiesLength, "--> activityId: " + activity.getId() + ", name: " + activity.getProperty("name")); + ProcessDiagramGenerator.drawActivity(processDiagramCanvas, activity); + }); + + // Draw sequence-flows + + task1.add(function (task1) { + if (!sequenceFlows) sequenceFlows = []; + //console.log("> draw sequence flows, count:", sequenceFlows.length) + }); + + var flowsLength = sequenceFlows.length; + task1.add(sequenceFlows, function (task1, flow) { + var waypoints = []; + for (var j in flow.xPointArray) { + waypoints[j] = {x: flow.xPointArray[j], y: flow.yPointArray[j]}; + } + var isDefault = flow.isDefault; + var isConditional = flow.isConditional; + var isHighLighted = flow.isHighLighted; + + // TODO: add source and destination for sequence flows in REST + // parse for test + var f = flow.flow; + var matches = f.match(/\((.*)\)--.*-->\((.*)\)/); + var sourceActivityId, destinationActivityId; + if (matches != null) { + sourceActivityId = matches[1]; + destinationActivityId = matches[2]; + } + flow.sourceActivityId = sourceActivityId; + flow.destinationActivityId = destinationActivityId; + // + flowsLength--; + progress += step; + pb1.set('value', parseInt(progress)); + + //console.log(flowsLength, "--> flow: " + flow.flow); + + processDiagramCanvas.setConextObject(flow); + processDiagramCanvas.drawSequenceflow(waypoints, isConditional, isDefault, isHighLighted); + }); + + task1.onComplete(function () { + if (progress < 100) + pb1.set('value', 100); + //console.log("COMPLETE!!!"); + + //console.timeEnd('generateDiagram'); + }); + + task1.run(); }, - + getProcessDiagram: function (processDefinitionId) { return this.processDiagrams[processDefinitionId]; }, - + initProcessDiagramCanvas: function (processDefinitionDiagramLayout) { var minX = 0; var maxX = 0; var minY = 0; var maxY = 0; - - if(processDefinitionDiagramLayout.participantProcess != undefined) { - var pProc = processDefinitionDiagramLayout.participantProcess; - - minX = pProc.x; - maxX = pProc.x + pProc.width; - minY = pProc.y; - maxY = pProc.y + pProc.height; + + if (processDefinitionDiagramLayout.participantProcess != undefined) { + var pProc = processDefinitionDiagramLayout.participantProcess; + + minX = pProc.x; + maxX = pProc.x + pProc.width; + minY = pProc.y; + maxY = pProc.y + pProc.height; } var activities = processDefinitionDiagramLayout.activities; - for(var i in activities) { + for (var i in activities) { var activityJson = activities[i]; var activity = new ActivityImpl(activityJson); - + // width if (activity.getX() + activity.getWidth() > maxX) { maxX = activity.getX() + activity.getWidth(); @@ -673,14 +672,14 @@ var ProcessDiagramGenerator = { minY = activity.getY(); } } - + var sequenceFlows = processDefinitionDiagramLayout.sequenceFlows; - for(var i in sequenceFlows) { + for (var i in sequenceFlows) { var flow = sequenceFlows[i]; var waypoints = []; - for(var j in flow.xPointArray) { + for (var j in flow.xPointArray) { waypoints[j] = {x: flow.xPointArray[j], y: flow.yPointArray[j]}; - + // width if (waypoints[j].x > maxX) { maxX = waypoints[j].x; @@ -697,34 +696,34 @@ var ProcessDiagramGenerator = { } } } - + var laneSets = processDefinitionDiagramLayout.laneSets; - for(var i in laneSets) { + for (var i in laneSets) { var laneSet = laneSets[i]; //laneSet.id, laneSet.name - - for(var j in laneSet.lanes) { + + for (var j in laneSet.lanes) { var lane = laneSet.lanes[j]; // width if (lane.x + lane.width > maxX) { - maxX = lane.x + lane.width; + maxX = lane.x + lane.width; } if (lane.x < minX) { - minX = lane.x; + minX = lane.x; } // height if (lane.y + lane.height > maxY) { - maxY = lane.y + lane.height; + maxY = lane.y + lane.height; } if (lane.y < minY) { - minY = lane.y; + minY = lane.y; } } } - + var diagramCanvas = new ProcessDiagramCanvas(); if (diagramCanvas) { - + // create div in diagramHolder var diagramHolder = document.getElementById(this.options.diagramHolderId); if (!diagramHolder) @@ -733,7 +732,7 @@ var ProcessDiagramGenerator = { div.id = processDefinitionDiagramLayout.processDefinition.id; div.className = "diagram"; diagramHolder.appendChild(div); - + diagramCanvas.init(maxX + 20, maxY + 20, processDefinitionDiagramLayout.processDefinition.id); this.processDiagrams[processDefinitionDiagramLayout.processDefinition.id] = { processDefinitionDiagramLayout: processDefinitionDiagramLayout, @@ -743,54 +742,54 @@ var ProcessDiagramGenerator = { return this.getProcessDiagram(processDefinitionDiagramLayout.processDefinition.id); //return new DefaultProcessDiagramCanvas(maxX + 10, maxY + 10, minX, minY); }, - - drawActivity: function(processDiagramCanvas, activity, highLightedActivities) { + + drawActivity: function (processDiagramCanvas, activity, highLightedActivities) { var type = activity.getProperty("type"); var drawInstruction = this.activityDrawInstructions[type]; - if (drawInstruction != null) { - drawInstruction.apply({processDiagramCanvas:processDiagramCanvas, activity:activity}); + if (drawInstruction != null) { + drawInstruction.apply({processDiagramCanvas: processDiagramCanvas, activity: activity}); } else { //console.error("no drawInstruction for " + type + ": ", activity); } - + // Actually draw the markers if (activity.getProperty("multiInstance") != undefined || activity.getProperty("collapsed") != undefined) { //console.log(activity.getProperty("name"), activity.properties); var multiInstanceSequential = (activity.getProperty("multiInstance") == "sequential"); var multiInstanceParallel = (activity.getProperty("multiInstance") == "parrallel"); var collapsed = activity.getProperty("collapsed"); - processDiagramCanvas.drawActivityMarkers(activity.getX(), activity.getY(), activity.getWidth(), activity.getHeight(), - multiInstanceSequential, multiInstanceParallel, collapsed); + processDiagramCanvas.drawActivityMarkers(activity.getX(), activity.getY(), activity.getWidth(), activity.getHeight(), + multiInstanceSequential, multiInstanceParallel, collapsed); } /* processDiagramCanvas.drawActivityMarkers(activity.getX(), activity.getY(), activity.getWidth(), activity.getHeight(), multiInstanceSequential, - multiInstanceParallel, collapsed); + multiInstanceParallel, collapsed); */ // TODO: Draw highlighted activities if they are present - + }, - - setHighLights: function(highLights){ + + setHighLights: function (highLights) { if (highLights.processDefinitionId == undefined) { //console.error("Process instance " + highLights.processInstanceId + " doesn't exist"); return; } - + var processDiagram = this.getProcessDiagram(highLights.processDefinitionId); if (processDiagram == undefined) { //console.error("Process diagram " + highLights.processDefinitionId + " not found"); return; } - + var processDiagramCanvas = processDiagram.diagramCanvas; - + // TODO: remove highLightes from all activities before set new highLight for (var i in highLights.activities) { var activityId = highLights.activities[i]; processDiagramCanvas.highLightActivity(activityId); } - + // TODO: remove highLightes from all flows before set new highLight for (var i in highLights.flows) { var flowId = highLights.flows[i]; @@ -800,8 +799,8 @@ var ProcessDiagramGenerator = { processDiagramCanvas.highLightFlow(flowId); } }, - - drawHighLights: function(processInstanceId) { + + drawHighLights: function (processInstanceId) { // Load highLights for the processInstanceId /* var url = Lang.sub(this.options.processInstanceHighLightsUrl, {processInstanceId: processInstanceId}); @@ -817,9 +816,9 @@ var ProcessDiagramGenerator = { console.log("highLights not found"); return; } - + console.log("highLights[" + highLights.processDefinitionId + "][" + processInstanceId + "]: ", highLights); - + ProcessDiagramGenerator.setHighLights(highLights); }).fail(function(jqXHR, textStatus){ console.log('Get HighLights['+processDefinitionId+'] failure: ', textStatus, jqXHR); @@ -827,19 +826,19 @@ var ProcessDiagramGenerator = { */ ActivitiRest.getHighLights(processInstanceId, this._drawHighLights); }, - _drawHighLights: function() { + _drawHighLights: function () { var highLights = this.highLights; ProcessDiagramGenerator.setHighLights(highLights); }, - + // Load processDefinition - - drawDiagram: function(processDefinitionId) { + + drawDiagram: function (processDefinitionId) { // Hide all diagrams var diagrams = $("#" + this.options.diagramHolderId + " div.diagram"); diagrams.addClass("hidden"); - - + + // If processDefinitionId doesn't contain ":" then it's a "processDefinitionKey", not an id. // Get process definition by key if (processDefinitionId.indexOf(":") < 0) { @@ -848,52 +847,52 @@ var ProcessDiagramGenerator = { this._drawDiagram.apply({processDefinitionId: processDefinitionId}); } }, - _drawDiagram: function() { + _drawDiagram: function () { var processDefinitionId = this.processDefinitionId; - + ProcessDiagramGenerator.addBreadCrumbsItem(processDefinitionId); - - + + // Check if processDefinition is already loaded and rendered - - + + var processDiagram = ProcessDiagramGenerator.getProcessDiagram(processDefinitionId); if (processDiagram != undefined && processDiagram != null) { //console.log("Process diagram " + processDefinitionId + " is already loaded"); //return; - + var diagram = document.getElementById(processDefinitionId); $(diagram).removeClass("hidden"); - + // Regenerate image var processDefinitionDiagramLayout = processDiagram.processDefinitionDiagramLayout; ProcessDiagramGenerator.generateDiagram(processDefinitionDiagramLayout); - + return; } //console.time('loadDiagram'); - + // Load processDefinition - + ActivitiRest.getProcessDefinition(processDefinitionId, ProcessDiagramGenerator._generateDiagram); }, - _generateDiagram: function() { + _generateDiagram: function () { var processDefinitionDiagramLayout = this.processDefinitionDiagramLayout; - + //console.log("process-definition-diagram-layout["+processDefinitionDiagramLayout.processDefinition.id+"]: ", processDefinitionDiagramLayout); - + //console.timeEnd('loadDiagram'); //console.time('generateDiagram'); - + pb1.set('value', 0); ProcessDiagramGenerator.generateDiagram(processDefinitionDiagramLayout); }, - - getProcessDefinitionByKey: function(processDefinitionKey) { + + getProcessDefinitionByKey: function (processDefinitionKey) { var url = Lang.sub(this.options.processDefinitionByKeyUrl, {processDefinitionKey: processDefinitionKey}); - + var processDefinition; $.ajax({ url: url, @@ -901,17 +900,17 @@ var ProcessDiagramGenerator = { dataType: 'json', cache: false, async: false - }).done(function(data) { + }).done(function (data) { //console.log("ajax returned data"); //console.log("ajax returned data:", data); processDefinition = data; if (!processDefinition) { //console.error("Process definition '" + processDefinitionKey + "' not found"); } - }).fail(function(jqXHR, textStatus){ + }).fail(function (jqXHR, textStatus) { //console.error('Get diagram layout['+processDefinitionKey+'] failure: ', textStatus, jqXHR); }); - + if (processDefinition) { //console.log("Get process definition by key '" + processDefinitionKey + "': ", processDefinition.id); return processDefinition; @@ -919,31 +918,31 @@ var ProcessDiagramGenerator = { return null; } }, - - addBreadCrumbsItem: function(processDefinitionId){ + + addBreadCrumbsItem: function (processDefinitionId) { var TPL_UL_CONTAINER = '
    ', TPL_LI_CONTAINER = '
  • {name}
  • '; - + if (!this.diagramBreadCrumbs) this.diagramBreadCrumbs = $("#" + this.options.diagramBreadCrumbsId); if (!this.diagramBreadCrumbs) return; - - + + var ul = this.diagramBreadCrumbs.find("ul"); //console.log("ul: ", ul); if (ul.size() == 0) { ul = $(TPL_UL_CONTAINER); this.diagramBreadCrumbs.append(ul); - + } var liListOld = ul.find("li"); //console.warn("liListOld", liListOld); - + // TODO: if there is any items after current then remove that before adding new item (m.b. it is a duplicate) var currentBreadCrumbsItemId = this.currentBreadCrumbsItemId; - found = false; + found = false; liListOld.each( - function(index, item) { + function (index, item) { //console.warn("item:", $(this)); if (!found && currentBreadCrumbsItemId == $(this).attr("id")) { found = true; @@ -955,133 +954,139 @@ var ProcessDiagramGenerator = { } } ); - + var liListNew = ul.find("li"); - + //console.log("liListNew size: ", liListNew.size()); var values = { id: 'breadCrumbsItem_' + liListNew.size(), processDefinitionId: processDefinitionId, name: processDefinitionId }; - - + + var tpl = Lang.sub(TPL_LI_CONTAINER, values); //console.log("tpl: ", tpl); ul.append(tpl); - + var li = ul.find("#" + values.id); //console.warn("li:", li); $('#' + values.id).on('click', this._breadCrumbsItemClick); - + ul.find("li").removeClass("selected"); li.attr("num", liListNew.size()); li.addClass("selected"); this.currentBreadCrumbsItemId = li.attr("id"); }, - _breadCrumbsItemClick: function(){ + _breadCrumbsItemClick: function () { var li = $(this), id = li.attr("id"), processDefinitionId = li.attr("processDefinitionId"); //console.warn("_breadCrumbsItemClick: ", id, ", processDefinitionId: ", processDefinitionId); - + var ul = ProcessDiagramGenerator.diagramBreadCrumbs.one("ul"); ul.find("li").removeClass("selected"); li.addClass("selected"); ProcessDiagramGenerator.currentBreadCrumbsItemId = li.attr("id"); - + // Hide all diagrams - var diagrams = $("#"+ProcessDiagramGenerator.options.diagramHolderId+" div.diagram"); + var diagrams = $("#" + ProcessDiagramGenerator.options.diagramHolderId + " div.diagram"); diagrams.addClass("hidden"); - + var processDiagram = ProcessDiagramGenerator.getProcessDiagram(processDefinitionId); - + var diagram = document.getElementById(processDefinitionId); if (!diagram) return; $(diagram).removeClass("hidden"); - + // Regenerate image var processDefinitionDiagramLayout = processDiagram.processDefinitionDiagramLayout; ProcessDiagramGenerator.generateDiagram(processDefinitionDiagramLayout); }, - - showFlowInfo: function(flow){ + + showFlowInfo: function (flow) { var diagramInfo = $("#" + this.options.diagramInfoId); if (!diagramInfo) return; - + var values = { flow: flow.flow, - isDefault: (flow.isDefault)? "true":"", - isConditional: (flow.isConditional)? "true":"", - isHighLighted: (flow.isHighLighted)? "true":"", + isDefault: (flow.isDefault) ? "true" : "", + isConditional: (flow.isConditional) ? "true" : "", + isHighLighted: (flow.isHighLighted) ? "true" : "", sourceActivityId: flow.sourceActivityId, destinationActivityId: flow.destinationActivityId }; - var TPL_FLOW_INFO = '
    {flow}
    ' - + '
    sourceActivityId: {sourceActivityId}
    ' - + '
    destinationActivityId: {destinationActivityId}
    ' - + '
    isDefault: {isDefault}
    ' - + '
    isConditional: {isConditional}
    ' - + '
    isHighLighted: {isHighLighted}
    '; + var TPL_FLOW_INFO = '
    {flow}
    ' + + '
    sourceActivityId: {sourceActivityId}
    ' + + '
    destinationActivityId: {destinationActivityId}
    ' + + '
    isDefault: {isDefault}
    ' + + '
    isConditional: {isConditional}
    ' + + '
    isHighLighted: {isHighLighted}
    '; var tpl = Lang.sub(TPL_FLOW_INFO, values); //console.log("info: ", tpl); diagramInfo.html(tpl); }, - - showActivityInfo: function(activity){ + + showActivityInfo: function (activity) { var diagramInfo = $("#" + this.options.diagramInfoId); if (!diagramInfo) return; - + var values = { activityId: activity.getId(), name: activity.getProperty("name"), type: activity.getProperty("type") }; - var TPL_ACTIVITY_INFO = '' - + '
    activityId: {activityId}
    ' - + '
    name: {name}
    ' - + '
    type: {type}
    '; + var TPL_ACTIVITY_INFO = '' + + '
    activityId: {activityId}
    ' + + '
    name: {name}
    ' + + '
    type: {type}
    '; var TPL_CALLACTIVITY_INFO = '' - + '
    collapsed: {collapsed}
    ' - + '
    processDefinitonKey: {processDefinitonKey}
    '; - + + '
    collapsed: {collapsed}
    ' + + '
    processDefinitonKey: {processDefinitonKey}
    '; + var template = TPL_ACTIVITY_INFO; if (activity.getProperty("type") == "callActivity") { values.collapsed = activity.getProperty("collapsed"); values.processDefinitonKey = activity.getProperty("processDefinitonKey"); template += TPL_CALLACTIVITY_INFO; } else if (activity.getProperty("type") == "callActivity") { - + } - + var tpl = Lang.sub(template, values); //console.log("info: ", tpl); diagramInfo.html(tpl); }, - - hideInfo: function(){ - var diagramInfo = $("#" + this.options.diagramInfoId); - if (!diagramInfo) return; - diagramInfo.html(""); + + hideInfo: function () { + var diagramInfo = $("#" + this.options.diagramInfoId); + if (!diagramInfo) return; + diagramInfo.html(""); }, - - vvoid: function(){} + + vvoid: function () { + } }; var Lang = { SUBREGEX: /\{\s*([^\|\}]+?)\s*(?:\|([^\}]*))?\s*\}/g, UNDEFINED: 'undefined', - isUndefined: function(o) { + isUndefined: function (o) { return typeof o === Lang.UNDEFINED; }, - sub: function(s, o) { - return ((s.replace) ? s.replace(Lang.SUBREGEX, function(match, key) { + sub: function (s, o) { + return ((s.replace) ? s.replace(Lang.SUBREGEX, function (match, key) { return (!Lang.isUndefined(o[key])) ? o[key] : match; }) : s); } }; if (Lang.isUndefined(console)) { - console = { log: function() {}, warn: function() {}, error: function() {}}; + console = { + log: function () { + }, warn: function () { + }, error: function () { + } + }; } -ProcessDiagramGenerator.init(); \ No newline at end of file +ProcessDiagramGenerator.init(); diff --git a/len-activiti/src/main/resources/static/diagram-viewer/js/jquery/jquery.asyncqueue.js b/len-activiti/src/main/resources/static/diagram-viewer/js/jquery/jquery.asyncqueue.js index 7f9d4d0..86051d4 100644 --- a/len-activiti/src/main/resources/static/diagram-viewer/js/jquery/jquery.asyncqueue.js +++ b/len-activiti/src/main/resources/static/diagram-viewer/js/jquery/jquery.asyncqueue.js @@ -7,119 +7,123 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -(function($){ - $.AsyncQueue = function() { - var that = this, - queue = [], +(function ($) { + $.AsyncQueue = function () { + var that = this, + queue = [], completeFunc, - failureFunc, - paused = false, - lastCallbackData, - _run, + failureFunc, + paused = false, + lastCallbackData, + _run, _complete, inQueue = 0, defaultTimeOut = 10; - _run = function() { - var f = queue.shift(); + _run = function () { + var f = queue.shift(); - if (f) { + if (f) { inQueue++; - setTimeout(function(){ + setTimeout(function () { f.fn.apply(that, [that]); - + if (!f.isParallel) if (paused === false) { _run(); } - inQueue --; + inQueue--; if (inQueue == 0 && queue.length == 0) _complete(); - }, f.timeOut); - + }, f.timeOut); + if (f.isParallel) if (paused === false) { _run(); } - } - }; - - _complete = function(){ + } + }; + + _complete = function () { if (completeFunc) - completeFunc.apply(that, [that]); + completeFunc.apply(that, [that]); }; - this.onComplete = function(func) { - completeFunc = func; - }; - - this.onFailure = function(func) { - failureFunc = func; - }; + this.onComplete = function (func) { + completeFunc = func; + }; - this.add = function(func) { + this.onFailure = function (func) { + failureFunc = func; + }; + + this.add = function (func) { // TODO: add callback for queue[i] complete - + var obj = arguments[0]; if (obj && Object.prototype.toString.call(obj) === "[object Array]") { var fn = arguments[1]; - var timeOut = (typeof(arguments[2]) != "undefined")? arguments[2] : defaultTimeOut; - if (typeof(fn) == "function") { - for(var i = 0; i < obj.length; i++) { - var f = function(objx){ - queue.push({isParallel: true, fn: function(){fn.apply(that, [that, objx]);}, timeOut: timeOut}); + var timeOut = (typeof (arguments[2]) != "undefined") ? arguments[2] : defaultTimeOut; + if (typeof (fn) == "function") { + for (var i = 0; i < obj.length; i++) { + var f = function (objx) { + queue.push({ + isParallel: true, fn: function () { + fn.apply(that, [that, objx]); + }, timeOut: timeOut + }); }(obj[i]) } } } else { var fn = arguments[0]; - var timeOut = (typeof(arguments[1]) != "undefined")? arguments[2] : defaultTimeOut; + var timeOut = (typeof (arguments[1]) != "undefined") ? arguments[2] : defaultTimeOut; queue.push({isParallel: false, fn: func, timeOut: timeOut}); } - return this; - }; - - this.addParallel = function(func, timeOut) { + return this; + }; + + this.addParallel = function (func, timeOut) { // TODO: add callback for queue[i] complete - - queue.push({isParallel: true, fn: func, timeOut: timeOut}); - return this; - }; - - this.storeData = function(dataObject) { - lastCallbackData = dataObject; - return this; - }; - - this.lastCallbackData = function () { - return lastCallbackData; - }; - - this.run = function() { - paused = false; - _run(); - }; - - this.pause = function () { - paused = true; - return this; - }; - - this.failure = function() { - paused = true; - if (failureFunc) { - var args = [that]; - for(i = 0; i < arguments.length; i++) { - args.push(arguments[i]); - } - failureFunc.apply(that, args); - } - }; - - this.size = function(){ + + queue.push({isParallel: true, fn: func, timeOut: timeOut}); + return this; + }; + + this.storeData = function (dataObject) { + lastCallbackData = dataObject; + return this; + }; + + this.lastCallbackData = function () { + return lastCallbackData; + }; + + this.run = function () { + paused = false; + _run(); + }; + + this.pause = function () { + paused = true; + return this; + }; + + this.failure = function () { + paused = true; + if (failureFunc) { + var args = [that]; + for (i = 0; i < arguments.length; i++) { + args.push(arguments[i]); + } + failureFunc.apply(that, args); + } + }; + + this.size = function () { return queue.length; }; - return this; - } + return this; + } })(jQuery); diff --git a/len-activiti/src/main/resources/static/diagram-viewer/js/jquery/jquery.js b/len-activiti/src/main/resources/static/diagram-viewer/js/jquery/jquery.js index 2af1c89..da873b1 100644 --- a/len-activiti/src/main/resources/static/diagram-viewer/js/jquery/jquery.js +++ b/len-activiti/src/main/resources/static/diagram-viewer/js/jquery/jquery.js @@ -13,965 +13,969 @@ * * Date: Mon Nov 21 21:11:03 2011 -0500 */ -(function( window, undefined ) { +(function (window, undefined) { // Use the correct document accordingly with window argument (sandbox) -var document = window.document, - navigator = window.navigator, - location = window.location; -var jQuery = (function() { + var document = window.document, + navigator = window.navigator, + location = window.location; + var jQuery = (function () { // Define a local copy of jQuery -var jQuery = function( selector, context ) { - // The jQuery object is actually just the init constructor 'enhanced' - return new jQuery.fn.init( selector, context, rootjQuery ); - }, + var jQuery = function (selector, context) { + // The jQuery object is actually just the init constructor 'enhanced' + return new jQuery.fn.init(selector, context, rootjQuery); + }, - // Map over jQuery in case of overwrite - _jQuery = window.jQuery, + // Map over jQuery in case of overwrite + _jQuery = window.jQuery, - // Map over the $ in case of overwrite - _$ = window.$, + // Map over the $ in case of overwrite + _$ = window.$, - // A central reference to the root jQuery(document) - rootjQuery, + // A central reference to the root jQuery(document) + rootjQuery, - // A simple way to check for HTML strings or ID strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/, + // A simple way to check for HTML strings or ID strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/, - // Check if a string has a non-whitespace character in it - rnotwhite = /\S/, + // Check if a string has a non-whitespace character in it + rnotwhite = /\S/, - // Used for trimming whitespace - trimLeft = /^\s+/, - trimRight = /\s+$/, + // Used for trimming whitespace + trimLeft = /^\s+/, + trimRight = /\s+$/, - // Match a standalone tag - rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, + // Match a standalone tag + rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, - // JSON RegExp - rvalidchars = /^[\],:{}\s]*$/, - rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, - rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, - rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, + // JSON RegExp + rvalidchars = /^[\],:{}\s]*$/, + rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, + rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, + rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, - // Useragent RegExp - rwebkit = /(webkit)[ \/]([\w.]+)/, - ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/, - rmsie = /(msie) ([\w.]+)/, - rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/, + // Useragent RegExp + rwebkit = /(webkit)[ \/]([\w.]+)/, + ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/, + rmsie = /(msie) ([\w.]+)/, + rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/, - // Matches dashed string for camelizing - rdashAlpha = /-([a-z]|[0-9])/ig, - rmsPrefix = /^-ms-/, + // Matches dashed string for camelizing + rdashAlpha = /-([a-z]|[0-9])/ig, + rmsPrefix = /^-ms-/, - // Used by jQuery.camelCase as callback to replace() - fcamelCase = function( all, letter ) { - return ( letter + "" ).toUpperCase(); - }, + // Used by jQuery.camelCase as callback to replace() + fcamelCase = function (all, letter) { + return (letter + "").toUpperCase(); + }, - // Keep a UserAgent string for use with jQuery.browser - userAgent = navigator.userAgent, + // Keep a UserAgent string for use with jQuery.browser + userAgent = navigator.userAgent, - // For matching the engine and version of the browser - browserMatch, + // For matching the engine and version of the browser + browserMatch, - // The deferred used on DOM ready - readyList, + // The deferred used on DOM ready + readyList, - // The ready event handler - DOMContentLoaded, + // The ready event handler + DOMContentLoaded, - // Save a reference to some core methods - toString = Object.prototype.toString, - hasOwn = Object.prototype.hasOwnProperty, - push = Array.prototype.push, - slice = Array.prototype.slice, - trim = String.prototype.trim, - indexOf = Array.prototype.indexOf, + // Save a reference to some core methods + toString = Object.prototype.toString, + hasOwn = Object.prototype.hasOwnProperty, + push = Array.prototype.push, + slice = Array.prototype.slice, + trim = String.prototype.trim, + indexOf = Array.prototype.indexOf, - // [[Class]] -> type pairs - class2type = {}; + // [[Class]] -> type pairs + class2type = {}; -jQuery.fn = jQuery.prototype = { - constructor: jQuery, - init: function( selector, context, rootjQuery ) { - var match, elem, ret, doc; + jQuery.fn = jQuery.prototype = { + constructor: jQuery, + init: function (selector, context, rootjQuery) { + var match, elem, ret, doc; - // Handle $(""), $(null), or $(undefined) - if ( !selector ) { - return this; - } + // Handle $(""), $(null), or $(undefined) + if (!selector) { + return this; + } - // Handle $(DOMElement) - if ( selector.nodeType ) { - this.context = this[0] = selector; - this.length = 1; - return this; - } + // Handle $(DOMElement) + if (selector.nodeType) { + this.context = this[0] = selector; + this.length = 1; + return this; + } - // The body element only exists once, optimize finding it - if ( selector === "body" && !context && document.body ) { - this.context = document; - this[0] = document.body; - this.selector = selector; - this.length = 1; - return this; - } + // The body element only exists once, optimize finding it + if (selector === "body" && !context && document.body) { + this.context = document; + this[0] = document.body; + this.selector = selector; + this.length = 1; + return this; + } - // Handle HTML strings - if ( typeof selector === "string" ) { - // Are we dealing with HTML string or an ID? - if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; + // Handle HTML strings + if (typeof selector === "string") { + // Are we dealing with HTML string or an ID? + if (selector.charAt(0) === "<" && selector.charAt(selector.length - 1) === ">" && selector.length >= 3) { + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [null, selector, null]; - } else { - match = quickExpr.exec( selector ); - } + } else { + match = quickExpr.exec(selector); + } - // Verify a match, and that no context was specified for #id - if ( match && (match[1] || !context) ) { + // Verify a match, and that no context was specified for #id + if (match && (match[1] || !context)) { - // HANDLE: $(html) -> $(array) - if ( match[1] ) { - context = context instanceof jQuery ? context[0] : context; - doc = ( context ? context.ownerDocument || context : document ); + // HANDLE: $(html) -> $(array) + if (match[1]) { + context = context instanceof jQuery ? context[0] : context; + doc = (context ? context.ownerDocument || context : document); - // If a single string is passed in and it's a single tag - // just do a createElement and skip the rest - ret = rsingleTag.exec( selector ); + // If a single string is passed in and it's a single tag + // just do a createElement and skip the rest + ret = rsingleTag.exec(selector); - if ( ret ) { - if ( jQuery.isPlainObject( context ) ) { - selector = [ document.createElement( ret[1] ) ]; - jQuery.fn.attr.call( selector, context, true ); + if (ret) { + if (jQuery.isPlainObject(context)) { + selector = [document.createElement(ret[1])]; + jQuery.fn.attr.call(selector, context, true); - } else { - selector = [ doc.createElement( ret[1] ) ]; - } + } else { + selector = [doc.createElement(ret[1])]; + } - } else { - ret = jQuery.buildFragment( [ match[1] ], [ doc ] ); - selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes; - } + } else { + ret = jQuery.buildFragment([match[1]], [doc]); + selector = (ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment).childNodes; + } - return jQuery.merge( this, selector ); + return jQuery.merge(this, selector); - // HANDLE: $("#id") - } else { - elem = document.getElementById( match[2] ); - - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - if ( elem && elem.parentNode ) { - // Handle the case where IE and Opera return items - // by name instead of ID - if ( elem.id !== match[2] ) { - return rootjQuery.find( selector ); + // HANDLE: $("#id") + } else { + elem = document.getElementById(match[2]); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if (elem && elem.parentNode) { + // Handle the case where IE and Opera return items + // by name instead of ID + if (elem.id !== match[2]) { + return rootjQuery.find(selector); + } + + // Otherwise, we inject the element directly into the jQuery object + this.length = 1; + this[0] = elem; + } + + this.context = document; + this.selector = selector; + return this; } - // Otherwise, we inject the element directly into the jQuery object - this.length = 1; - this[0] = elem; + // HANDLE: $(expr, $(...)) + } else if (!context || context.jquery) { + return (context || rootjQuery).find(selector); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor(context).find(selector); } - this.context = document; - this.selector = selector; - return this; + // HANDLE: $(function) + // Shortcut for document ready + } else if (jQuery.isFunction(selector)) { + return rootjQuery.ready(selector); } - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || rootjQuery ).find( selector ); + if (selector.selector !== undefined) { + this.selector = selector.selector; + this.context = selector.context; + } - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } + return jQuery.makeArray(selector, this); + }, - // HANDLE: $(function) - // Shortcut for document ready - } else if ( jQuery.isFunction( selector ) ) { - return rootjQuery.ready( selector ); - } + // Start with an empty selector + selector: "", - if ( selector.selector !== undefined ) { - this.selector = selector.selector; - this.context = selector.context; - } + // The current version of jQuery being used + jquery: "1.7.1", - return jQuery.makeArray( selector, this ); - }, + // The default length of a jQuery object is 0 + length: 0, - // Start with an empty selector - selector: "", + // The number of elements contained in the matched element set + size: function () { + return this.length; + }, - // The current version of jQuery being used - jquery: "1.7.1", + toArray: function () { + return slice.call(this, 0); + }, - // The default length of a jQuery object is 0 - length: 0, + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function (num) { + return num == null ? - // The number of elements contained in the matched element set - size: function() { - return this.length; - }, + // Return a 'clean' array + this.toArray() : - toArray: function() { - return slice.call( this, 0 ); - }, + // Return just the object + (num < 0 ? this[this.length + num] : this[num]); + }, - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - return num == null ? + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function (elems, name, selector) { + // Build a new jQuery matched element set + var ret = this.constructor(); - // Return a 'clean' array - this.toArray() : + if (jQuery.isArray(elems)) { + push.apply(ret, elems); - // Return just the object - ( num < 0 ? this[ this.length + num ] : this[ num ] ); - }, + } else { + jQuery.merge(ret, elems); + } - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems, name, selector ) { - // Build a new jQuery matched element set - var ret = this.constructor(); + // Add the old object onto the stack (as a reference) + ret.prevObject = this; - if ( jQuery.isArray( elems ) ) { - push.apply( ret, elems ); + ret.context = this.context; - } else { - jQuery.merge( ret, elems ); - } + if (name === "find") { + ret.selector = this.selector + (this.selector ? " " : "") + selector; + } else if (name) { + ret.selector = this.selector + "." + name + "(" + selector + ")"; + } - // Add the old object onto the stack (as a reference) - ret.prevObject = this; + // Return the newly-formed element set + return ret; + }, - ret.context = this.context; + // Execute a callback for every element in the matched set. + // (You can seed the arguments with an array of args, but this is + // only used internally.) + each: function (callback, args) { + return jQuery.each(this, callback, args); + }, - if ( name === "find" ) { - ret.selector = this.selector + ( this.selector ? " " : "" ) + selector; - } else if ( name ) { - ret.selector = this.selector + "." + name + "(" + selector + ")"; - } + ready: function (fn) { + // Attach the listeners + jQuery.bindReady(); - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - // (You can seed the arguments with an array of args, but this is - // only used internally.) - each: function( callback, args ) { - return jQuery.each( this, callback, args ); - }, - - ready: function( fn ) { - // Attach the listeners - jQuery.bindReady(); - - // Add the callback - readyList.add( fn ); - - return this; - }, - - eq: function( i ) { - i = +i; - return i === -1 ? - this.slice( i ) : - this.slice( i, i + 1 ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - slice: function() { - return this.pushStack( slice.apply( this, arguments ), - "slice", slice.call(arguments).join(",") ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map(this, function( elem, i ) { - return callback.call( elem, i, elem ); - })); - }, - - end: function() { - return this.prevObject || this.constructor(null); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: [].sort, - splice: [].splice -}; + // Add the callback + readyList.add(fn); -// Give the init function the jQuery prototype for later instantiation -jQuery.fn.init.prototype = jQuery.fn; - -jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[0] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - target = arguments[1] || {}; - // skip the boolean and the target - i = 2; - } + return this; + }, - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !jQuery.isFunction(target) ) { - target = {}; - } + eq: function (i) { + i = +i; + return i === -1 ? + this.slice(i) : + this.slice(i, i + 1); + }, - // extend jQuery itself if only one argument is passed - if ( length === i ) { - target = this; - --i; - } + first: function () { + return this.eq(0); + }, - for ( ; i < length; i++ ) { - // Only deal with non-null/undefined values - if ( (options = arguments[ i ]) != null ) { - // Extend the base object - for ( name in options ) { - src = target[ name ]; - copy = options[ name ]; + last: function () { + return this.eq(-1); + }, - // Prevent never-ending loop - if ( target === copy ) { - continue; - } + slice: function () { + return this.pushStack(slice.apply(this, arguments), + "slice", slice.call(arguments).join(",")); + }, - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { - if ( copyIsArray ) { - copyIsArray = false; - clone = src && jQuery.isArray(src) ? src : []; + map: function (callback) { + return this.pushStack(jQuery.map(this, function (elem, i) { + return callback.call(elem, i, elem); + })); + }, - } else { - clone = src && jQuery.isPlainObject(src) ? src : {}; - } + end: function () { + return this.prevObject || this.constructor(null); + }, - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: [].sort, + splice: [].splice + }; - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } +// Give the init function the jQuery prototype for later instantiation + jQuery.fn.init.prototype = jQuery.fn; + + jQuery.extend = jQuery.fn.extend = function () { + var options, name, src, copy, copyIsArray, clone, + target = arguments[0] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if (typeof target === "boolean") { + deep = target; + target = arguments[1] || {}; + // skip the boolean and the target + i = 2; } - } - } - // Return the modified object - return target; -}; + // Handle case when target is a string or something (possible in deep copy) + if (typeof target !== "object" && !jQuery.isFunction(target)) { + target = {}; + } -jQuery.extend({ - noConflict: function( deep ) { - if ( window.$ === jQuery ) { - window.$ = _$; - } + // extend jQuery itself if only one argument is passed + if (length === i) { + target = this; + --i; + } - if ( deep && window.jQuery === jQuery ) { - window.jQuery = _jQuery; - } + for (; i < length; i++) { + // Only deal with non-null/undefined values + if ((options = arguments[i]) != null) { + // Extend the base object + for (name in options) { + src = target[name]; + copy = options[name]; - return jQuery; - }, + // Prevent never-ending loop + if (target === copy) { + continue; + } - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, + // Recurse if we're merging plain objects or arrays + if (deep && copy && (jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)))) { + if (copyIsArray) { + copyIsArray = false; + clone = src && jQuery.isArray(src) ? src : []; - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, + } else { + clone = src && jQuery.isPlainObject(src) ? src : {}; + } - // Hold (or release) the ready event - holdReady: function( hold ) { - if ( hold ) { - jQuery.readyWait++; - } else { - jQuery.ready( true ); - } - }, + // Never move original objects, clone them + target[name] = jQuery.extend(deep, clone, copy); - // Handle when the DOM is ready - ready: function( wait ) { - // Either a released hold or an DOMready/load event and not yet ready - if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) { - // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). - if ( !document.body ) { - return setTimeout( jQuery.ready, 1 ); + // Don't bring in undefined values + } else if (copy !== undefined) { + target[name] = copy; + } + } + } } - // Remember that the DOM is ready - jQuery.isReady = true; + // Return the modified object + return target; + }; - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } + jQuery.extend({ + noConflict: function (deep) { + if (window.$ === jQuery) { + window.$ = _$; + } - // If there are functions bound, to execute - readyList.fireWith( document, [ jQuery ] ); + if (deep && window.jQuery === jQuery) { + window.jQuery = _jQuery; + } - // Trigger any bound ready events - if ( jQuery.fn.trigger ) { - jQuery( document ).trigger( "ready" ).off( "ready" ); - } - } - }, + return jQuery; + }, - bindReady: function() { - if ( readyList ) { - return; - } + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, - readyList = jQuery.Callbacks( "once memory" ); + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, - // Catch cases where $(document).ready() is called after the - // browser event has already occurred. - if ( document.readyState === "complete" ) { - // Handle it asynchronously to allow scripts the opportunity to delay ready - return setTimeout( jQuery.ready, 1 ); - } + // Hold (or release) the ready event + holdReady: function (hold) { + if (hold) { + jQuery.readyWait++; + } else { + jQuery.ready(true); + } + }, - // Mozilla, Opera and webkit nightlies currently support this event - if ( document.addEventListener ) { - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + // Handle when the DOM is ready + ready: function (wait) { + // Either a released hold or an DOMready/load event and not yet ready + if ((wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady)) { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if (!document.body) { + return setTimeout(jQuery.ready, 1); + } - // A fallback to window.onload, that will always work - window.addEventListener( "load", jQuery.ready, false ); + // Remember that the DOM is ready + jQuery.isReady = true; - // If IE event model is used - } else if ( document.attachEvent ) { - // ensure firing before onload, - // maybe late but safe also for iframes - document.attachEvent( "onreadystatechange", DOMContentLoaded ); + // If a normal DOM Ready event fired, decrement, and wait if need be + if (wait !== true && --jQuery.readyWait > 0) { + return; + } - // A fallback to window.onload, that will always work - window.attachEvent( "onload", jQuery.ready ); + // If there are functions bound, to execute + readyList.fireWith(document, [jQuery]); - // If IE and not a frame - // continually check to see if the document is ready - var toplevel = false; + // Trigger any bound ready events + if (jQuery.fn.trigger) { + jQuery(document).trigger("ready").off("ready"); + } + } + }, - try { - toplevel = window.frameElement == null; - } catch(e) {} + bindReady: function () { + if (readyList) { + return; + } - if ( document.documentElement.doScroll && toplevel ) { - doScrollCheck(); - } - } - }, - - // See test/unit/core.js for details concerning isFunction. - // Since version 1.3, DOM methods and functions like alert - // aren't supported. They return false on IE (#2968). - isFunction: function( obj ) { - return jQuery.type(obj) === "function"; - }, - - isArray: Array.isArray || function( obj ) { - return jQuery.type(obj) === "array"; - }, - - // A crude way of determining if an object is a window - isWindow: function( obj ) { - return obj && typeof obj === "object" && "setInterval" in obj; - }, - - isNumeric: function( obj ) { - return !isNaN( parseFloat(obj) ) && isFinite( obj ); - }, - - type: function( obj ) { - return obj == null ? - String( obj ) : - class2type[ toString.call(obj) ] || "object"; - }, - - isPlainObject: function( obj ) { - // Must be an Object. - // Because of IE, we also have to check the presence of the constructor property. - // Make sure that DOM nodes and window objects don't pass through, as well - if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { - return false; - } + readyList = jQuery.Callbacks("once memory"); - try { - // Not own constructor property must be Object - if ( obj.constructor && - !hasOwn.call(obj, "constructor") && - !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { - return false; - } - } catch ( e ) { - // IE8,9 Will throw exceptions on certain host objects #9897 - return false; - } + // Catch cases where $(document).ready() is called after the + // browser event has already occurred. + if (document.readyState === "complete") { + // Handle it asynchronously to allow scripts the opportunity to delay ready + return setTimeout(jQuery.ready, 1); + } - // Own properties are enumerated firstly, so to speed up, - // if last one is own, then all properties are own. + // Mozilla, Opera and webkit nightlies currently support this event + if (document.addEventListener) { + // Use the handy event callback + document.addEventListener("DOMContentLoaded", DOMContentLoaded, false); - var key; - for ( key in obj ) {} + // A fallback to window.onload, that will always work + window.addEventListener("load", jQuery.ready, false); - return key === undefined || hasOwn.call( obj, key ); - }, + // If IE event model is used + } else if (document.attachEvent) { + // ensure firing before onload, + // maybe late but safe also for iframes + document.attachEvent("onreadystatechange", DOMContentLoaded); - isEmptyObject: function( obj ) { - for ( var name in obj ) { - return false; - } - return true; - }, + // A fallback to window.onload, that will always work + window.attachEvent("onload", jQuery.ready); - error: function( msg ) { - throw new Error( msg ); - }, + // If IE and not a frame + // continually check to see if the document is ready + var toplevel = false; - parseJSON: function( data ) { - if ( typeof data !== "string" || !data ) { - return null; - } + try { + toplevel = window.frameElement == null; + } catch (e) { + } - // Make sure leading/trailing whitespace is removed (IE can't handle it) - data = jQuery.trim( data ); + if (document.documentElement.doScroll && toplevel) { + doScrollCheck(); + } + } + }, - // Attempt to parse using the native JSON parser first - if ( window.JSON && window.JSON.parse ) { - return window.JSON.parse( data ); - } + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function (obj) { + return jQuery.type(obj) === "function"; + }, - // Make sure the incoming data is actual JSON - // Logic borrowed from http://json.org/json2.js - if ( rvalidchars.test( data.replace( rvalidescape, "@" ) - .replace( rvalidtokens, "]" ) - .replace( rvalidbraces, "")) ) { + isArray: Array.isArray || function (obj) { + return jQuery.type(obj) === "array"; + }, - return ( new Function( "return " + data ) )(); + // A crude way of determining if an object is a window + isWindow: function (obj) { + return obj && typeof obj === "object" && "setInterval" in obj; + }, - } - jQuery.error( "Invalid JSON: " + data ); - }, + isNumeric: function (obj) { + return !isNaN(parseFloat(obj)) && isFinite(obj); + }, - // Cross-browser xml parsing - parseXML: function( data ) { - var xml, tmp; - try { - if ( window.DOMParser ) { // Standard - tmp = new DOMParser(); - xml = tmp.parseFromString( data , "text/xml" ); - } else { // IE - xml = new ActiveXObject( "Microsoft.XMLDOM" ); - xml.async = "false"; - xml.loadXML( data ); - } - } catch( e ) { - xml = undefined; - } - if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) { - jQuery.error( "Invalid XML: " + data ); - } - return xml; - }, - - noop: function() {}, - - // Evaluates a script in a global context - // Workarounds based on findings by Jim Driscoll - // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context - globalEval: function( data ) { - if ( data && rnotwhite.test( data ) ) { - // We use execScript on Internet Explorer - // We use an anonymous function so that context is window - // rather than jQuery in Firefox - ( window.execScript || function( data ) { - window[ "eval" ].call( window, data ); - } )( data ); - } - }, - - // Convert dashed to camelCase; used by the css and data modules - // Microsoft forgot to hump their vendor prefix (#9572) - camelCase: function( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); - }, - - nodeName: function( elem, name ) { - return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase(); - }, - - // args is for internal usage only - each: function( object, callback, args ) { - var name, i = 0, - length = object.length, - isObj = length === undefined || jQuery.isFunction( object ); - - if ( args ) { - if ( isObj ) { - for ( name in object ) { - if ( callback.apply( object[ name ], args ) === false ) { - break; - } - } - } else { - for ( ; i < length; ) { - if ( callback.apply( object[ i++ ], args ) === false ) { - break; - } - } - } + type: function (obj) { + return obj == null ? + String(obj) : + class2type[toString.call(obj)] || "object"; + }, - // A special, fast, case for the most util use of each - } else { - if ( isObj ) { - for ( name in object ) { - if ( callback.call( object[ name ], name, object[ name ] ) === false ) { - break; - } + isPlainObject: function (obj) { + // Must be an Object. + // Because of IE, we also have to check the presence of the constructor property. + // Make sure that DOM nodes and window objects don't pass through, as well + if (!obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow(obj)) { + return false; } - } else { - for ( ; i < length; ) { - if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) { - break; + + try { + // Not own constructor property must be Object + if (obj.constructor && + !hasOwn.call(obj, "constructor") && + !hasOwn.call(obj.constructor.prototype, "isPrototypeOf")) { + return false; } + } catch (e) { + // IE8,9 Will throw exceptions on certain host objects #9897 + return false; } - } - } - return object; - }, - - // Use native String.trim function wherever possible - trim: trim ? - function( text ) { - return text == null ? - "" : - trim.call( text ); - } : + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. - // Otherwise use our own trimming functionality - function( text ) { - return text == null ? - "" : - text.toString().replace( trimLeft, "" ).replace( trimRight, "" ); - }, + var key; + for (key in obj) { + } - // results is for internal usage only - makeArray: function( array, results ) { - var ret = results || []; + return key === undefined || hasOwn.call(obj, key); + }, - if ( array != null ) { - // The window, strings (and functions) also have 'length' - // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930 - var type = jQuery.type( array ); + isEmptyObject: function (obj) { + for (var name in obj) { + return false; + } + return true; + }, - if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) { - push.call( ret, array ); - } else { - jQuery.merge( ret, array ); - } - } + error: function (msg) { + throw new Error(msg); + }, + + parseJSON: function (data) { + if (typeof data !== "string" || !data) { + return null; + } - return ret; - }, + // Make sure leading/trailing whitespace is removed (IE can't handle it) + data = jQuery.trim(data); - inArray: function( elem, array, i ) { - var len; + // Attempt to parse using the native JSON parser first + if (window.JSON && window.JSON.parse) { + return window.JSON.parse(data); + } - if ( array ) { - if ( indexOf ) { - return indexOf.call( array, elem, i ); - } + // Make sure the incoming data is actual JSON + // Logic borrowed from http://json.org/json2.js + if (rvalidchars.test(data.replace(rvalidescape, "@") + .replace(rvalidtokens, "]") + .replace(rvalidbraces, ""))) { - len = array.length; - i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; + return (new Function("return " + data))(); - for ( ; i < len; i++ ) { - // Skip accessing in sparse arrays - if ( i in array && array[ i ] === elem ) { - return i; } - } - } + jQuery.error("Invalid JSON: " + data); + }, - return -1; - }, + // Cross-browser xml parsing + parseXML: function (data) { + var xml, tmp; + try { + if (window.DOMParser) { // Standard + tmp = new DOMParser(); + xml = tmp.parseFromString(data, "text/xml"); + } else { // IE + xml = new ActiveXObject("Microsoft.XMLDOM"); + xml.async = "false"; + xml.loadXML(data); + } + } catch (e) { + xml = undefined; + } + if (!xml || !xml.documentElement || xml.getElementsByTagName("parsererror").length) { + jQuery.error("Invalid XML: " + data); + } + return xml; + }, - merge: function( first, second ) { - var i = first.length, - j = 0; + noop: function () { + }, - if ( typeof second.length === "number" ) { - for ( var l = second.length; j < l; j++ ) { - first[ i++ ] = second[ j ]; - } + // Evaluates a script in a global context + // Workarounds based on findings by Jim Driscoll + // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context + globalEval: function (data) { + if (data && rnotwhite.test(data)) { + // We use execScript on Internet Explorer + // We use an anonymous function so that context is window + // rather than jQuery in Firefox + (window.execScript || function (data) { + window["eval"].call(window, data); + })(data); + } + }, - } else { - while ( second[j] !== undefined ) { - first[ i++ ] = second[ j++ ]; - } - } + // Convert dashed to camelCase; used by the css and data modules + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function (string) { + return string.replace(rmsPrefix, "ms-").replace(rdashAlpha, fcamelCase); + }, - first.length = i; + nodeName: function (elem, name) { + return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase(); + }, - return first; - }, + // args is for internal usage only + each: function (object, callback, args) { + var name, i = 0, + length = object.length, + isObj = length === undefined || jQuery.isFunction(object); + + if (args) { + if (isObj) { + for (name in object) { + if (callback.apply(object[name], args) === false) { + break; + } + } + } else { + for (; i < length;) { + if (callback.apply(object[i++], args) === false) { + break; + } + } + } - grep: function( elems, callback, inv ) { - var ret = [], retVal; - inv = !!inv; + // A special, fast, case for the most util use of each + } else { + if (isObj) { + for (name in object) { + if (callback.call(object[name], name, object[name]) === false) { + break; + } + } + } else { + for (; i < length;) { + if (callback.call(object[i], i, object[i++]) === false) { + break; + } + } + } + } - // Go through the array, only saving the items - // that pass the validator function - for ( var i = 0, length = elems.length; i < length; i++ ) { - retVal = !!callback( elems[ i ], i ); - if ( inv !== retVal ) { - ret.push( elems[ i ] ); - } - } + return object; + }, - return ret; - }, + // Use native String.trim function wherever possible + trim: trim ? + function (text) { + return text == null ? + "" : + trim.call(text); + } : + + // Otherwise use our own trimming functionality + function (text) { + return text == null ? + "" : + text.toString().replace(trimLeft, "").replace(trimRight, ""); + }, - // arg is for internal usage only - map: function( elems, callback, arg ) { - var value, key, ret = [], - i = 0, - length = elems.length, - // jquery objects are treated as arrays - isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ; + // results is for internal usage only + makeArray: function (array, results) { + var ret = results || []; - // Go through the array, translating each of the items to their - if ( isArray ) { - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); + if (array != null) { + // The window, strings (and functions) also have 'length' + // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930 + var type = jQuery.type(array); - if ( value != null ) { - ret[ ret.length ] = value; + if (array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow(array)) { + push.call(ret, array); + } else { + jQuery.merge(ret, array); + } } - } - - // Go through every key on the object, - } else { - for ( key in elems ) { - value = callback( elems[ key ], key, arg ); - if ( value != null ) { - ret[ ret.length ] = value; - } - } - } + return ret; + }, - // Flatten any nested arrays - return ret.concat.apply( [], ret ); - }, + inArray: function (elem, array, i) { + var len; - // A global GUID counter for objects - guid: 1, + if (array) { + if (indexOf) { + return indexOf.call(array, elem, i); + } - // Bind a function to a context, optionally partially applying any - // arguments. - proxy: function( fn, context ) { - if ( typeof context === "string" ) { - var tmp = fn[ context ]; - context = fn; - fn = tmp; - } + len = array.length; + i = i ? i < 0 ? Math.max(0, len + i) : i : 0; - // Quick check to determine if target is callable, in the spec - // this throws a TypeError, but we will just return undefined. - if ( !jQuery.isFunction( fn ) ) { - return undefined; - } + for (; i < len; i++) { + // Skip accessing in sparse arrays + if (i in array && array[i] === elem) { + return i; + } + } + } - // Simulated bind - var args = slice.call( arguments, 2 ), - proxy = function() { - return fn.apply( context, args.concat( slice.call( arguments ) ) ); - }; + return -1; + }, - // Set the guid of unique handler to the same of original handler, so it can be removed - proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; + merge: function (first, second) { + var i = first.length, + j = 0; - return proxy; - }, + if (typeof second.length === "number") { + for (var l = second.length; j < l; j++) { + first[i++] = second[j]; + } - // Mutifunctional method to get and set values to a collection - // The value/s can optionally be executed if it's a function - access: function( elems, key, value, exec, fn, pass ) { - var length = elems.length; + } else { + while (second[j] !== undefined) { + first[i++] = second[j++]; + } + } - // Setting many attributes - if ( typeof key === "object" ) { - for ( var k in key ) { - jQuery.access( elems, k, key[k], exec, fn, value ); - } - return elems; - } + first.length = i; - // Setting one attribute - if ( value !== undefined ) { - // Optionally, function values get executed if exec is true - exec = !pass && exec && jQuery.isFunction(value); + return first; + }, - for ( var i = 0; i < length; i++ ) { - fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); - } + grep: function (elems, callback, inv) { + var ret = [], retVal; + inv = !!inv; - return elems; - } + // Go through the array, only saving the items + // that pass the validator function + for (var i = 0, length = elems.length; i < length; i++) { + retVal = !!callback(elems[i], i); + if (inv !== retVal) { + ret.push(elems[i]); + } + } - // Getting an attribute - return length ? fn( elems[0], key ) : undefined; - }, + return ret; + }, - now: function() { - return ( new Date() ).getTime(); - }, + // arg is for internal usage only + map: function (elems, callback, arg) { + var value, key, ret = [], + i = 0, + length = elems.length, + // jquery objects are treated as arrays + isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ((length > 0 && elems[0] && elems[length - 1]) || length === 0 || jQuery.isArray(elems)); - // Use of jQuery.browser is frowned upon. - // More details: http://docs.jquery.com/Utilities/jQuery.browser - uaMatch: function( ua ) { - ua = ua.toLowerCase(); + // Go through the array, translating each of the items to their + if (isArray) { + for (; i < length; i++) { + value = callback(elems[i], i, arg); - var match = rwebkit.exec( ua ) || - ropera.exec( ua ) || - rmsie.exec( ua ) || - ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) || - []; + if (value != null) { + ret[ret.length] = value; + } + } - return { browser: match[1] || "", version: match[2] || "0" }; - }, + // Go through every key on the object, + } else { + for (key in elems) { + value = callback(elems[key], key, arg); - sub: function() { - function jQuerySub( selector, context ) { - return new jQuerySub.fn.init( selector, context ); - } - jQuery.extend( true, jQuerySub, this ); - jQuerySub.superclass = this; - jQuerySub.fn = jQuerySub.prototype = this(); - jQuerySub.fn.constructor = jQuerySub; - jQuerySub.sub = this.sub; - jQuerySub.fn.init = function init( selector, context ) { - if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) { - context = jQuerySub( context ); - } + if (value != null) { + ret[ret.length] = value; + } + } + } - return jQuery.fn.init.call( this, selector, context, rootjQuerySub ); - }; - jQuerySub.fn.init.prototype = jQuerySub.fn; - var rootjQuerySub = jQuerySub(document); - return jQuerySub; - }, + // Flatten any nested arrays + return ret.concat.apply([], ret); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function (fn, context) { + if (typeof context === "string") { + var tmp = fn[context]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if (!jQuery.isFunction(fn)) { + return undefined; + } + + // Simulated bind + var args = slice.call(arguments, 2), + proxy = function () { + return fn.apply(context, args.concat(slice.call(arguments))); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; + + return proxy; + }, + + // Mutifunctional method to get and set values to a collection + // The value/s can optionally be executed if it's a function + access: function (elems, key, value, exec, fn, pass) { + var length = elems.length; + + // Setting many attributes + if (typeof key === "object") { + for (var k in key) { + jQuery.access(elems, k, key[k], exec, fn, value); + } + return elems; + } + + // Setting one attribute + if (value !== undefined) { + // Optionally, function values get executed if exec is true + exec = !pass && exec && jQuery.isFunction(value); + + for (var i = 0; i < length; i++) { + fn(elems[i], key, exec ? value.call(elems[i], i, fn(elems[i], key)) : value, pass); + } + + return elems; + } + + // Getting an attribute + return length ? fn(elems[0], key) : undefined; + }, + + now: function () { + return (new Date()).getTime(); + }, + + // Use of jQuery.browser is frowned upon. + // More details: http://docs.jquery.com/Utilities/jQuery.browser + uaMatch: function (ua) { + ua = ua.toLowerCase(); + + var match = rwebkit.exec(ua) || + ropera.exec(ua) || + rmsie.exec(ua) || + ua.indexOf("compatible") < 0 && rmozilla.exec(ua) || + []; - browser: {} -}); + return {browser: match[1] || "", version: match[2] || "0"}; + }, + + sub: function () { + function jQuerySub(selector, context) { + return new jQuerySub.fn.init(selector, context); + } + + jQuery.extend(true, jQuerySub, this); + jQuerySub.superclass = this; + jQuerySub.fn = jQuerySub.prototype = this(); + jQuerySub.fn.constructor = jQuerySub; + jQuerySub.sub = this.sub; + jQuerySub.fn.init = function init(selector, context) { + if (context && context instanceof jQuery && !(context instanceof jQuerySub)) { + context = jQuerySub(context); + } + + return jQuery.fn.init.call(this, selector, context, rootjQuerySub); + }; + jQuerySub.fn.init.prototype = jQuerySub.fn; + var rootjQuerySub = jQuerySub(document); + return jQuerySub; + }, + + browser: {} + }); // Populate the class2type map -jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -}); + jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function (i, name) { + class2type["[object " + name + "]"] = name.toLowerCase(); + }); -browserMatch = jQuery.uaMatch( userAgent ); -if ( browserMatch.browser ) { - jQuery.browser[ browserMatch.browser ] = true; - jQuery.browser.version = browserMatch.version; -} + browserMatch = jQuery.uaMatch(userAgent); + if (browserMatch.browser) { + jQuery.browser[browserMatch.browser] = true; + jQuery.browser.version = browserMatch.version; + } // Deprecated, use jQuery.browser.webkit instead -if ( jQuery.browser.webkit ) { - jQuery.browser.safari = true; -} + if (jQuery.browser.webkit) { + jQuery.browser.safari = true; + } // IE doesn't match non-breaking spaces with \s -if ( rnotwhite.test( "\xA0" ) ) { - trimLeft = /^[\s\xA0]+/; - trimRight = /[\s\xA0]+$/; -} + if (rnotwhite.test("\xA0")) { + trimLeft = /^[\s\xA0]+/; + trimRight = /[\s\xA0]+$/; + } // All jQuery objects should point back to these -rootjQuery = jQuery(document); + rootjQuery = jQuery(document); // Cleanup functions for the document ready method -if ( document.addEventListener ) { - DOMContentLoaded = function() { - document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); - jQuery.ready(); - }; + if (document.addEventListener) { + DOMContentLoaded = function () { + document.removeEventListener("DOMContentLoaded", DOMContentLoaded, false); + jQuery.ready(); + }; -} else if ( document.attachEvent ) { - DOMContentLoaded = function() { - // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). - if ( document.readyState === "complete" ) { - document.detachEvent( "onreadystatechange", DOMContentLoaded ); - jQuery.ready(); + } else if (document.attachEvent) { + DOMContentLoaded = function () { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if (document.readyState === "complete") { + document.detachEvent("onreadystatechange", DOMContentLoaded); + jQuery.ready(); + } + }; } - }; -} // The DOM ready check for Internet Explorer -function doScrollCheck() { - if ( jQuery.isReady ) { - return; - } + function doScrollCheck() { + if (jQuery.isReady) { + return; + } - try { - // If IE is used, use the trick by Diego Perini - // http://javascript.nwbox.com/IEContentLoaded/ - document.documentElement.doScroll("left"); - } catch(e) { - setTimeout( doScrollCheck, 1 ); - return; - } + try { + // If IE is used, use the trick by Diego Perini + // http://javascript.nwbox.com/IEContentLoaded/ + document.documentElement.doScroll("left"); + } catch (e) { + setTimeout(doScrollCheck, 1); + return; + } - // and execute any waiting functions - jQuery.ready(); -} + // and execute any waiting functions + jQuery.ready(); + } -return jQuery; + return jQuery; -})(); + })(); // String to Object flags format cache -var flagsCache = {}; + var flagsCache = {}; // Convert String-formatted flags into Object-formatted ones and store in cache -function createFlags( flags ) { - var object = flagsCache[ flags ] = {}, - i, length; - flags = flags.split( /\s+/ ); - for ( i = 0, length = flags.length; i < length; i++ ) { - object[ flags[i] ] = true; + function createFlags(flags) { + var object = flagsCache[flags] = {}, + i, length; + flags = flags.split(/\s+/); + for (i = 0, length = flags.length; i < length; i++) { + object[flags[i]] = true; + } + return object; } - return object; -} -/* + /* * Create a callback list using the following parameters: * * flags: an optional list of space-separated flags that will change how @@ -993,5863 +997,5857 @@ function createFlags( flags ) { * stopOnFalse: interrupt callings when a callback returns false * */ -jQuery.Callbacks = function( flags ) { - - // Convert flags from String-formatted to Object-formatted - // (we check in cache first) - flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {}; - - var // Actual callback list - list = [], - // Stack of fire calls for repeatable lists - stack = [], - // Last fire value (for non-forgettable lists) - memory, - // Flag to know if list is currently firing - firing, - // First callback to fire (used internally by add and fireWith) - firingStart, - // End of the loop when firing - firingLength, - // Index of currently firing callback (modified by remove if needed) - firingIndex, - // Add one or several callbacks to the list - add = function( args ) { - var i, - length, - elem, - type, - actual; - for ( i = 0, length = args.length; i < length; i++ ) { - elem = args[ i ]; - type = jQuery.type( elem ); - if ( type === "array" ) { - // Inspect recursively - add( elem ); - } else if ( type === "function" ) { - // Add if not in unique mode and callback is not in - if ( !flags.unique || !self.has( elem ) ) { - list.push( elem ); + jQuery.Callbacks = function (flags) { + + // Convert flags from String-formatted to Object-formatted + // (we check in cache first) + flags = flags ? (flagsCache[flags] || createFlags(flags)) : {}; + + var // Actual callback list + list = [], + // Stack of fire calls for repeatable lists + stack = [], + // Last fire value (for non-forgettable lists) + memory, + // Flag to know if list is currently firing + firing, + // First callback to fire (used internally by add and fireWith) + firingStart, + // End of the loop when firing + firingLength, + // Index of currently firing callback (modified by remove if needed) + firingIndex, + // Add one or several callbacks to the list + add = function (args) { + var i, + length, + elem, + type, + actual; + for (i = 0, length = args.length; i < length; i++) { + elem = args[i]; + type = jQuery.type(elem); + if (type === "array") { + // Inspect recursively + add(elem); + } else if (type === "function") { + // Add if not in unique mode and callback is not in + if (!flags.unique || !self.has(elem)) { + list.push(elem); + } } } - } - }, - // Fire callbacks - fire = function( context, args ) { - args = args || []; - memory = !flags.memory || [ context, args ]; - firing = true; - firingIndex = firingStart || 0; - firingStart = 0; - firingLength = list.length; - for ( ; list && firingIndex < firingLength; firingIndex++ ) { - if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) { - memory = true; // Mark as halted - break; - } - } - firing = false; - if ( list ) { - if ( !flags.once ) { - if ( stack && stack.length ) { - memory = stack.shift(); - self.fireWith( memory[ 0 ], memory[ 1 ] ); + }, + // Fire callbacks + fire = function (context, args) { + args = args || []; + memory = !flags.memory || [context, args]; + firing = true; + firingIndex = firingStart || 0; + firingStart = 0; + firingLength = list.length; + for (; list && firingIndex < firingLength; firingIndex++) { + if (list[firingIndex].apply(context, args) === false && flags.stopOnFalse) { + memory = true; // Mark as halted + break; } - } else if ( memory === true ) { - self.disable(); - } else { - list = []; } - } - }, - // Actual Callbacks object - self = { - // Add a callback or a collection of callbacks to the list - add: function() { - if ( list ) { - var length = list.length; - add( arguments ); - // Do we need to add the callbacks to the - // current firing batch? - if ( firing ) { - firingLength = list.length; - // With memory, if we're not firing then - // we should call right away, unless previous - // firing was halted (stopOnFalse) - } else if ( memory && memory !== true ) { - firingStart = length; - fire( memory[ 0 ], memory[ 1 ] ); + firing = false; + if (list) { + if (!flags.once) { + if (stack && stack.length) { + memory = stack.shift(); + self.fireWith(memory[0], memory[1]); + } + } else if (memory === true) { + self.disable(); + } else { + list = []; } } - return this; }, - // Remove a callback from the list - remove: function() { - if ( list ) { - var args = arguments, - argIndex = 0, - argLength = args.length; - for ( ; argIndex < argLength ; argIndex++ ) { - for ( var i = 0; i < list.length; i++ ) { - if ( args[ argIndex ] === list[ i ] ) { - // Handle firingIndex and firingLength - if ( firing ) { - if ( i <= firingLength ) { - firingLength--; - if ( i <= firingIndex ) { - firingIndex--; + // Actual Callbacks object + self = { + // Add a callback or a collection of callbacks to the list + add: function () { + if (list) { + var length = list.length; + add(arguments); + // Do we need to add the callbacks to the + // current firing batch? + if (firing) { + firingLength = list.length; + // With memory, if we're not firing then + // we should call right away, unless previous + // firing was halted (stopOnFalse) + } else if (memory && memory !== true) { + firingStart = length; + fire(memory[0], memory[1]); + } + } + return this; + }, + // Remove a callback from the list + remove: function () { + if (list) { + var args = arguments, + argIndex = 0, + argLength = args.length; + for (; argIndex < argLength; argIndex++) { + for (var i = 0; i < list.length; i++) { + if (args[argIndex] === list[i]) { + // Handle firingIndex and firingLength + if (firing) { + if (i <= firingLength) { + firingLength--; + if (i <= firingIndex) { + firingIndex--; + } } } - } - // Remove the element - list.splice( i--, 1 ); - // If we have some unicity property then - // we only need to do this once - if ( flags.unique ) { - break; + // Remove the element + list.splice(i--, 1); + // If we have some unicity property then + // we only need to do this once + if (flags.unique) { + break; + } } } } } - } - return this; - }, - // Control if a given callback is in the list - has: function( fn ) { - if ( list ) { - var i = 0, - length = list.length; - for ( ; i < length; i++ ) { - if ( fn === list[ i ] ) { - return true; + return this; + }, + // Control if a given callback is in the list + has: function (fn) { + if (list) { + var i = 0, + length = list.length; + for (; i < length; i++) { + if (fn === list[i]) { + return true; + } } } - } - return false; - }, - // Remove all callbacks from the list - empty: function() { - list = []; - return this; - }, - // Have the list do nothing anymore - disable: function() { - list = stack = memory = undefined; - return this; - }, - // Is it disabled? - disabled: function() { - return !list; - }, - // Lock the list in its current state - lock: function() { - stack = undefined; - if ( !memory || memory === true ) { - self.disable(); - } - return this; - }, - // Is it locked? - locked: function() { - return !stack; - }, - // Call all callbacks with the given context and arguments - fireWith: function( context, args ) { - if ( stack ) { - if ( firing ) { - if ( !flags.once ) { - stack.push( [ context, args ] ); + return false; + }, + // Remove all callbacks from the list + empty: function () { + list = []; + return this; + }, + // Have the list do nothing anymore + disable: function () { + list = stack = memory = undefined; + return this; + }, + // Is it disabled? + disabled: function () { + return !list; + }, + // Lock the list in its current state + lock: function () { + stack = undefined; + if (!memory || memory === true) { + self.disable(); + } + return this; + }, + // Is it locked? + locked: function () { + return !stack; + }, + // Call all callbacks with the given context and arguments + fireWith: function (context, args) { + if (stack) { + if (firing) { + if (!flags.once) { + stack.push([context, args]); + } + } else if (!(flags.once && memory)) { + fire(context, args); } - } else if ( !( flags.once && memory ) ) { - fire( context, args ); } + return this; + }, + // Call all the callbacks with the given arguments + fire: function () { + self.fireWith(this, arguments); + return this; + }, + // To know if the callbacks have already been called at least once + fired: function () { + return !!memory; } - return this; - }, - // Call all the callbacks with the given arguments - fire: function() { - self.fireWith( this, arguments ); - return this; - }, - // To know if the callbacks have already been called at least once - fired: function() { - return !!memory; - } - }; - - return self; -}; - - - - -var // Static reference to slice - sliceDeferred = [].slice; + }; -jQuery.extend({ + return self; + }; - Deferred: function( func ) { - var doneList = jQuery.Callbacks( "once memory" ), - failList = jQuery.Callbacks( "once memory" ), - progressList = jQuery.Callbacks( "memory" ), - state = "pending", - lists = { - resolve: doneList, - reject: failList, - notify: progressList - }, - promise = { - done: doneList.add, - fail: failList.add, - progress: progressList.add, - state: function() { - return state; - }, + var // Static reference to slice + sliceDeferred = [].slice; - // Deprecated - isResolved: doneList.fired, - isRejected: failList.fired, + jQuery.extend({ - then: function( doneCallbacks, failCallbacks, progressCallbacks ) { - deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks ); - return this; - }, - always: function() { - deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments ); - return this; + Deferred: function (func) { + var doneList = jQuery.Callbacks("once memory"), + failList = jQuery.Callbacks("once memory"), + progressList = jQuery.Callbacks("memory"), + state = "pending", + lists = { + resolve: doneList, + reject: failList, + notify: progressList }, - pipe: function( fnDone, fnFail, fnProgress ) { - return jQuery.Deferred(function( newDefer ) { - jQuery.each( { - done: [ fnDone, "resolve" ], - fail: [ fnFail, "reject" ], - progress: [ fnProgress, "notify" ] - }, function( handler, data ) { - var fn = data[ 0 ], - action = data[ 1 ], - returned; - if ( jQuery.isFunction( fn ) ) { - deferred[ handler ](function() { - returned = fn.apply( this, arguments ); - if ( returned && jQuery.isFunction( returned.promise ) ) { - returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify ); - } else { - newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] ); - } - }); - } else { - deferred[ handler ]( newDefer[ action ] ); + promise = { + done: doneList.add, + fail: failList.add, + progress: progressList.add, + + state: function () { + return state; + }, + + // Deprecated + isResolved: doneList.fired, + isRejected: failList.fired, + + then: function (doneCallbacks, failCallbacks, progressCallbacks) { + deferred.done(doneCallbacks).fail(failCallbacks).progress(progressCallbacks); + return this; + }, + always: function () { + deferred.done.apply(deferred, arguments).fail.apply(deferred, arguments); + return this; + }, + pipe: function (fnDone, fnFail, fnProgress) { + return jQuery.Deferred(function (newDefer) { + jQuery.each({ + done: [fnDone, "resolve"], + fail: [fnFail, "reject"], + progress: [fnProgress, "notify"] + }, function (handler, data) { + var fn = data[0], + action = data[1], + returned; + if (jQuery.isFunction(fn)) { + deferred[handler](function () { + returned = fn.apply(this, arguments); + if (returned && jQuery.isFunction(returned.promise)) { + returned.promise().then(newDefer.resolve, newDefer.reject, newDefer.notify); + } else { + newDefer[action + "With"](this === deferred ? newDefer : this, [returned]); + } + }); + } else { + deferred[handler](newDefer[action]); + } + }); + }).promise(); + }, + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function (obj) { + if (obj == null) { + obj = promise; + } else { + for (var key in promise) { + obj[key] = promise[key]; } - }); - }).promise(); - }, - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - if ( obj == null ) { - obj = promise; - } else { - for ( var key in promise ) { - obj[ key ] = promise[ key ]; } + return obj; } - return obj; - } - }, - deferred = promise.promise({}), - key; + }, + deferred = promise.promise({}), + key; - for ( key in lists ) { - deferred[ key ] = lists[ key ].fire; - deferred[ key + "With" ] = lists[ key ].fireWith; - } + for (key in lists) { + deferred[key] = lists[key].fire; + deferred[key + "With"] = lists[key].fireWith; + } - // Handle state - deferred.done( function() { - state = "resolved"; - }, failList.disable, progressList.lock ).fail( function() { - state = "rejected"; - }, doneList.disable, progressList.lock ); + // Handle state + deferred.done(function () { + state = "resolved"; + }, failList.disable, progressList.lock).fail(function () { + state = "rejected"; + }, doneList.disable, progressList.lock); - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } + // Call given func if any + if (func) { + func.call(deferred, deferred); + } - // All done! - return deferred; - }, + // All done! + return deferred; + }, - // Deferred helper - when: function( firstParam ) { - var args = sliceDeferred.call( arguments, 0 ), - i = 0, - length = args.length, - pValues = new Array( length ), - count = length, - pCount = length, - deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ? - firstParam : - jQuery.Deferred(), - promise = deferred.promise(); - function resolveFunc( i ) { - return function( value ) { - args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; - if ( !( --count ) ) { - deferred.resolveWith( deferred, args ); + // Deferred helper + when: function (firstParam) { + var args = sliceDeferred.call(arguments, 0), + i = 0, + length = args.length, + pValues = new Array(length), + count = length, + pCount = length, + deferred = length <= 1 && firstParam && jQuery.isFunction(firstParam.promise) ? + firstParam : + jQuery.Deferred(), + promise = deferred.promise(); + + function resolveFunc(i) { + return function (value) { + args[i] = arguments.length > 1 ? sliceDeferred.call(arguments, 0) : value; + if (!(--count)) { + deferred.resolveWith(deferred, args); + } + }; + } + + function progressFunc(i) { + return function (value) { + pValues[i] = arguments.length > 1 ? sliceDeferred.call(arguments, 0) : value; + deferred.notifyWith(promise, pValues); + }; + } + + if (length > 1) { + for (; i < length; i++) { + if (args[i] && args[i].promise && jQuery.isFunction(args[i].promise)) { + args[i].promise().then(resolveFunc(i), deferred.reject, progressFunc(i)); + } else { + --count; + } } - }; - } - function progressFunc( i ) { - return function( value ) { - pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; - deferred.notifyWith( promise, pValues ); - }; - } - if ( length > 1 ) { - for ( ; i < length; i++ ) { - if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) { - args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) ); - } else { - --count; + if (!count) { + deferred.resolveWith(deferred, args); } + } else if (deferred !== firstParam) { + deferred.resolveWith(deferred, length ? [firstParam] : []); } - if ( !count ) { - deferred.resolveWith( deferred, args ); - } - } else if ( deferred !== firstParam ) { - deferred.resolveWith( deferred, length ? [ firstParam ] : [] ); + return promise; } - return promise; - } -}); - - + }); -jQuery.support = (function() { + jQuery.support = (function () { - var support, - all, - a, - select, - opt, - input, - marginDiv, - fragment, - tds, - events, - eventName, - i, - isSupported, - div = document.createElement( "div" ), - documentElement = document.documentElement; + var support, + all, + a, + select, + opt, + input, + marginDiv, + fragment, + tds, + events, + eventName, + i, + isSupported, + div = document.createElement("div"), + documentElement = document.documentElement; + + // Preliminary tests + div.setAttribute("className", "t"); + div.innerHTML = "
    a"; + + all = div.getElementsByTagName("*"); + a = div.getElementsByTagName("a")[0]; + + // Can't get basic test support + if (!all || !all.length || !a) { + return {}; + } + + // First batch of supports tests + select = document.createElement("select"); + opt = select.appendChild(document.createElement("option")); + input = div.getElementsByTagName("input")[0]; + + support = { + // IE strips leading whitespace when .innerHTML is used + leadingWhitespace: (div.firstChild.nodeType === 3), + + // Make sure that tbody elements aren't automatically inserted + // IE will insert them into empty tables + tbody: !div.getElementsByTagName("tbody").length, + + // Make sure that link elements get serialized correctly by innerHTML + // This requires a wrapper element in IE + htmlSerialize: !!div.getElementsByTagName("link").length, + + // Get the style information from getAttribute + // (IE uses .cssText instead) + style: /top/.test(a.getAttribute("style")), + + // Make sure that URLs aren't manipulated + // (IE normalizes it by default) + hrefNormalized: (a.getAttribute("href") === "/a"), + + // Make sure that element opacity exists + // (IE uses filter instead) + // Use a regex to work around a WebKit issue. See #5145 + opacity: /^0.55/.test(a.style.opacity), + + // Verify style float existence + // (IE uses styleFloat instead of cssFloat) + cssFloat: !!a.style.cssFloat, + + // Make sure that if no value is specified for a checkbox + // that it defaults to "on". + // (WebKit defaults to "" instead) + checkOn: (input.value === "on"), + + // Make sure that a selected-by-default option has a working selected property. + // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) + optSelected: opt.selected, + + // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) + getSetAttribute: div.className !== "t", + + // Tests for enctype support on a form(#6743) + enctype: !!document.createElement("form").enctype, + + // Makes sure cloning an html5 element does not cause problems + // Where outerHTML is undefined, this still works + html5Clone: document.createElement("nav").cloneNode(true).outerHTML !== "<:nav>", + + // Will be defined later + submitBubbles: true, + changeBubbles: true, + focusinBubbles: false, + deleteExpando: true, + noCloneEvent: true, + inlineBlockNeedsLayout: false, + shrinkWrapBlocks: false, + reliableMarginRight: true + }; - // Preliminary tests - div.setAttribute("className", "t"); - div.innerHTML = "
    a"; + // Make sure checked status is properly cloned + input.checked = true; + support.noCloneChecked = input.cloneNode(true).checked; - all = div.getElementsByTagName( "*" ); - a = div.getElementsByTagName( "a" )[ 0 ]; + // Make sure that the options inside disabled selects aren't marked as disabled + // (WebKit marks them as disabled) + select.disabled = true; + support.optDisabled = !opt.disabled; - // Can't get basic test support - if ( !all || !all.length || !a ) { - return {}; - } + // Test to see if it's possible to delete an expando from an element + // Fails in Internet Explorer + try { + delete div.test; + } catch (e) { + support.deleteExpando = false; + } - // First batch of supports tests - select = document.createElement( "select" ); - opt = select.appendChild( document.createElement("option") ); - input = div.getElementsByTagName( "input" )[ 0 ]; - - support = { - // IE strips leading whitespace when .innerHTML is used - leadingWhitespace: ( div.firstChild.nodeType === 3 ), - - // Make sure that tbody elements aren't automatically inserted - // IE will insert them into empty tables - tbody: !div.getElementsByTagName("tbody").length, - - // Make sure that link elements get serialized correctly by innerHTML - // This requires a wrapper element in IE - htmlSerialize: !!div.getElementsByTagName("link").length, - - // Get the style information from getAttribute - // (IE uses .cssText instead) - style: /top/.test( a.getAttribute("style") ), - - // Make sure that URLs aren't manipulated - // (IE normalizes it by default) - hrefNormalized: ( a.getAttribute("href") === "/a" ), - - // Make sure that element opacity exists - // (IE uses filter instead) - // Use a regex to work around a WebKit issue. See #5145 - opacity: /^0.55/.test( a.style.opacity ), - - // Verify style float existence - // (IE uses styleFloat instead of cssFloat) - cssFloat: !!a.style.cssFloat, - - // Make sure that if no value is specified for a checkbox - // that it defaults to "on". - // (WebKit defaults to "" instead) - checkOn: ( input.value === "on" ), - - // Make sure that a selected-by-default option has a working selected property. - // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) - optSelected: opt.selected, - - // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) - getSetAttribute: div.className !== "t", - - // Tests for enctype support on a form(#6743) - enctype: !!document.createElement("form").enctype, - - // Makes sure cloning an html5 element does not cause problems - // Where outerHTML is undefined, this still works - html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav>", - - // Will be defined later - submitBubbles: true, - changeBubbles: true, - focusinBubbles: false, - deleteExpando: true, - noCloneEvent: true, - inlineBlockNeedsLayout: false, - shrinkWrapBlocks: false, - reliableMarginRight: true - }; + if (!div.addEventListener && div.attachEvent && div.fireEvent) { + div.attachEvent("onclick", function () { + // Cloning a node shouldn't copy over any + // bound event handlers (IE does this) + support.noCloneEvent = false; + }); + div.cloneNode(true).fireEvent("onclick"); + } - // Make sure checked status is properly cloned - input.checked = true; - support.noCloneChecked = input.cloneNode( true ).checked; + // Check if a radio maintains its value + // after being appended to the DOM + input = document.createElement("input"); + input.value = "t"; + input.setAttribute("type", "radio"); + support.radioValue = input.value === "t"; - // Make sure that the options inside disabled selects aren't marked as disabled - // (WebKit marks them as disabled) - select.disabled = true; - support.optDisabled = !opt.disabled; + input.setAttribute("checked", "checked"); + div.appendChild(input); + fragment = document.createDocumentFragment(); + fragment.appendChild(div.lastChild); - // Test to see if it's possible to delete an expando from an element - // Fails in Internet Explorer - try { - delete div.test; - } catch( e ) { - support.deleteExpando = false; - } + // WebKit doesn't clone checked state correctly in fragments + support.checkClone = fragment.cloneNode(true).cloneNode(true).lastChild.checked; - if ( !div.addEventListener && div.attachEvent && div.fireEvent ) { - div.attachEvent( "onclick", function() { - // Cloning a node shouldn't copy over any - // bound event handlers (IE does this) - support.noCloneEvent = false; - }); - div.cloneNode( true ).fireEvent( "onclick" ); - } + // Check if a disconnected checkbox will retain its checked + // value of true after appended to the DOM (IE6/7) + support.appendChecked = input.checked; - // Check if a radio maintains its value - // after being appended to the DOM - input = document.createElement("input"); - input.value = "t"; - input.setAttribute("type", "radio"); - support.radioValue = input.value === "t"; - - input.setAttribute("checked", "checked"); - div.appendChild( input ); - fragment = document.createDocumentFragment(); - fragment.appendChild( div.lastChild ); - - // WebKit doesn't clone checked state correctly in fragments - support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Check if a disconnected checkbox will retain its checked - // value of true after appended to the DOM (IE6/7) - support.appendChecked = input.checked; - - fragment.removeChild( input ); - fragment.appendChild( div ); - - div.innerHTML = ""; - - // Check if div with explicit width and no margin-right incorrectly - // gets computed margin-right based on width of container. For more - // info see bug #3333 - // Fails in WebKit before Feb 2011 nightlies - // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right - if ( window.getComputedStyle ) { - marginDiv = document.createElement( "div" ); - marginDiv.style.width = "0"; - marginDiv.style.marginRight = "0"; - div.style.width = "2px"; - div.appendChild( marginDiv ); - support.reliableMarginRight = - ( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0; - } + fragment.removeChild(input); + fragment.appendChild(div); - // Technique from Juriy Zaytsev - // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/ - // We only care about the case where non-standard event systems - // are used, namely in IE. Short-circuiting here helps us to - // avoid an eval call (in setAttribute) which can cause CSP - // to go haywire. See: https://developer.mozilla.org/en/Security/CSP - if ( div.attachEvent ) { - for( i in { - submit: 1, - change: 1, - focusin: 1 - }) { - eventName = "on" + i; - isSupported = ( eventName in div ); - if ( !isSupported ) { - div.setAttribute( eventName, "return;" ); - isSupported = ( typeof div[ eventName ] === "function" ); - } - support[ i + "Bubbles" ] = isSupported; - } - } + div.innerHTML = ""; - fragment.removeChild( div ); + // Check if div with explicit width and no margin-right incorrectly + // gets computed margin-right based on width of container. For more + // info see bug #3333 + // Fails in WebKit before Feb 2011 nightlies + // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right + if (window.getComputedStyle) { + marginDiv = document.createElement("div"); + marginDiv.style.width = "0"; + marginDiv.style.marginRight = "0"; + div.style.width = "2px"; + div.appendChild(marginDiv); + support.reliableMarginRight = + (parseInt((window.getComputedStyle(marginDiv, null) || {marginRight: 0}).marginRight, 10) || 0) === 0; + } + + // Technique from Juriy Zaytsev + // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/ + // We only care about the case where non-standard event systems + // are used, namely in IE. Short-circuiting here helps us to + // avoid an eval call (in setAttribute) which can cause CSP + // to go haywire. See: https://developer.mozilla.org/en/Security/CSP + if (div.attachEvent) { + for (i in { + submit: 1, + change: 1, + focusin: 1 + }) { + eventName = "on" + i; + isSupported = (eventName in div); + if (!isSupported) { + div.setAttribute(eventName, "return;"); + isSupported = (typeof div[eventName] === "function"); + } + support[i + "Bubbles"] = isSupported; + } + } + + fragment.removeChild(div); + + // Null elements to avoid leaks in IE + fragment = select = opt = marginDiv = div = input = null; + + // Run tests that need a body at doc ready + jQuery(function () { + var container, outer, inner, table, td, offsetSupport, + conMarginTop, ptlm, vb, style, html, + body = document.getElementsByTagName("body")[0]; + + if (!body) { + // Return for frameset docs that don't have a body + return; + } - // Null elements to avoid leaks in IE - fragment = select = opt = marginDiv = div = input = null; + conMarginTop = 1; + ptlm = "position:absolute;top:0;left:0;width:1px;height:1px;margin:0;"; + vb = "visibility:hidden;border:0;"; + style = "style='" + ptlm + "border:5px solid #000;padding:0;'"; + html = "
    " + + "" + + "
    "; + + container = document.createElement("div"); + container.style.cssText = vb + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px"; + body.insertBefore(container, body.firstChild); + + // Construct the test element + div = document.createElement("div"); + container.appendChild(div); + + // Check if table cells still have offsetWidth/Height when they are set + // to display:none and there are still other visible table cells in a + // table row; if so, offsetWidth/Height are not reliable for use when + // determining if an element has been hidden directly using + // display:none (it is still safe to use offsets if a parent element is + // hidden; don safety goggles and see bug #4512 for more information). + // (only IE 8 fails this test) + div.innerHTML = "
    t
    "; + tds = div.getElementsByTagName("td"); + isSupported = (tds[0].offsetHeight === 0); + + tds[0].style.display = ""; + tds[1].style.display = "none"; + + // Check if empty table cells still have offsetWidth/Height + // (IE <= 8 fail this test) + support.reliableHiddenOffsets = isSupported && (tds[0].offsetHeight === 0); + + // Figure out if the W3C box model works as expected + div.innerHTML = ""; + div.style.width = div.style.paddingLeft = "1px"; + jQuery.boxModel = support.boxModel = div.offsetWidth === 2; + + if (typeof div.style.zoom !== "undefined") { + // Check if natively block-level elements act like inline-block + // elements when setting their display to 'inline' and giving + // them layout + // (IE < 8 does this) + div.style.display = "inline"; + div.style.zoom = 1; + support.inlineBlockNeedsLayout = (div.offsetWidth === 2); + + // Check if elements with layout shrink-wrap their children + // (IE 6 does this) + div.style.display = ""; + div.innerHTML = "
    "; + support.shrinkWrapBlocks = (div.offsetWidth !== 2); + } + + div.style.cssText = ptlm + vb; + div.innerHTML = html; + + outer = div.firstChild; + inner = outer.firstChild; + td = outer.nextSibling.firstChild.firstChild; + + offsetSupport = { + doesNotAddBorder: (inner.offsetTop !== 5), + doesAddBorderForTableAndCells: (td.offsetTop === 5) + }; - // Run tests that need a body at doc ready - jQuery(function() { - var container, outer, inner, table, td, offsetSupport, - conMarginTop, ptlm, vb, style, html, - body = document.getElementsByTagName("body")[0]; + inner.style.position = "fixed"; + inner.style.top = "20px"; - if ( !body ) { - // Return for frameset docs that don't have a body - return; - } + // safari subtracts parent border width here which is 5px + offsetSupport.fixedPosition = (inner.offsetTop === 20 || inner.offsetTop === 15); + inner.style.position = inner.style.top = ""; - conMarginTop = 1; - ptlm = "position:absolute;top:0;left:0;width:1px;height:1px;margin:0;"; - vb = "visibility:hidden;border:0;"; - style = "style='" + ptlm + "border:5px solid #000;padding:0;'"; - html = "
    " + - "" + - "
    "; - - container = document.createElement("div"); - container.style.cssText = vb + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px"; - body.insertBefore( container, body.firstChild ); - - // Construct the test element - div = document.createElement("div"); - container.appendChild( div ); - - // Check if table cells still have offsetWidth/Height when they are set - // to display:none and there are still other visible table cells in a - // table row; if so, offsetWidth/Height are not reliable for use when - // determining if an element has been hidden directly using - // display:none (it is still safe to use offsets if a parent element is - // hidden; don safety goggles and see bug #4512 for more information). - // (only IE 8 fails this test) - div.innerHTML = "
    t
    "; - tds = div.getElementsByTagName( "td" ); - isSupported = ( tds[ 0 ].offsetHeight === 0 ); - - tds[ 0 ].style.display = ""; - tds[ 1 ].style.display = "none"; - - // Check if empty table cells still have offsetWidth/Height - // (IE <= 8 fail this test) - support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 ); - - // Figure out if the W3C box model works as expected - div.innerHTML = ""; - div.style.width = div.style.paddingLeft = "1px"; - jQuery.boxModel = support.boxModel = div.offsetWidth === 2; - - if ( typeof div.style.zoom !== "undefined" ) { - // Check if natively block-level elements act like inline-block - // elements when setting their display to 'inline' and giving - // them layout - // (IE < 8 does this) - div.style.display = "inline"; - div.style.zoom = 1; - support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 ); - - // Check if elements with layout shrink-wrap their children - // (IE 6 does this) - div.style.display = ""; - div.innerHTML = "
    "; - support.shrinkWrapBlocks = ( div.offsetWidth !== 2 ); - } + outer.style.overflow = "hidden"; + outer.style.position = "relative"; - div.style.cssText = ptlm + vb; - div.innerHTML = html; + offsetSupport.subtractsBorderForOverflowNotVisible = (inner.offsetTop === -5); + offsetSupport.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== conMarginTop); - outer = div.firstChild; - inner = outer.firstChild; - td = outer.nextSibling.firstChild.firstChild; + body.removeChild(container); + div = container = null; - offsetSupport = { - doesNotAddBorder: ( inner.offsetTop !== 5 ), - doesAddBorderForTableAndCells: ( td.offsetTop === 5 ) - }; + jQuery.extend(support, offsetSupport); + }); - inner.style.position = "fixed"; - inner.style.top = "20px"; + return support; + })(); - // safari subtracts parent border width here which is 5px - offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 ); - inner.style.position = inner.style.top = ""; - outer.style.overflow = "hidden"; - outer.style.position = "relative"; + var rbrace = /^(?:\{.*\}|\[.*\])$/, + rmultiDash = /([A-Z])/g; - offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 ); - offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop ); + jQuery.extend({ + cache: {}, - body.removeChild( container ); - div = container = null; + // Please use with caution + uuid: 0, - jQuery.extend( support, offsetSupport ); - }); + // Unique for each copy of jQuery on the page + // Non-digits removed to match rinlinejQuery + expando: "jQuery" + (jQuery.fn.jquery + Math.random()).replace(/\D/g, ""), - return support; -})(); + // The following elements throw uncatchable exceptions if you + // attempt to add expando properties to them. + noData: { + "embed": true, + // Ban all objects except for Flash (which handle expandos) + "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", + "applet": true + }, + hasData: function (elem) { + elem = elem.nodeType ? jQuery.cache[elem[jQuery.expando]] : elem[jQuery.expando]; + return !!elem && !isEmptyDataObject(elem); + }, + data: function (elem, name, data, pvt /* Internal Use Only */) { + if (!jQuery.acceptData(elem)) { + return; + } + var privateCache, thisCache, ret, + internalKey = jQuery.expando, + getByName = typeof name === "string", -var rbrace = /^(?:\{.*\}|\[.*\])$/, - rmultiDash = /([A-Z])/g; + // We have to handle DOM nodes and JS objects differently because IE6-7 + // can't GC object references properly across the DOM-JS boundary + isNode = elem.nodeType, -jQuery.extend({ - cache: {}, + // Only DOM nodes need the global jQuery cache; JS object data is + // attached directly to the object so GC can occur automatically + cache = isNode ? jQuery.cache : elem, - // Please use with caution - uuid: 0, + // Only defining an ID for JS objects if its cache already exists allows + // the code to shortcut on the same path as a DOM node with no cache + id = isNode ? elem[internalKey] : elem[internalKey] && internalKey, + isEvents = name === "events"; - // Unique for each copy of jQuery on the page - // Non-digits removed to match rinlinejQuery - expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ), + // Avoid doing any more work than we need to when trying to get data on an + // object that has no data at all + if ((!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined) { + return; + } - // The following elements throw uncatchable exceptions if you - // attempt to add expando properties to them. - noData: { - "embed": true, - // Ban all objects except for Flash (which handle expandos) - "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", - "applet": true - }, + if (!id) { + // Only DOM nodes need a new unique ID for each element since their data + // ends up in the global cache + if (isNode) { + elem[internalKey] = id = ++jQuery.uuid; + } else { + id = internalKey; + } + } - hasData: function( elem ) { - elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; - return !!elem && !isEmptyDataObject( elem ); - }, + if (!cache[id]) { + cache[id] = {}; - data: function( elem, name, data, pvt /* Internal Use Only */ ) { - if ( !jQuery.acceptData( elem ) ) { - return; - } + // Avoids exposing jQuery metadata on plain JS objects when the object + // is serialized using JSON.stringify + if (!isNode) { + cache[id].toJSON = jQuery.noop; + } + } - var privateCache, thisCache, ret, - internalKey = jQuery.expando, - getByName = typeof name === "string", + // An object can be passed to jQuery.data instead of a key/value pair; this gets + // shallow copied over onto the existing cache + if (typeof name === "object" || typeof name === "function") { + if (pvt) { + cache[id] = jQuery.extend(cache[id], name); + } else { + cache[id].data = jQuery.extend(cache[id].data, name); + } + } - // We have to handle DOM nodes and JS objects differently because IE6-7 - // can't GC object references properly across the DOM-JS boundary - isNode = elem.nodeType, + privateCache = thisCache = cache[id]; - // Only DOM nodes need the global jQuery cache; JS object data is - // attached directly to the object so GC can occur automatically - cache = isNode ? jQuery.cache : elem, + // jQuery data() is stored in a separate object inside the object's internal data + // cache in order to avoid key collisions between internal data and user-defined + // data. + if (!pvt) { + if (!thisCache.data) { + thisCache.data = {}; + } - // Only defining an ID for JS objects if its cache already exists allows - // the code to shortcut on the same path as a DOM node with no cache - id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey, - isEvents = name === "events"; + thisCache = thisCache.data; + } - // Avoid doing any more work than we need to when trying to get data on an - // object that has no data at all - if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) { - return; - } + if (data !== undefined) { + thisCache[jQuery.camelCase(name)] = data; + } - if ( !id ) { - // Only DOM nodes need a new unique ID for each element since their data - // ends up in the global cache - if ( isNode ) { - elem[ internalKey ] = id = ++jQuery.uuid; - } else { - id = internalKey; + // Users should not attempt to inspect the internal events object using jQuery.data, + // it is undocumented and subject to change. But does anyone listen? No. + if (isEvents && !thisCache[name]) { + return privateCache.events; } - } - if ( !cache[ id ] ) { - cache[ id ] = {}; + // Check for both converted-to-camel and non-converted data property names + // If a data property was specified + if (getByName) { - // Avoids exposing jQuery metadata on plain JS objects when the object - // is serialized using JSON.stringify - if ( !isNode ) { - cache[ id ].toJSON = jQuery.noop; - } - } + // First Try to find as-is property data + ret = thisCache[name]; + + // Test for null|undefined property data + if (ret == null) { - // An object can be passed to jQuery.data instead of a key/value pair; this gets - // shallow copied over onto the existing cache - if ( typeof name === "object" || typeof name === "function" ) { - if ( pvt ) { - cache[ id ] = jQuery.extend( cache[ id ], name ); + // Try to find the camelCased property + ret = thisCache[jQuery.camelCase(name)]; + } } else { - cache[ id ].data = jQuery.extend( cache[ id ].data, name ); + ret = thisCache; } - } - privateCache = thisCache = cache[ id ]; + return ret; + }, - // jQuery data() is stored in a separate object inside the object's internal data - // cache in order to avoid key collisions between internal data and user-defined - // data. - if ( !pvt ) { - if ( !thisCache.data ) { - thisCache.data = {}; + removeData: function (elem, name, pvt /* Internal Use Only */) { + if (!jQuery.acceptData(elem)) { + return; } - thisCache = thisCache.data; - } - - if ( data !== undefined ) { - thisCache[ jQuery.camelCase( name ) ] = data; - } + var thisCache, i, l, - // Users should not attempt to inspect the internal events object using jQuery.data, - // it is undocumented and subject to change. But does anyone listen? No. - if ( isEvents && !thisCache[ name ] ) { - return privateCache.events; - } + // Reference to internal data cache key + internalKey = jQuery.expando, - // Check for both converted-to-camel and non-converted data property names - // If a data property was specified - if ( getByName ) { + isNode = elem.nodeType, - // First Try to find as-is property data - ret = thisCache[ name ]; + // See jQuery.data for more information + cache = isNode ? jQuery.cache : elem, - // Test for null|undefined property data - if ( ret == null ) { + // See jQuery.data for more information + id = isNode ? elem[internalKey] : internalKey; - // Try to find the camelCased property - ret = thisCache[ jQuery.camelCase( name ) ]; + // If there is already no cache entry for this object, there is no + // purpose in continuing + if (!cache[id]) { + return; } - } else { - ret = thisCache; - } - return ret; - }, + if (name) { - removeData: function( elem, name, pvt /* Internal Use Only */ ) { - if ( !jQuery.acceptData( elem ) ) { - return; - } + thisCache = pvt ? cache[id] : cache[id].data; - var thisCache, i, l, + if (thisCache) { - // Reference to internal data cache key - internalKey = jQuery.expando, + // Support array or space separated string names for data keys + if (!jQuery.isArray(name)) { - isNode = elem.nodeType, + // try the string as a key before any manipulation + if (name in thisCache) { + name = [name]; + } else { - // See jQuery.data for more information - cache = isNode ? jQuery.cache : elem, + // split the camel cased version by spaces unless a key with the spaces exists + name = jQuery.camelCase(name); + if (name in thisCache) { + name = [name]; + } else { + name = name.split(" "); + } + } + } - // See jQuery.data for more information - id = isNode ? elem[ internalKey ] : internalKey; - - // If there is already no cache entry for this object, there is no - // purpose in continuing - if ( !cache[ id ] ) { - return; - } - - if ( name ) { - - thisCache = pvt ? cache[ id ] : cache[ id ].data; - - if ( thisCache ) { - - // Support array or space separated string names for data keys - if ( !jQuery.isArray( name ) ) { - - // try the string as a key before any manipulation - if ( name in thisCache ) { - name = [ name ]; - } else { + for (i = 0, l = name.length; i < l; i++) { + delete thisCache[name[i]]; + } - // split the camel cased version by spaces unless a key with the spaces exists - name = jQuery.camelCase( name ); - if ( name in thisCache ) { - name = [ name ]; - } else { - name = name.split( " " ); - } + // If there is no data left in the cache, we want to continue + // and let the cache object itself get destroyed + if (!(pvt ? isEmptyDataObject : jQuery.isEmptyObject)(thisCache)) { + return; } } + } - for ( i = 0, l = name.length; i < l; i++ ) { - delete thisCache[ name[i] ]; - } + // See jQuery.data for more information + if (!pvt) { + delete cache[id].data; - // If there is no data left in the cache, we want to continue - // and let the cache object itself get destroyed - if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) { + // Don't destroy the parent cache unless the internal data object + // had been the only thing left in it + if (!isEmptyDataObject(cache[id])) { return; } } - } - - // See jQuery.data for more information - if ( !pvt ) { - delete cache[ id ].data; - - // Don't destroy the parent cache unless the internal data object - // had been the only thing left in it - if ( !isEmptyDataObject(cache[ id ]) ) { - return; - } - } - - // Browsers that fail expando deletion also refuse to delete expandos on - // the window, but it will allow it on all other JS objects; other browsers - // don't care - // Ensure that `cache` is not a window object #10080 - if ( jQuery.support.deleteExpando || !cache.setInterval ) { - delete cache[ id ]; - } else { - cache[ id ] = null; - } - // We destroyed the cache and need to eliminate the expando on the node to avoid - // false lookups in the cache for entries that no longer exist - if ( isNode ) { - // IE does not allow us to delete expando properties from nodes, - // nor does it have a removeAttribute function on Document nodes; - // we must handle all of these cases - if ( jQuery.support.deleteExpando ) { - delete elem[ internalKey ]; - } else if ( elem.removeAttribute ) { - elem.removeAttribute( internalKey ); + // Browsers that fail expando deletion also refuse to delete expandos on + // the window, but it will allow it on all other JS objects; other browsers + // don't care + // Ensure that `cache` is not a window object #10080 + if (jQuery.support.deleteExpando || !cache.setInterval) { + delete cache[id]; } else { - elem[ internalKey ] = null; + cache[id] = null; + } + + // We destroyed the cache and need to eliminate the expando on the node to avoid + // false lookups in the cache for entries that no longer exist + if (isNode) { + // IE does not allow us to delete expando properties from nodes, + // nor does it have a removeAttribute function on Document nodes; + // we must handle all of these cases + if (jQuery.support.deleteExpando) { + delete elem[internalKey]; + } else if (elem.removeAttribute) { + elem.removeAttribute(internalKey); + } else { + elem[internalKey] = null; + } } - } - }, + }, - // For internal use only. - _data: function( elem, name, data ) { - return jQuery.data( elem, name, data, true ); - }, + // For internal use only. + _data: function (elem, name, data) { + return jQuery.data(elem, name, data, true); + }, - // A method for determining if a DOM node can handle the data expando - acceptData: function( elem ) { - if ( elem.nodeName ) { - var match = jQuery.noData[ elem.nodeName.toLowerCase() ]; + // A method for determining if a DOM node can handle the data expando + acceptData: function (elem) { + if (elem.nodeName) { + var match = jQuery.noData[elem.nodeName.toLowerCase()]; - if ( match ) { - return !(match === true || elem.getAttribute("classid") !== match); + if (match) { + return !(match === true || elem.getAttribute("classid") !== match); + } } - } - return true; - } -}); + return true; + } + }); -jQuery.fn.extend({ - data: function( key, value ) { - var parts, attr, name, - data = null; + jQuery.fn.extend({ + data: function (key, value) { + var parts, attr, name, + data = null; - if ( typeof key === "undefined" ) { - if ( this.length ) { - data = jQuery.data( this[0] ); + if (typeof key === "undefined") { + if (this.length) { + data = jQuery.data(this[0]); - if ( this[0].nodeType === 1 && !jQuery._data( this[0], "parsedAttrs" ) ) { - attr = this[0].attributes; - for ( var i = 0, l = attr.length; i < l; i++ ) { - name = attr[i].name; + if (this[0].nodeType === 1 && !jQuery._data(this[0], "parsedAttrs")) { + attr = this[0].attributes; + for (var i = 0, l = attr.length; i < l; i++) { + name = attr[i].name; - if ( name.indexOf( "data-" ) === 0 ) { - name = jQuery.camelCase( name.substring(5) ); + if (name.indexOf("data-") === 0) { + name = jQuery.camelCase(name.substring(5)); - dataAttr( this[0], name, data[ name ] ); + dataAttr(this[0], name, data[name]); + } } + jQuery._data(this[0], "parsedAttrs", true); } - jQuery._data( this[0], "parsedAttrs", true ); } - } - return data; + return data; - } else if ( typeof key === "object" ) { - return this.each(function() { - jQuery.data( this, key ); - }); - } + } else if (typeof key === "object") { + return this.each(function () { + jQuery.data(this, key); + }); + } - parts = key.split("."); - parts[1] = parts[1] ? "." + parts[1] : ""; + parts = key.split("."); + parts[1] = parts[1] ? "." + parts[1] : ""; - if ( value === undefined ) { - data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); + if (value === undefined) { + data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); - // Try to fetch any internally stored data first - if ( data === undefined && this.length ) { - data = jQuery.data( this[0], key ); - data = dataAttr( this[0], key, data ); - } + // Try to fetch any internally stored data first + if (data === undefined && this.length) { + data = jQuery.data(this[0], key); + data = dataAttr(this[0], key, data); + } - return data === undefined && parts[1] ? - this.data( parts[0] ) : - data; + return data === undefined && parts[1] ? + this.data(parts[0]) : + data; - } else { - return this.each(function() { - var self = jQuery( this ), - args = [ parts[0], value ]; + } else { + return this.each(function () { + var self = jQuery(this), + args = [parts[0], value]; - self.triggerHandler( "setData" + parts[1] + "!", args ); - jQuery.data( this, key, value ); - self.triggerHandler( "changeData" + parts[1] + "!", args ); + self.triggerHandler("setData" + parts[1] + "!", args); + jQuery.data(this, key, value); + self.triggerHandler("changeData" + parts[1] + "!", args); + }); + } + }, + + removeData: function (key) { + return this.each(function () { + jQuery.removeData(this, key); }); } - }, - - removeData: function( key ) { - return this.each(function() { - jQuery.removeData( this, key ); - }); - } -}); + }); -function dataAttr( elem, key, data ) { - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { + function dataAttr(elem, key, data) { + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if (data === undefined && elem.nodeType === 1) { - var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); + var name = "data-" + key.replace(rmultiDash, "-$1").toLowerCase(); - data = elem.getAttribute( name ); + data = elem.getAttribute(name); - if ( typeof data === "string" ) { - try { - data = data === "true" ? true : - data === "false" ? false : - data === "null" ? null : - jQuery.isNumeric( data ) ? parseFloat( data ) : - rbrace.test( data ) ? jQuery.parseJSON( data ) : - data; - } catch( e ) {} + if (typeof data === "string") { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + jQuery.isNumeric(data) ? parseFloat(data) : + rbrace.test(data) ? jQuery.parseJSON(data) : + data; + } catch (e) { + } - // Make sure we set the data so it isn't changed later - jQuery.data( elem, key, data ); + // Make sure we set the data so it isn't changed later + jQuery.data(elem, key, data); - } else { - data = undefined; + } else { + data = undefined; + } } - } - return data; -} + return data; + } // checks a cache object for emptiness -function isEmptyDataObject( obj ) { - for ( var name in obj ) { + function isEmptyDataObject(obj) { + for (var name in obj) { - // if the public data object is empty, the private is still empty - if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) { - continue; - } - if ( name !== "toJSON" ) { - return false; + // if the public data object is empty, the private is still empty + if (name === "data" && jQuery.isEmptyObject(obj[name])) { + continue; + } + if (name !== "toJSON") { + return false; + } } - } - return true; -} + return true; + } + function handleQueueMarkDefer(elem, type, src) { + var deferDataKey = type + "defer", + queueDataKey = type + "queue", + markDataKey = type + "mark", + defer = jQuery._data(elem, deferDataKey); + if (defer && + (src === "queue" || !jQuery._data(elem, queueDataKey)) && + (src === "mark" || !jQuery._data(elem, markDataKey))) { + // Give room for hard-coded callbacks to fire first + // and eventually mark/queue something else on the element + setTimeout(function () { + if (!jQuery._data(elem, queueDataKey) && + !jQuery._data(elem, markDataKey)) { + jQuery.removeData(elem, deferDataKey, true); + defer.fire(); + } + }, 0); + } + } + jQuery.extend({ -function handleQueueMarkDefer( elem, type, src ) { - var deferDataKey = type + "defer", - queueDataKey = type + "queue", - markDataKey = type + "mark", - defer = jQuery._data( elem, deferDataKey ); - if ( defer && - ( src === "queue" || !jQuery._data(elem, queueDataKey) ) && - ( src === "mark" || !jQuery._data(elem, markDataKey) ) ) { - // Give room for hard-coded callbacks to fire first - // and eventually mark/queue something else on the element - setTimeout( function() { - if ( !jQuery._data( elem, queueDataKey ) && - !jQuery._data( elem, markDataKey ) ) { - jQuery.removeData( elem, deferDataKey, true ); - defer.fire(); + _mark: function (elem, type) { + if (elem) { + type = (type || "fx") + "mark"; + jQuery._data(elem, type, (jQuery._data(elem, type) || 0) + 1); } - }, 0 ); - } -} + }, -jQuery.extend({ + _unmark: function (force, elem, type) { + if (force !== true) { + type = elem; + elem = force; + force = false; + } + if (elem) { + type = type || "fx"; + var key = type + "mark", + count = force ? 0 : ((jQuery._data(elem, key) || 1) - 1); + if (count) { + jQuery._data(elem, key, count); + } else { + jQuery.removeData(elem, key, true); + handleQueueMarkDefer(elem, type, "mark"); + } + } + }, - _mark: function( elem, type ) { - if ( elem ) { - type = ( type || "fx" ) + "mark"; - jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 ); - } - }, + queue: function (elem, type, data) { + var q; + if (elem) { + type = (type || "fx") + "queue"; + q = jQuery._data(elem, type); - _unmark: function( force, elem, type ) { - if ( force !== true ) { - type = elem; - elem = force; - force = false; - } - if ( elem ) { - type = type || "fx"; - var key = type + "mark", - count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 ); - if ( count ) { - jQuery._data( elem, key, count ); - } else { - jQuery.removeData( elem, key, true ); - handleQueueMarkDefer( elem, type, "mark" ); - } - } - }, - - queue: function( elem, type, data ) { - var q; - if ( elem ) { - type = ( type || "fx" ) + "queue"; - q = jQuery._data( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !q || jQuery.isArray(data) ) { - q = jQuery._data( elem, type, jQuery.makeArray(data) ); - } else { - q.push( data ); + // Speed up dequeue by getting out quickly if this is just a lookup + if (data) { + if (!q || jQuery.isArray(data)) { + q = jQuery._data(elem, type, jQuery.makeArray(data)); + } else { + q.push(data); + } } + return q || []; } - return q || []; - } - }, + }, - dequeue: function( elem, type ) { - type = type || "fx"; + dequeue: function (elem, type) { + type = type || "fx"; - var queue = jQuery.queue( elem, type ), - fn = queue.shift(), - hooks = {}; + var queue = jQuery.queue(elem, type), + fn = queue.shift(), + hooks = {}; - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - } + // If the fx queue is dequeued, always remove the progress sentinel + if (fn === "inprogress") { + fn = queue.shift(); + } + + if (fn) { + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if (type === "fx") { + queue.unshift("inprogress"); + } - if ( fn ) { - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift( "inprogress" ); + jQuery._data(elem, type + ".run", hooks); + fn.call(elem, function () { + jQuery.dequeue(elem, type); + }, hooks); } - jQuery._data( elem, type + ".run", hooks ); - fn.call( elem, function() { - jQuery.dequeue( elem, type ); - }, hooks ); + if (!queue.length) { + jQuery.removeData(elem, type + "queue " + type + ".run", true); + handleQueueMarkDefer(elem, type, "queue"); + } } + }); - if ( !queue.length ) { - jQuery.removeData( elem, type + "queue " + type + ".run", true ); - handleQueueMarkDefer( elem, type, "queue" ); - } - } -}); + jQuery.fn.extend({ + queue: function (type, data) { + if (typeof type !== "string") { + data = type; + type = "fx"; + } -jQuery.fn.extend({ - queue: function( type, data ) { - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - } + if (data === undefined) { + return jQuery.queue(this[0], type); + } + return this.each(function () { + var queue = jQuery.queue(this, type, data); - if ( data === undefined ) { - return jQuery.queue( this[0], type ); - } - return this.each(function() { - var queue = jQuery.queue( this, type, data ); + if (type === "fx" && queue[0] !== "inprogress") { + jQuery.dequeue(this, type); + } + }); + }, + dequeue: function (type) { + return this.each(function () { + jQuery.dequeue(this, type); + }); + }, + // Based off of the plugin by Clint Helfers, with permission. + // http://blindsignals.com/index.php/2009/07/jquery-delay/ + delay: function (time, type) { + time = jQuery.fx ? jQuery.fx.speeds[time] || time : time; + type = type || "fx"; - if ( type === "fx" && queue[0] !== "inprogress" ) { - jQuery.dequeue( this, type ); + return this.queue(type, function (next, hooks) { + var timeout = setTimeout(next, time); + hooks.stop = function () { + clearTimeout(timeout); + }; + }); + }, + clearQueue: function (type) { + return this.queue(type || "fx", []); + }, + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function (type, object) { + if (typeof type !== "string") { + object = type; + type = undefined; } - }); - }, - dequeue: function( type ) { - return this.each(function() { - jQuery.dequeue( this, type ); - }); - }, - // Based off of the plugin by Clint Helfers, with permission. - // http://blindsignals.com/index.php/2009/07/jquery-delay/ - delay: function( time, type ) { - time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; - type = type || "fx"; - - return this.queue( type, function( next, hooks ) { - var timeout = setTimeout( next, time ); - hooks.stop = function() { - clearTimeout( timeout ); - }; - }); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, object ) { - if ( typeof type !== "string" ) { - object = type; - type = undefined; - } - type = type || "fx"; - var defer = jQuery.Deferred(), - elements = this, - i = elements.length, - count = 1, - deferDataKey = type + "defer", - queueDataKey = type + "queue", - markDataKey = type + "mark", - tmp; - function resolve() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); + type = type || "fx"; + var defer = jQuery.Deferred(), + elements = this, + i = elements.length, + count = 1, + deferDataKey = type + "defer", + queueDataKey = type + "queue", + markDataKey = type + "mark", + tmp; + + function resolve() { + if (!(--count)) { + defer.resolveWith(elements, [elements]); + } } - } - while( i-- ) { - if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) || - ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) || - jQuery.data( elements[ i ], markDataKey, undefined, true ) ) && - jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) { - count++; - tmp.add( resolve ); + + while (i--) { + if ((tmp = jQuery.data(elements[i], deferDataKey, undefined, true) || + (jQuery.data(elements[i], queueDataKey, undefined, true) || + jQuery.data(elements[i], markDataKey, undefined, true)) && + jQuery.data(elements[i], deferDataKey, jQuery.Callbacks("once memory"), true))) { + count++; + tmp.add(resolve); + } } + resolve(); + return defer.promise(); } - resolve(); - return defer.promise(); - } -}); - - + }); -var rclass = /[\n\t\r]/g, - rspace = /\s+/, - rreturn = /\r/g, - rtype = /^(?:button|input)$/i, - rfocusable = /^(?:button|input|object|select|textarea)$/i, - rclickable = /^a(?:rea)?$/i, - rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i, - getSetAttribute = jQuery.support.getSetAttribute, - nodeHook, boolHook, fixSpecified; + var rclass = /[\n\t\r]/g, + rspace = /\s+/, + rreturn = /\r/g, + rtype = /^(?:button|input)$/i, + rfocusable = /^(?:button|input|object|select|textarea)$/i, + rclickable = /^a(?:rea)?$/i, + rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i, + getSetAttribute = jQuery.support.getSetAttribute, + nodeHook, boolHook, fixSpecified; -jQuery.fn.extend({ - attr: function( name, value ) { - return jQuery.access( this, name, value, true, jQuery.attr ); - }, + jQuery.fn.extend({ + attr: function (name, value) { + return jQuery.access(this, name, value, true, jQuery.attr); + }, - removeAttr: function( name ) { - return this.each(function() { - jQuery.removeAttr( this, name ); - }); - }, + removeAttr: function (name) { + return this.each(function () { + jQuery.removeAttr(this, name); + }); + }, - prop: function( name, value ) { - return jQuery.access( this, name, value, true, jQuery.prop ); - }, + prop: function (name, value) { + return jQuery.access(this, name, value, true, jQuery.prop); + }, - removeProp: function( name ) { - name = jQuery.propFix[ name ] || name; - return this.each(function() { - // try/catch handles cases where IE balks (such as removing a property on window) - try { - this[ name ] = undefined; - delete this[ name ]; - } catch( e ) {} - }); - }, + removeProp: function (name) { + name = jQuery.propFix[name] || name; + return this.each(function () { + // try/catch handles cases where IE balks (such as removing a property on window) + try { + this[name] = undefined; + delete this[name]; + } catch (e) { + } + }); + }, - addClass: function( value ) { - var classNames, i, l, elem, - setClass, c, cl; + addClass: function (value) { + var classNames, i, l, elem, + setClass, c, cl; - if ( jQuery.isFunction( value ) ) { - return this.each(function( j ) { - jQuery( this ).addClass( value.call(this, j, this.className) ); - }); - } + if (jQuery.isFunction(value)) { + return this.each(function (j) { + jQuery(this).addClass(value.call(this, j, this.className)); + }); + } - if ( value && typeof value === "string" ) { - classNames = value.split( rspace ); + if (value && typeof value === "string") { + classNames = value.split(rspace); - for ( i = 0, l = this.length; i < l; i++ ) { - elem = this[ i ]; + for (i = 0, l = this.length; i < l; i++) { + elem = this[i]; - if ( elem.nodeType === 1 ) { - if ( !elem.className && classNames.length === 1 ) { - elem.className = value; + if (elem.nodeType === 1) { + if (!elem.className && classNames.length === 1) { + elem.className = value; - } else { - setClass = " " + elem.className + " "; + } else { + setClass = " " + elem.className + " "; - for ( c = 0, cl = classNames.length; c < cl; c++ ) { - if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) { - setClass += classNames[ c ] + " "; + for (c = 0, cl = classNames.length; c < cl; c++) { + if (!~setClass.indexOf(" " + classNames[c] + " ")) { + setClass += classNames[c] + " "; + } } + elem.className = jQuery.trim(setClass); } - elem.className = jQuery.trim( setClass ); } } } - } - return this; - }, + return this; + }, - removeClass: function( value ) { - var classNames, i, l, elem, className, c, cl; + removeClass: function (value) { + var classNames, i, l, elem, className, c, cl; - if ( jQuery.isFunction( value ) ) { - return this.each(function( j ) { - jQuery( this ).removeClass( value.call(this, j, this.className) ); - }); - } + if (jQuery.isFunction(value)) { + return this.each(function (j) { + jQuery(this).removeClass(value.call(this, j, this.className)); + }); + } - if ( (value && typeof value === "string") || value === undefined ) { - classNames = ( value || "" ).split( rspace ); + if ((value && typeof value === "string") || value === undefined) { + classNames = (value || "").split(rspace); - for ( i = 0, l = this.length; i < l; i++ ) { - elem = this[ i ]; + for (i = 0, l = this.length; i < l; i++) { + elem = this[i]; - if ( elem.nodeType === 1 && elem.className ) { - if ( value ) { - className = (" " + elem.className + " ").replace( rclass, " " ); - for ( c = 0, cl = classNames.length; c < cl; c++ ) { - className = className.replace(" " + classNames[ c ] + " ", " "); - } - elem.className = jQuery.trim( className ); + if (elem.nodeType === 1 && elem.className) { + if (value) { + className = (" " + elem.className + " ").replace(rclass, " "); + for (c = 0, cl = classNames.length; c < cl; c++) { + className = className.replace(" " + classNames[c] + " ", " "); + } + elem.className = jQuery.trim(className); - } else { - elem.className = ""; + } else { + elem.className = ""; + } } } } - } - return this; - }, + return this; + }, - toggleClass: function( value, stateVal ) { - var type = typeof value, - isBool = typeof stateVal === "boolean"; + toggleClass: function (value, stateVal) { + var type = typeof value, + isBool = typeof stateVal === "boolean"; - if ( jQuery.isFunction( value ) ) { - return this.each(function( i ) { - jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal ); - }); - } + if (jQuery.isFunction(value)) { + return this.each(function (i) { + jQuery(this).toggleClass(value.call(this, i, this.className, stateVal), stateVal); + }); + } - return this.each(function() { - if ( type === "string" ) { - // toggle individual class names - var className, - i = 0, - self = jQuery( this ), - state = stateVal, - classNames = value.split( rspace ); + return this.each(function () { + if (type === "string") { + // toggle individual class names + var className, + i = 0, + self = jQuery(this), + state = stateVal, + classNames = value.split(rspace); - while ( (className = classNames[ i++ ]) ) { - // check each className given, space seperated list - state = isBool ? state : !self.hasClass( className ); - self[ state ? "addClass" : "removeClass" ]( className ); - } + while ((className = classNames[i++])) { + // check each className given, space seperated list + state = isBool ? state : !self.hasClass(className); + self[state ? "addClass" : "removeClass"](className); + } - } else if ( type === "undefined" || type === "boolean" ) { - if ( this.className ) { - // store className if set - jQuery._data( this, "__className__", this.className ); + } else if (type === "undefined" || type === "boolean") { + if (this.className) { + // store className if set + jQuery._data(this, "__className__", this.className); + } + + // toggle whole className + this.className = this.className || value === false ? "" : jQuery._data(this, "__className__") || ""; } + }); + }, - // toggle whole className - this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; + hasClass: function (selector) { + var className = " " + selector + " ", + i = 0, + l = this.length; + for (; i < l; i++) { + if (this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf(className) > -1) { + return true; + } } - }); - }, - hasClass: function( selector ) { - var className = " " + selector + " ", - i = 0, - l = this.length; - for ( ; i < l; i++ ) { - if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) { - return true; - } - } + return false; + }, - return false; - }, + val: function (value) { + var hooks, ret, isFunction, + elem = this[0]; + + if (!arguments.length) { + if (elem) { + hooks = jQuery.valHooks[elem.nodeName.toLowerCase()] || jQuery.valHooks[elem.type]; - val: function( value ) { - var hooks, ret, isFunction, - elem = this[0]; + if (hooks && "get" in hooks && (ret = hooks.get(elem, "value")) !== undefined) { + return ret; + } - if ( !arguments.length ) { - if ( elem ) { - hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ]; + ret = elem.value; - if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { - return ret; + return typeof ret === "string" ? + // handle most util string cases + ret.replace(rreturn, "") : + // handle cases where value is null/undef or number + ret == null ? "" : ret; } - ret = elem.value; - - return typeof ret === "string" ? - // handle most util string cases - ret.replace(rreturn, "") : - // handle cases where value is null/undef or number - ret == null ? "" : ret; + return; } - return; - } + isFunction = jQuery.isFunction(value); - isFunction = jQuery.isFunction( value ); + return this.each(function (i) { + var self = jQuery(this), val; - return this.each(function( i ) { - var self = jQuery(this), val; - - if ( this.nodeType !== 1 ) { - return; - } + if (this.nodeType !== 1) { + return; + } - if ( isFunction ) { - val = value.call( this, i, self.val() ); - } else { - val = value; - } + if (isFunction) { + val = value.call(this, i, self.val()); + } else { + val = value; + } - // Treat null/undefined as ""; convert numbers to string - if ( val == null ) { - val = ""; - } else if ( typeof val === "number" ) { - val += ""; - } else if ( jQuery.isArray( val ) ) { - val = jQuery.map(val, function ( value ) { - return value == null ? "" : value + ""; - }); - } + // Treat null/undefined as ""; convert numbers to string + if (val == null) { + val = ""; + } else if (typeof val === "number") { + val += ""; + } else if (jQuery.isArray(val)) { + val = jQuery.map(val, function (value) { + return value == null ? "" : value + ""; + }); + } - hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ]; + hooks = jQuery.valHooks[this.nodeName.toLowerCase()] || jQuery.valHooks[this.type]; - // If set returns undefined, fall back to normal setting - if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { - this.value = val; - } - }); - } -}); + // If set returns undefined, fall back to normal setting + if (!hooks || !("set" in hooks) || hooks.set(this, val, "value") === undefined) { + this.value = val; + } + }); + } + }); -jQuery.extend({ - valHooks: { - option: { - get: function( elem ) { - // attributes.value is undefined in Blackberry 4.7 but - // uses .value. See #6932 - var val = elem.attributes.value; - return !val || val.specified ? elem.value : elem.text; - } - }, - select: { - get: function( elem ) { - var value, i, max, option, - index = elem.selectedIndex, - values = [], - options = elem.options, - one = elem.type === "select-one"; - - // Nothing was selected - if ( index < 0 ) { - return null; + jQuery.extend({ + valHooks: { + option: { + get: function (elem) { + // attributes.value is undefined in Blackberry 4.7 but + // uses .value. See #6932 + var val = elem.attributes.value; + return !val || val.specified ? elem.value : elem.text; } + }, + select: { + get: function (elem) { + var value, i, max, option, + index = elem.selectedIndex, + values = [], + options = elem.options, + one = elem.type === "select-one"; + + // Nothing was selected + if (index < 0) { + return null; + } - // Loop through all the selected options - i = one ? index : 0; - max = one ? index + 1 : options.length; - for ( ; i < max; i++ ) { - option = options[ i ]; + // Loop through all the selected options + i = one ? index : 0; + max = one ? index + 1 : options.length; + for (; i < max; i++) { + option = options[i]; - // Don't return options that are disabled or in a disabled optgroup - if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && - (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) { + // Don't return options that are disabled or in a disabled optgroup + if (option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && + (!option.parentNode.disabled || !jQuery.nodeName(option.parentNode, "optgroup"))) { - // Get the specific value for the option - value = jQuery( option ).val(); + // Get the specific value for the option + value = jQuery(option).val(); - // We don't need an array for one selects - if ( one ) { - return value; - } + // We don't need an array for one selects + if (one) { + return value; + } - // Multi-Selects return an array - values.push( value ); + // Multi-Selects return an array + values.push(value); + } } - } - // Fixes Bug #2551 -- select.val() broken in IE after form.reset() - if ( one && !values.length && options.length ) { - return jQuery( options[ index ] ).val(); - } + // Fixes Bug #2551 -- select.val() broken in IE after form.reset() + if (one && !values.length && options.length) { + return jQuery(options[index]).val(); + } - return values; - }, + return values; + }, - set: function( elem, value ) { - var values = jQuery.makeArray( value ); + set: function (elem, value) { + var values = jQuery.makeArray(value); - jQuery(elem).find("option").each(function() { - this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; - }); + jQuery(elem).find("option").each(function () { + this.selected = jQuery.inArray(jQuery(this).val(), values) >= 0; + }); - if ( !values.length ) { - elem.selectedIndex = -1; + if (!values.length) { + elem.selectedIndex = -1; + } + return values; } - return values; } - } - }, - - attrFn: { - val: true, - css: true, - html: true, - text: true, - data: true, - width: true, - height: true, - offset: true - }, - - attr: function( elem, name, value, pass ) { - var ret, hooks, notxml, - nType = elem.nodeType; - - // don't get/set attributes on text, comment and attribute nodes - if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - if ( pass && name in jQuery.attrFn ) { - return jQuery( elem )[ name ]( value ); - } - - // Fallback to prop when attributes are not supported - if ( typeof elem.getAttribute === "undefined" ) { - return jQuery.prop( elem, name, value ); - } - - notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); + }, - // All attributes are lowercase - // Grab necessary hook if one is defined - if ( notxml ) { - name = name.toLowerCase(); - hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook ); - } + attrFn: { + val: true, + css: true, + html: true, + text: true, + data: true, + width: true, + height: true, + offset: true + }, - if ( value !== undefined ) { + attr: function (elem, name, value, pass) { + var ret, hooks, notxml, + nType = elem.nodeType; - if ( value === null ) { - jQuery.removeAttr( elem, name ); + // don't get/set attributes on text, comment and attribute nodes + if (!elem || nType === 3 || nType === 8 || nType === 2) { return; + } - } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) { - return ret; - - } else { - elem.setAttribute( name, "" + value ); - return value; + if (pass && name in jQuery.attrFn) { + return jQuery(elem)[name](value); } - } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) { - return ret; + // Fallback to prop when attributes are not supported + if (typeof elem.getAttribute === "undefined") { + return jQuery.prop(elem, name, value); + } - } else { + notxml = nType !== 1 || !jQuery.isXMLDoc(elem); - ret = elem.getAttribute( name ); + // All attributes are lowercase + // Grab necessary hook if one is defined + if (notxml) { + name = name.toLowerCase(); + hooks = jQuery.attrHooks[name] || (rboolean.test(name) ? boolHook : nodeHook); + } - // Non-existent attributes return null, we normalize to undefined - return ret === null ? - undefined : - ret; - } - }, + if (value !== undefined) { - removeAttr: function( elem, value ) { - var propName, attrNames, name, l, - i = 0; + if (value === null) { + jQuery.removeAttr(elem, name); + return; - if ( value && elem.nodeType === 1 ) { - attrNames = value.toLowerCase().split( rspace ); - l = attrNames.length; + } else if (hooks && "set" in hooks && notxml && (ret = hooks.set(elem, value, name)) !== undefined) { + return ret; - for ( ; i < l; i++ ) { - name = attrNames[ i ]; + } else { + elem.setAttribute(name, "" + value); + return value; + } + + } else if (hooks && "get" in hooks && notxml && (ret = hooks.get(elem, name)) !== null) { + return ret; - if ( name ) { - propName = jQuery.propFix[ name ] || name; + } else { - // See #9699 for explanation of this approach (setting first, then removal) - jQuery.attr( elem, name, "" ); - elem.removeAttribute( getSetAttribute ? name : propName ); + ret = elem.getAttribute(name); - // Set corresponding property to false for boolean attributes - if ( rboolean.test( name ) && propName in elem ) { - elem[ propName ] = false; - } - } + // Non-existent attributes return null, we normalize to undefined + return ret === null ? + undefined : + ret; } - } - }, - - attrHooks: { - type: { - set: function( elem, value ) { - // We can't allow the type property to be changed (since it causes problems in IE) - if ( rtype.test( elem.nodeName ) && elem.parentNode ) { - jQuery.error( "type property can't be changed" ); - } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) { - // Setting the type on a radio button after the value resets the value in IE6-9 - // Reset value to it's default in case type is set after value - // This is for element creation - var val = elem.value; - elem.setAttribute( "type", value ); - if ( val ) { - elem.value = val; + }, + + removeAttr: function (elem, value) { + var propName, attrNames, name, l, + i = 0; + + if (value && elem.nodeType === 1) { + attrNames = value.toLowerCase().split(rspace); + l = attrNames.length; + + for (; i < l; i++) { + name = attrNames[i]; + + if (name) { + propName = jQuery.propFix[name] || name; + + // See #9699 for explanation of this approach (setting first, then removal) + jQuery.attr(elem, name, ""); + elem.removeAttribute(getSetAttribute ? name : propName); + + // Set corresponding property to false for boolean attributes + if (rboolean.test(name) && propName in elem) { + elem[propName] = false; + } } - return value; } } }, - // Use the value property for back compat - // Use the nodeHook for button elements in IE6/7 (#1954) - value: { - get: function( elem, name ) { - if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { - return nodeHook.get( elem, name ); - } - return name in elem ? - elem.value : - null; + + attrHooks: { + type: { + set: function (elem, value) { + // We can't allow the type property to be changed (since it causes problems in IE) + if (rtype.test(elem.nodeName) && elem.parentNode) { + jQuery.error("type property can't be changed"); + } else if (!jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input")) { + // Setting the type on a radio button after the value resets the value in IE6-9 + // Reset value to it's default in case type is set after value + // This is for element creation + var val = elem.value; + elem.setAttribute("type", value); + if (val) { + elem.value = val; + } + return value; + } + } }, - set: function( elem, value, name ) { - if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { - return nodeHook.set( elem, value, name ); + // Use the value property for back compat + // Use the nodeHook for button elements in IE6/7 (#1954) + value: { + get: function (elem, name) { + if (nodeHook && jQuery.nodeName(elem, "button")) { + return nodeHook.get(elem, name); + } + return name in elem ? + elem.value : + null; + }, + set: function (elem, value, name) { + if (nodeHook && jQuery.nodeName(elem, "button")) { + return nodeHook.set(elem, value, name); + } + // Does not return so that setAttribute is also used + elem.value = value; } - // Does not return so that setAttribute is also used - elem.value = value; } - } - }, - - propFix: { - tabindex: "tabIndex", - readonly: "readOnly", - "for": "htmlFor", - "class": "className", - maxlength: "maxLength", - cellspacing: "cellSpacing", - cellpadding: "cellPadding", - rowspan: "rowSpan", - colspan: "colSpan", - usemap: "useMap", - frameborder: "frameBorder", - contenteditable: "contentEditable" - }, - - prop: function( elem, name, value ) { - var ret, hooks, notxml, - nType = elem.nodeType; - - // don't get/set properties on text, comment and attribute nodes - if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { - return; - } + }, - notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); + propFix: { + tabindex: "tabIndex", + readonly: "readOnly", + "for": "htmlFor", + "class": "className", + maxlength: "maxLength", + cellspacing: "cellSpacing", + cellpadding: "cellPadding", + rowspan: "rowSpan", + colspan: "colSpan", + usemap: "useMap", + frameborder: "frameBorder", + contenteditable: "contentEditable" + }, - if ( notxml ) { - // Fix name and attach hooks - name = jQuery.propFix[ name ] || name; - hooks = jQuery.propHooks[ name ]; - } + prop: function (elem, name, value) { + var ret, hooks, notxml, + nType = elem.nodeType; - if ( value !== undefined ) { - if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { - return ret; + // don't get/set properties on text, comment and attribute nodes + if (!elem || nType === 3 || nType === 8 || nType === 2) { + return; + } - } else { - return ( elem[ name ] = value ); + notxml = nType !== 1 || !jQuery.isXMLDoc(elem); + + if (notxml) { + // Fix name and attach hooks + name = jQuery.propFix[name] || name; + hooks = jQuery.propHooks[name]; } - } else { - if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { - return ret; + if (value !== undefined) { + if (hooks && "set" in hooks && (ret = hooks.set(elem, value, name)) !== undefined) { + return ret; + + } else { + return (elem[name] = value); + } } else { - return elem[ name ]; - } - } - }, - - propHooks: { - tabIndex: { - get: function( elem ) { - // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set - // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ - var attributeNode = elem.getAttributeNode("tabindex"); - - return attributeNode && attributeNode.specified ? - parseInt( attributeNode.value, 10 ) : - rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? - 0 : - undefined; + if (hooks && "get" in hooks && (ret = hooks.get(elem, name)) !== null) { + return ret; + + } else { + return elem[name]; + } } - } - } -}); + }, -// Add the tabIndex propHook to attrHooks for back-compat (different case is intentional) -jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex; + propHooks: { + tabIndex: { + get: function (elem) { + // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set + // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + var attributeNode = elem.getAttributeNode("tabindex"); -// Hook for boolean attributes -boolHook = { - get: function( elem, name ) { - // Align boolean attributes with corresponding properties - // Fall back to attribute presence where some booleans are not supported - var attrNode, - property = jQuery.prop( elem, name ); - return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ? - name.toLowerCase() : - undefined; - }, - set: function( elem, value, name ) { - var propName; - if ( value === false ) { - // Remove boolean attributes when set to false - jQuery.removeAttr( elem, name ); - } else { - // value is true since we know at this point it's type boolean and not false - // Set boolean attributes to the same name and set the DOM property - propName = jQuery.propFix[ name ] || name; - if ( propName in elem ) { - // Only set the IDL specifically if it already exists on the element - elem[ propName ] = true; + return attributeNode && attributeNode.specified ? + parseInt(attributeNode.value, 10) : + rfocusable.test(elem.nodeName) || rclickable.test(elem.nodeName) && elem.href ? + 0 : + undefined; + } } - - elem.setAttribute( name, name.toLowerCase() ); } - return name; - } -}; - -// IE6/7 do not support getting/setting some attributes with get/setAttribute -if ( !getSetAttribute ) { + }); - fixSpecified = { - name: true, - id: true - }; +// Add the tabIndex propHook to attrHooks for back-compat (different case is intentional) + jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex; - // Use this for any attribute in IE6/7 - // This fixes almost every IE6/7 issue - nodeHook = jQuery.valHooks.button = { - get: function( elem, name ) { - var ret; - ret = elem.getAttributeNode( name ); - return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ? - ret.nodeValue : +// Hook for boolean attributes + boolHook = { + get: function (elem, name) { + // Align boolean attributes with corresponding properties + // Fall back to attribute presence where some booleans are not supported + var attrNode, + property = jQuery.prop(elem, name); + return property === true || typeof property !== "boolean" && (attrNode = elem.getAttributeNode(name)) && attrNode.nodeValue !== false ? + name.toLowerCase() : undefined; }, - set: function( elem, value, name ) { - // Set the existing or create a new attribute node - var ret = elem.getAttributeNode( name ); - if ( !ret ) { - ret = document.createAttribute( name ); - elem.setAttributeNode( ret ); - } - return ( ret.nodeValue = value + "" ); + set: function (elem, value, name) { + var propName; + if (value === false) { + // Remove boolean attributes when set to false + jQuery.removeAttr(elem, name); + } else { + // value is true since we know at this point it's type boolean and not false + // Set boolean attributes to the same name and set the DOM property + propName = jQuery.propFix[name] || name; + if (propName in elem) { + // Only set the IDL specifically if it already exists on the element + elem[propName] = true; + } + + elem.setAttribute(name, name.toLowerCase()); + } + return name; } }; - // Apply the nodeHook to tabindex - jQuery.attrHooks.tabindex.set = nodeHook.set; +// IE6/7 do not support getting/setting some attributes with get/setAttribute + if (!getSetAttribute) { - // Set width and height to auto instead of 0 on empty string( Bug #8150 ) - // This is for removals - jQuery.each([ "width", "height" ], function( i, name ) { - jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { - set: function( elem, value ) { - if ( value === "" ) { - elem.setAttribute( name, "auto" ); - return value; + fixSpecified = { + name: true, + id: true + }; + + // Use this for any attribute in IE6/7 + // This fixes almost every IE6/7 issue + nodeHook = jQuery.valHooks.button = { + get: function (elem, name) { + var ret; + ret = elem.getAttributeNode(name); + return ret && (fixSpecified[name] ? ret.nodeValue !== "" : ret.specified) ? + ret.nodeValue : + undefined; + }, + set: function (elem, value, name) { + // Set the existing or create a new attribute node + var ret = elem.getAttributeNode(name); + if (!ret) { + ret = document.createAttribute(name); + elem.setAttributeNode(ret); } + return (ret.nodeValue = value + ""); } + }; + + // Apply the nodeHook to tabindex + jQuery.attrHooks.tabindex.set = nodeHook.set; + + // Set width and height to auto instead of 0 on empty string( Bug #8150 ) + // This is for removals + jQuery.each(["width", "height"], function (i, name) { + jQuery.attrHooks[name] = jQuery.extend(jQuery.attrHooks[name], { + set: function (elem, value) { + if (value === "") { + elem.setAttribute(name, "auto"); + return value; + } + } + }); }); - }); - // Set contenteditable to false on removals(#10429) - // Setting to empty string throws an error as an invalid value - jQuery.attrHooks.contenteditable = { - get: nodeHook.get, - set: function( elem, value, name ) { - if ( value === "" ) { - value = "false"; + // Set contenteditable to false on removals(#10429) + // Setting to empty string throws an error as an invalid value + jQuery.attrHooks.contenteditable = { + get: nodeHook.get, + set: function (elem, value, name) { + if (value === "") { + value = "false"; + } + nodeHook.set(elem, value, name); } - nodeHook.set( elem, value, name ); - } - }; -} + }; + } // Some attributes require a special call on IE -if ( !jQuery.support.hrefNormalized ) { - jQuery.each([ "href", "src", "width", "height" ], function( i, name ) { - jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { - get: function( elem ) { - var ret = elem.getAttribute( name, 2 ); - return ret === null ? undefined : ret; - } + if (!jQuery.support.hrefNormalized) { + jQuery.each(["href", "src", "width", "height"], function (i, name) { + jQuery.attrHooks[name] = jQuery.extend(jQuery.attrHooks[name], { + get: function (elem) { + var ret = elem.getAttribute(name, 2); + return ret === null ? undefined : ret; + } + }); }); - }); -} - -if ( !jQuery.support.style ) { - jQuery.attrHooks.style = { - get: function( elem ) { - // Return undefined in the case of empty string - // Normalize to lowercase since IE uppercases css property names - return elem.style.cssText.toLowerCase() || undefined; - }, - set: function( elem, value ) { - return ( elem.style.cssText = "" + value ); - } - }; -} + } + + if (!jQuery.support.style) { + jQuery.attrHooks.style = { + get: function (elem) { + // Return undefined in the case of empty string + // Normalize to lowercase since IE uppercases css property names + return elem.style.cssText.toLowerCase() || undefined; + }, + set: function (elem, value) { + return (elem.style.cssText = "" + value); + } + }; + } // Safari mis-reports the default selected property of an option // Accessing the parent's selectedIndex property fixes it -if ( !jQuery.support.optSelected ) { - jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, { - get: function( elem ) { - var parent = elem.parentNode; + if (!jQuery.support.optSelected) { + jQuery.propHooks.selected = jQuery.extend(jQuery.propHooks.selected, { + get: function (elem) { + var parent = elem.parentNode; - if ( parent ) { - parent.selectedIndex; + if (parent) { + parent.selectedIndex; - // Make sure that it also works with optgroups, see #5701 - if ( parent.parentNode ) { - parent.parentNode.selectedIndex; + // Make sure that it also works with optgroups, see #5701 + if (parent.parentNode) { + parent.parentNode.selectedIndex; + } } + return null; } - return null; - } - }); -} + }); + } // IE6/7 call enctype encoding -if ( !jQuery.support.enctype ) { - jQuery.propFix.enctype = "encoding"; -} + if (!jQuery.support.enctype) { + jQuery.propFix.enctype = "encoding"; + } // Radios and checkboxes getter/setter -if ( !jQuery.support.checkOn ) { - jQuery.each([ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = { - get: function( elem ) { - // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified - return elem.getAttribute("value") === null ? "on" : elem.value; - } - }; - }); -} -jQuery.each([ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], { - set: function( elem, value ) { - if ( jQuery.isArray( value ) ) { - return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 ); + if (!jQuery.support.checkOn) { + jQuery.each(["radio", "checkbox"], function () { + jQuery.valHooks[this] = { + get: function (elem) { + // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified + return elem.getAttribute("value") === null ? "on" : elem.value; + } + }; + }); + } + jQuery.each(["radio", "checkbox"], function () { + jQuery.valHooks[this] = jQuery.extend(jQuery.valHooks[this], { + set: function (elem, value) { + if (jQuery.isArray(value)) { + return (elem.checked = jQuery.inArray(jQuery(elem).val(), value) >= 0); + } } - } + }); }); -}); - - -var rformElems = /^(?:textarea|input|select)$/i, - rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/, - rhoverHack = /\bhover(\.\S+)?\b/, - rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|contextmenu)|click/, - rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, - rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/, - quickParse = function( selector ) { - var quick = rquickIs.exec( selector ); - if ( quick ) { - // 0 1 2 3 - // [ _, tag, id, class ] - quick[1] = ( quick[1] || "" ).toLowerCase(); - quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" ); - } - return quick; - }, - quickIs = function( elem, m ) { - var attrs = elem.attributes || {}; - return ( - (!m[1] || elem.nodeName.toLowerCase() === m[1]) && - (!m[2] || (attrs.id || {}).value === m[2]) && - (!m[3] || m[3].test( (attrs[ "class" ] || {}).value )) - ); - }, - hoverHack = function( events ) { - return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" ); - }; + var rformElems = /^(?:textarea|input|select)$/i, + rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/, + rhoverHack = /\bhover(\.\S+)?\b/, + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|contextmenu)|click/, + rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/, + quickParse = function (selector) { + var quick = rquickIs.exec(selector); + if (quick) { + // 0 1 2 3 + // [ _, tag, id, class ] + quick[1] = (quick[1] || "").toLowerCase(); + quick[3] = quick[3] && new RegExp("(?:^|\\s)" + quick[3] + "(?:\\s|$)"); + } + return quick; + }, + quickIs = function (elem, m) { + var attrs = elem.attributes || {}; + return ( + (!m[1] || elem.nodeName.toLowerCase() === m[1]) && + (!m[2] || (attrs.id || {}).value === m[2]) && + (!m[3] || m[3].test((attrs["class"] || {}).value)) + ); + }, + hoverHack = function (events) { + return jQuery.event.special.hover ? events : events.replace(rhoverHack, "mouseenter$1 mouseleave$1"); + }; -/* + /* * Helper functions for managing events -- not part of the public interface. * Props to Dean Edwards' addEvent library for many of the ideas. */ -jQuery.event = { - - add: function( elem, types, handler, data, selector ) { - - var elemData, eventHandle, events, - t, tns, type, namespaces, handleObj, - handleObjIn, quick, handlers, special; + jQuery.event = { - // Don't attach events to noData or text/comment nodes (allow plain objects tho) - if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - events = elemData.events; - if ( !events ) { - elemData.events = events = {}; - } - eventHandle = elemData.handle; - if ( !eventHandle ) { - elemData.handle = eventHandle = function( e ) { - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ? - jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : - undefined; - }; - // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events - eventHandle.elem = elem; - } - - // Handle multiple events separated by a space - // jQuery(...).bind("mouseover mouseout", fn); - types = jQuery.trim( hoverHack(types) ).split( " " ); - for ( t = 0; t < types.length; t++ ) { + add: function (elem, types, handler, data, selector) { - tns = rtypenamespace.exec( types[t] ) || []; - type = tns[1]; - namespaces = ( tns[2] || "" ).split( "." ).sort(); + var elemData, eventHandle, events, + t, tns, type, namespaces, handleObj, + handleObjIn, quick, handlers, special; - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; + // Don't attach events to noData or text/comment nodes (allow plain objects tho) + if (elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data(elem))) { + return; + } - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; + // Caller can pass in an object of custom data in lieu of the handler + if (handler.handler) { + handleObjIn = handler; + handler = handleObjIn.handler; + } - // handleObj is passed to all event handlers - handleObj = jQuery.extend({ - type: type, - origType: tns[1], - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - quick: quickParse( selector ), - namespace: namespaces.join(".") - }, handleObjIn ); + // Make sure that the handler has a unique ID, used to find/remove it later + if (!handler.guid) { + handler.guid = jQuery.guid++; + } - // Init the event handler queue if we're the first - handlers = events[ type ]; - if ( !handlers ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; + // Init the element's event structure and main handler, if this is the first + events = elemData.events; + if (!events) { + elemData.events = events = {}; + } + eventHandle = elemData.handle; + if (!eventHandle) { + elemData.handle = eventHandle = function (e) { + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ? + jQuery.event.dispatch.apply(eventHandle.elem, arguments) : + undefined; + }; + // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events + eventHandle.elem = elem; + } + + // Handle multiple events separated by a space + // jQuery(...).bind("mouseover mouseout", fn); + types = jQuery.trim(hoverHack(types)).split(" "); + for (t = 0; t < types.length; t++) { + + tns = rtypenamespace.exec(types[t]) || []; + type = tns[1]; + namespaces = (tns[2] || "").split(".").sort(); + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[type] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = (selector ? special.delegateType : special.bindType) || type; + + // Update special based on newly reset type + special = jQuery.event.special[type] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend({ + type: type, + origType: tns[1], + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + quick: quickParse(selector), + namespace: namespaces.join(".") + }, handleObjIn); + + // Init the event handler queue if we're the first + handlers = events[type]; + if (!handlers) { + handlers = events[type] = []; + handlers.delegateCount = 0; + + // Only use addEventListener/attachEvent if the special events handler returns false + if (!special.setup || special.setup.call(elem, data, namespaces, eventHandle) === false) { + // Bind the global event handler to the element + if (elem.addEventListener) { + elem.addEventListener(type, eventHandle, false); + + } else if (elem.attachEvent) { + elem.attachEvent("on" + type, eventHandle); + } + } + } - // Only use addEventListener/attachEvent if the special events handler returns false - if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - // Bind the global event handler to the element - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle, false ); + if (special.add) { + special.add.call(elem, handleObj); - } else if ( elem.attachEvent ) { - elem.attachEvent( "on" + type, eventHandle ); + if (!handleObj.handler.guid) { + handleObj.handler.guid = handler.guid; } } - } - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; + // Add to the element's handler list, delegates in front + if (selector) { + handlers.splice(handlers.delegateCount++, 0, handleObj); + } else { + handlers.push(handleObj); } - } - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[type] = true; } - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - // Nullify elem to prevent memory leaks in IE - elem = null; - }, + // Nullify elem to prevent memory leaks in IE + elem = null; + }, - global: {}, + global: {}, - // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { + // Detach an event or set of events from an element + remove: function (elem, types, handler, selector, mappedTypes) { - var elemData = jQuery.hasData( elem ) && jQuery._data( elem ), - t, tns, type, origType, namespaces, origCount, - j, events, special, handle, eventType, handleObj; + var elemData = jQuery.hasData(elem) && jQuery._data(elem), + t, tns, type, origType, namespaces, origCount, + j, events, special, handle, eventType, handleObj; - if ( !elemData || !(events = elemData.events) ) { - return; - } + if (!elemData || !(events = elemData.events)) { + return; + } - // Once for each type.namespace in types; type may be omitted - types = jQuery.trim( hoverHack( types || "" ) ).split(" "); - for ( t = 0; t < types.length; t++ ) { - tns = rtypenamespace.exec( types[t] ) || []; - type = origType = tns[1]; - namespaces = tns[2]; + // Once for each type.namespace in types; type may be omitted + types = jQuery.trim(hoverHack(types || "")).split(" "); + for (t = 0; t < types.length; t++) { + tns = rtypenamespace.exec(types[t]) || []; + type = origType = tns[1]; + namespaces = tns[2]; - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + // Unbind all events (on this namespace, if provided) for the element + if (!type) { + for (type in events) { + jQuery.event.remove(elem, type + types[t], handler, selector, true); + } + continue; } - continue; - } - special = jQuery.event.special[ type ] || {}; - type = ( selector? special.delegateType : special.bindType ) || type; - eventType = events[ type ] || []; - origCount = eventType.length; - namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null; + special = jQuery.event.special[type] || {}; + type = (selector ? special.delegateType : special.bindType) || type; + eventType = events[type] || []; + origCount = eventType.length; + namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null; - // Remove matching events - for ( j = 0; j < eventType.length; j++ ) { - handleObj = eventType[ j ]; + // Remove matching events + for (j = 0; j < eventType.length; j++) { + handleObj = eventType[j]; - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !namespaces || namespaces.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { - eventType.splice( j--, 1 ); + if ((mappedTypes || origType === handleObj.origType) && + (!handler || handler.guid === handleObj.guid) && + (!namespaces || namespaces.test(handleObj.namespace)) && + (!selector || selector === handleObj.selector || selector === "**" && handleObj.selector)) { + eventType.splice(j--, 1); - if ( handleObj.selector ) { - eventType.delegateCount--; + if (handleObj.selector) { + eventType.delegateCount--; + } + if (special.remove) { + special.remove.call(elem, handleObj); + } } - if ( special.remove ) { - special.remove.call( elem, handleObj ); + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if (eventType.length === 0 && origCount !== eventType.length) { + if (!special.teardown || special.teardown.call(elem, namespaces) === false) { + jQuery.removeEvent(elem, type, elemData.handle); } + + delete events[type]; } } - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( eventType.length === 0 && origCount !== eventType.length ) { - if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) { - jQuery.removeEvent( elem, type, elemData.handle ); + // Remove the expando if it's no longer used + if (jQuery.isEmptyObject(events)) { + handle = elemData.handle; + if (handle) { + handle.elem = null; } - delete events[ type ]; - } - } - - // Remove the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - handle = elemData.handle; - if ( handle ) { - handle.elem = null; + // removeData also checks for emptiness and clears the expando if empty + // so use it instead of delete + jQuery.removeData(elem, ["events", "handle"], true); } + }, - // removeData also checks for emptiness and clears the expando if empty - // so use it instead of delete - jQuery.removeData( elem, [ "events", "handle" ], true ); - } - }, - - // Events that are safe to short-circuit if no handlers are attached. - // Native DOM events should not be added, they may have inline handlers. - customEvent: { - "getData": true, - "setData": true, - "changeData": true - }, - - trigger: function( event, data, elem, onlyHandlers ) { - // Don't do events on text and comment nodes - if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) { - return; - } - - // Event object or event type - var type = event.type || event, - namespaces = [], - cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType; - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } + // Events that are safe to short-circuit if no handlers are attached. + // Native DOM events should not be added, they may have inline handlers. + customEvent: { + "getData": true, + "setData": true, + "changeData": true + }, - if ( type.indexOf( "!" ) >= 0 ) { - // Exclusive events trigger only for the exact event (no namespaces) - type = type.slice(0, -1); - exclusive = true; - } + trigger: function (event, data, elem, onlyHandlers) { + // Don't do events on text and comment nodes + if (elem && (elem.nodeType === 3 || elem.nodeType === 8)) { + return; + } - if ( type.indexOf( "." ) >= 0 ) { - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split("."); - type = namespaces.shift(); - namespaces.sort(); - } + // Event object or event type + var type = event.type || event, + namespaces = [], + cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType; - if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) { - // No jQuery handlers for this event type, and it can't have inline handlers - return; - } + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if (rfocusMorph.test(type + jQuery.event.triggered)) { + return; + } - // Caller can pass in an Event, Object, or just an event type string - event = typeof event === "object" ? - // jQuery.Event object - event[ jQuery.expando ] ? event : - // Object literal - new jQuery.Event( type, event ) : - // Just the event type (string) - new jQuery.Event( type ); + if (type.indexOf("!") >= 0) { + // Exclusive events trigger only for the exact event (no namespaces) + type = type.slice(0, -1); + exclusive = true; + } - event.type = type; - event.isTrigger = true; - event.exclusive = exclusive; - event.namespace = namespaces.join( "." ); - event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null; - ontype = type.indexOf( ":" ) < 0 ? "on" + type : ""; + if (type.indexOf(".") >= 0) { + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split("."); + type = namespaces.shift(); + namespaces.sort(); + } - // Handle a global trigger - if ( !elem ) { + if ((!elem || jQuery.event.customEvent[type]) && !jQuery.event.global[type]) { + // No jQuery handlers for this event type, and it can't have inline handlers + return; + } - // TODO: Stop taunting the data cache; remove global events and always attach to document - cache = jQuery.cache; - for ( i in cache ) { - if ( cache[ i ].events && cache[ i ].events[ type ] ) { - jQuery.event.trigger( event, data, cache[ i ].handle.elem, true ); + // Caller can pass in an Event, Object, or just an event type string + event = typeof event === "object" ? + // jQuery.Event object + event[jQuery.expando] ? event : + // Object literal + new jQuery.Event(type, event) : + // Just the event type (string) + new jQuery.Event(type); + + event.type = type; + event.isTrigger = true; + event.exclusive = exclusive; + event.namespace = namespaces.join("."); + event.namespace_re = event.namespace ? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null; + ontype = type.indexOf(":") < 0 ? "on" + type : ""; + + // Handle a global trigger + if (!elem) { + + // TODO: Stop taunting the data cache; remove global events and always attach to document + cache = jQuery.cache; + for (i in cache) { + if (cache[i].events && cache[i].events[type]) { + jQuery.event.trigger(event, data, cache[i].handle.elem, true); + } } + return; } - return; - } - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } + // Clean up the event in case it is being reused + event.result = undefined; + if (!event.target) { + event.target = elem; + } - // Clone any incoming data and prepend the event, creating the handler arg list - data = data != null ? jQuery.makeArray( data ) : []; - data.unshift( event ); + // Clone any incoming data and prepend the event, creating the handler arg list + data = data != null ? jQuery.makeArray(data) : []; + data.unshift(event); - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } + // Allow special events to draw outside the lines + special = jQuery.event.special[type] || {}; + if (special.trigger && special.trigger.apply(elem, data) === false) { + return; + } - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - eventPath = [[ elem, special.bindType || type ]]; - if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + eventPath = [[elem, special.bindType || type]]; + if (!onlyHandlers && !special.noBubble && !jQuery.isWindow(elem)) { - bubbleType = special.delegateType || type; - cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode; - old = null; - for ( ; cur; cur = cur.parentNode ) { - eventPath.push([ cur, bubbleType ]); - old = cur; - } + bubbleType = special.delegateType || type; + cur = rfocusMorph.test(bubbleType + type) ? elem : elem.parentNode; + old = null; + for (; cur; cur = cur.parentNode) { + eventPath.push([cur, bubbleType]); + old = cur; + } - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( old && old === elem.ownerDocument ) { - eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]); + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if (old && old === elem.ownerDocument) { + eventPath.push([old.defaultView || old.parentWindow || window, bubbleType]); + } } - } - // Fire handlers on the event path - for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) { + // Fire handlers on the event path + for (i = 0; i < eventPath.length && !event.isPropagationStopped(); i++) { - cur = eventPath[i][0]; - event.type = eventPath[i][1]; + cur = eventPath[i][0]; + event.type = eventPath[i][1]; - handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - // Note that this is a bare JS function and not a jQuery handler - handle = ontype && cur[ ontype ]; - if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) { - event.preventDefault(); + handle = (jQuery._data(cur, "events") || {})[event.type] && jQuery._data(cur, "handle"); + if (handle) { + handle.apply(cur, data); + } + // Note that this is a bare JS function and not a jQuery handler + handle = ontype && cur[ontype]; + if (handle && jQuery.acceptData(cur) && handle.apply(cur, data) === false) { + event.preventDefault(); + } } - } - event.type = type; + event.type = type; - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { + // If nobody prevented the default action, do it now + if (!onlyHandlers && !event.isDefaultPrevented()) { - if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) && - !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) { + if ((!special._default || special._default.apply(elem.ownerDocument, data) === false) && + !(type === "click" && jQuery.nodeName(elem, "a")) && jQuery.acceptData(elem)) { - // Call a native DOM method on the target with the same name name as the event. - // Can't use an .isFunction() check here because IE6/7 fails that test. - // Don't do default actions on window, that's where global variables be (#6170) - // IE<9 dies on focus/blur to hidden element (#1486) - if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) { + // Call a native DOM method on the target with the same name name as the event. + // Can't use an .isFunction() check here because IE6/7 fails that test. + // Don't do default actions on window, that's where global variables be (#6170) + // IE<9 dies on focus/blur to hidden element (#1486) + if (ontype && elem[type] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow(elem)) { - // Don't re-trigger an onFOO event when we call its FOO() method - old = elem[ ontype ]; + // Don't re-trigger an onFOO event when we call its FOO() method + old = elem[ontype]; - if ( old ) { - elem[ ontype ] = null; - } + if (old) { + elem[ontype] = null; + } - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - elem[ type ](); - jQuery.event.triggered = undefined; + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + elem[type](); + jQuery.event.triggered = undefined; - if ( old ) { - elem[ ontype ] = old; + if (old) { + elem[ontype] = old; + } } } } - } - return event.result; - }, + return event.result; + }, - dispatch: function( event ) { + dispatch: function (event) { + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix(event || window.event); + + var handlers = ((jQuery._data(this, "events") || {})[event.type] || []), + delegateCount = handlers.delegateCount, + args = [].slice.call(arguments, 0), + run_all = !event.exclusive && !event.namespace, + handlerQueue = [], + i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[0] = event; + event.delegateTarget = this; + + // Determine handlers that should run if there are delegated events + // Avoid disabled elements in IE (#6911) and non-left-click bubbling in Firefox (#3861) + if (delegateCount && !event.target.disabled && !(event.button && event.type === "click")) { + + // Pregenerate a single jQuery object for reuse with .is() + jqcur = jQuery(this); + jqcur.context = this.ownerDocument || this; + + for (cur = event.target; cur != this; cur = cur.parentNode || this) { + selMatch = {}; + matches = []; + jqcur[0] = cur; + for (i = 0; i < delegateCount; i++) { + handleObj = handlers[i]; + sel = handleObj.selector; + + if (selMatch[sel] === undefined) { + selMatch[sel] = ( + handleObj.quick ? quickIs(cur, handleObj.quick) : jqcur.is(sel) + ); + } + if (selMatch[sel]) { + matches.push(handleObj); + } + } + if (matches.length) { + handlerQueue.push({elem: cur, matches: matches}); + } + } + } - // Make a writable jQuery.Event from the native event object - event = jQuery.event.fix( event || window.event ); + // Add the remaining (directly-bound) handlers + if (handlers.length > delegateCount) { + handlerQueue.push({elem: this, matches: handlers.slice(delegateCount)}); + } - var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []), - delegateCount = handlers.delegateCount, - args = [].slice.call( arguments, 0 ), - run_all = !event.exclusive && !event.namespace, - handlerQueue = [], - i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related; + // Run delegates first; they may want to stop propagation beneath us + for (i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++) { + matched = handlerQueue[i]; + event.currentTarget = matched.elem; - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[0] = event; - event.delegateTarget = this; + for (j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++) { + handleObj = matched.matches[j]; - // Determine handlers that should run if there are delegated events - // Avoid disabled elements in IE (#6911) and non-left-click bubbling in Firefox (#3861) - if ( delegateCount && !event.target.disabled && !(event.button && event.type === "click") ) { + // Triggered event must either 1) be non-exclusive and have no namespace, or + // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). + if (run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test(handleObj.namespace)) { - // Pregenerate a single jQuery object for reuse with .is() - jqcur = jQuery(this); - jqcur.context = this.ownerDocument || this; + event.data = handleObj.data; + event.handleObj = handleObj; - for ( cur = event.target; cur != this; cur = cur.parentNode || this ) { - selMatch = {}; - matches = []; - jqcur[0] = cur; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - sel = handleObj.selector; + ret = ((jQuery.event.special[handleObj.origType] || {}).handle || handleObj.handler) + .apply(matched.elem, args); - if ( selMatch[ sel ] === undefined ) { - selMatch[ sel ] = ( - handleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel ) - ); - } - if ( selMatch[ sel ] ) { - matches.push( handleObj ); + if (ret !== undefined) { + event.result = ret; + if (ret === false) { + event.preventDefault(); + event.stopPropagation(); + } + } } } - if ( matches.length ) { - handlerQueue.push({ elem: cur, matches: matches }); - } } - } - - // Add the remaining (directly-bound) handlers - if ( handlers.length > delegateCount ) { - handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) }); - } - - // Run delegates first; they may want to stop propagation beneath us - for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) { - matched = handlerQueue[ i ]; - event.currentTarget = matched.elem; - for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) { - handleObj = matched.matches[ j ]; + return event.result; + }, - // Triggered event must either 1) be non-exclusive and have no namespace, or - // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). - if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) { + // Includes some event props shared by KeyEvent and MouseEvent + // *** attrChange attrName relatedNode srcElement are not normalized, non-W3C, deprecated, will be removed in 1.8 *** + props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), - event.data = handleObj.data; - event.handleObj = handleObj; + fixHooks: {}, - ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) - .apply( matched.elem, args ); + keyHooks: { + props: "char charCode key keyCode".split(" "), + filter: function (event, original) { - if ( ret !== undefined ) { - event.result = ret; - if ( ret === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } + // Add which for key events + if (event.which == null) { + event.which = original.charCode != null ? original.charCode : original.keyCode; } + + return event; } - } + }, - return event.result; - }, + mouseHooks: { + props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), + filter: function (event, original) { + var eventDoc, doc, body, + button = original.button, + fromElement = original.fromElement; - // Includes some event props shared by KeyEvent and MouseEvent - // *** attrChange attrName relatedNode srcElement are not normalized, non-W3C, deprecated, will be removed in 1.8 *** - props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), + // Calculate pageX/Y if missing and clientX/Y available + if (event.pageX == null && original.clientX != null) { + eventDoc = event.target.ownerDocument || document; + doc = eventDoc.documentElement; + body = eventDoc.body; - fixHooks: {}, + event.pageX = original.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0); + event.pageY = original.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0); + } + + // Add relatedTarget, if necessary + if (!event.relatedTarget && fromElement) { + event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; + } - keyHooks: { - props: "char charCode key keyCode".split(" "), - filter: function( event, original ) { + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if (!event.which && button !== undefined) { + event.which = (button & 1 ? 1 : (button & 2 ? 3 : (button & 4 ? 2 : 0))); + } - // Add which for key events - if ( event.which == null ) { - event.which = original.charCode != null ? original.charCode : original.keyCode; + return event; } + }, - return event; - } - }, + fix: function (event) { + if (event[jQuery.expando]) { + return event; + } - mouseHooks: { - props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), - filter: function( event, original ) { - var eventDoc, doc, body, - button = original.button, - fromElement = original.fromElement; + // Create a writable copy of the event object and normalize some properties + var i, prop, + originalEvent = event, + fixHook = jQuery.event.fixHooks[event.type] || {}, + copy = fixHook.props ? this.props.concat(fixHook.props) : this.props; - // Calculate pageX/Y if missing and clientX/Y available - if ( event.pageX == null && original.clientX != null ) { - eventDoc = event.target.ownerDocument || document; - doc = eventDoc.documentElement; - body = eventDoc.body; + event = jQuery.Event(originalEvent); - event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); - event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); + for (i = copy.length; i;) { + prop = copy[--i]; + event[prop] = originalEvent[prop]; } - // Add relatedTarget, if necessary - if ( !event.relatedTarget && fromElement ) { - event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; + // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2) + if (!event.target) { + event.target = originalEvent.srcElement || document; } - // Add which for click: 1 === left; 2 === middle; 3 === right - // Note: button is not normalized, so don't use it - if ( !event.which && button !== undefined ) { - event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); + // Target should not be a text node (#504, Safari) + if (event.target.nodeType === 3) { + event.target = event.target.parentNode; } - return event; - } - }, + // For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8) + if (event.metaKey === undefined) { + event.metaKey = event.ctrlKey; + } - fix: function( event ) { - if ( event[ jQuery.expando ] ) { - return event; - } + return fixHook.filter ? fixHook.filter(event, originalEvent) : event; + }, - // Create a writable copy of the event object and normalize some properties - var i, prop, - originalEvent = event, - fixHook = jQuery.event.fixHooks[ event.type ] || {}, - copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; + special: { + ready: { + // Make sure the ready event is setup + setup: jQuery.bindReady + }, - event = jQuery.Event( originalEvent ); - - for ( i = copy.length; i; ) { - prop = copy[ --i ]; - event[ prop ] = originalEvent[ prop ]; - } - - // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2) - if ( !event.target ) { - event.target = originalEvent.srcElement || document; - } - - // Target should not be a text node (#504, Safari) - if ( event.target.nodeType === 3 ) { - event.target = event.target.parentNode; - } - - // For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8) - if ( event.metaKey === undefined ) { - event.metaKey = event.ctrlKey; - } - - return fixHook.filter? fixHook.filter( event, originalEvent ) : event; - }, - - special: { - ready: { - // Make sure the ready event is setup - setup: jQuery.bindReady - }, + load: { + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, - load: { - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, + focus: { + delegateType: "focusin" + }, + blur: { + delegateType: "focusout" + }, - focus: { - delegateType: "focusin" - }, - blur: { - delegateType: "focusout" - }, + beforeunload: { + setup: function (data, namespaces, eventHandle) { + // We only want to do this special case on windows + if (jQuery.isWindow(this)) { + this.onbeforeunload = eventHandle; + } + }, - beforeunload: { - setup: function( data, namespaces, eventHandle ) { - // We only want to do this special case on windows - if ( jQuery.isWindow( this ) ) { - this.onbeforeunload = eventHandle; + teardown: function (namespaces, eventHandle) { + if (this.onbeforeunload === eventHandle) { + this.onbeforeunload = null; + } } - }, + } + }, - teardown: function( namespaces, eventHandle ) { - if ( this.onbeforeunload === eventHandle ) { - this.onbeforeunload = null; + simulate: function (type, elem, event, bubble) { + // Piggyback on a donor event to simulate a different one. + // Fake originalEvent to avoid donor's stopPropagation, but if the + // simulated event prevents default then we do the same on the donor. + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true, + originalEvent: {} } + ); + if (bubble) { + jQuery.event.trigger(e, null, elem); + } else { + jQuery.event.dispatch.call(elem, e); + } + if (e.isDefaultPrevented()) { + event.preventDefault(); } } - }, - - simulate: function( type, elem, event, bubble ) { - // Piggyback on a donor event to simulate a different one. - // Fake originalEvent to avoid donor's stopPropagation, but if the - // simulated event prevents default then we do the same on the donor. - var e = jQuery.extend( - new jQuery.Event(), - event, - { type: type, - isSimulated: true, - originalEvent: {} - } - ); - if ( bubble ) { - jQuery.event.trigger( e, null, elem ); - } else { - jQuery.event.dispatch.call( elem, e ); - } - if ( e.isDefaultPrevented() ) { - event.preventDefault(); - } - } -}; + }; // Some plugins are using, but it's undocumented/deprecated and will be removed. // The 1.7 special event interface should provide all the hooks needed now. -jQuery.event.handle = jQuery.event.dispatch; + jQuery.event.handle = jQuery.event.dispatch; -jQuery.removeEvent = document.removeEventListener ? - function( elem, type, handle ) { - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle, false ); - } - } : - function( elem, type, handle ) { - if ( elem.detachEvent ) { - elem.detachEvent( "on" + type, handle ); + jQuery.removeEvent = document.removeEventListener ? + function (elem, type, handle) { + if (elem.removeEventListener) { + elem.removeEventListener(type, handle, false); + } + } : + function (elem, type, handle) { + if (elem.detachEvent) { + elem.detachEvent("on" + type, handle); + } + }; + + jQuery.Event = function (src, props) { + // Allow instantiation without the 'new' keyword + if (!(this instanceof jQuery.Event)) { + return new jQuery.Event(src, props); } - }; -jQuery.Event = function( src, props ) { - // Allow instantiation without the 'new' keyword - if ( !(this instanceof jQuery.Event) ) { - return new jQuery.Event( src, props ); - } + // Event object + if (src && src.type) { + this.originalEvent = src; + this.type = src.type; - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = (src.defaultPrevented || src.returnValue === false || + src.getPreventDefault && src.getPreventDefault()) ? returnTrue : returnFalse; - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false || - src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse; + // Event type + } else { + this.type = src; + } - // Event type - } else { - this.type = src; - } + // Put explicitly provided properties onto the event object + if (props) { + jQuery.extend(this, props); + } - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || jQuery.now(); + // Mark it as fixed + this[jQuery.expando] = true; + }; - // Mark it as fixed - this[ jQuery.expando ] = true; -}; + function returnFalse() { + return false; + } -function returnFalse() { - return false; -} -function returnTrue() { - return true; -} + function returnTrue() { + return true; + } // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - preventDefault: function() { - this.isDefaultPrevented = returnTrue; + jQuery.Event.prototype = { + preventDefault: function () { + this.isDefaultPrevented = returnTrue; - var e = this.originalEvent; - if ( !e ) { - return; - } + var e = this.originalEvent; + if (!e) { + return; + } - // if preventDefault exists run it on the original event - if ( e.preventDefault ) { - e.preventDefault(); + // if preventDefault exists run it on the original event + if (e.preventDefault) { + e.preventDefault(); - // otherwise set the returnValue property of the original event to false (IE) - } else { - e.returnValue = false; - } - }, - stopPropagation: function() { - this.isPropagationStopped = returnTrue; + // otherwise set the returnValue property of the original event to false (IE) + } else { + e.returnValue = false; + } + }, + stopPropagation: function () { + this.isPropagationStopped = returnTrue; - var e = this.originalEvent; - if ( !e ) { - return; - } - // if stopPropagation exists run it on the original event - if ( e.stopPropagation ) { - e.stopPropagation(); - } - // otherwise set the cancelBubble property of the original event to true (IE) - e.cancelBubble = true; - }, - stopImmediatePropagation: function() { - this.isImmediatePropagationStopped = returnTrue; - this.stopPropagation(); - }, - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse -}; + var e = this.originalEvent; + if (!e) { + return; + } + // if stopPropagation exists run it on the original event + if (e.stopPropagation) { + e.stopPropagation(); + } + // otherwise set the cancelBubble property of the original event to true (IE) + e.cancelBubble = true; + }, + stopImmediatePropagation: function () { + this.isImmediatePropagationStopped = returnTrue; + this.stopPropagation(); + }, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse + }; // Create mouseenter/leave events using mouseover/out and event-time checks -jQuery.each({ - mouseenter: "mouseover", - mouseleave: "mouseout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var target = this, - related = event.relatedTarget, - handleObj = event.handleObj, - selector = handleObj.selector, - ret; - - // For mousenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || (related !== target && !jQuery.contains( target, related )) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; + jQuery.each({ + mouseenter: "mouseover", + mouseleave: "mouseout" + }, function (orig, fix) { + jQuery.event.special[orig] = { + delegateType: fix, + bindType: fix, + + handle: function (event) { + var target = this, + related = event.relatedTarget, + handleObj = event.handleObj, + selector = handleObj.selector, + ret; + + // For mousenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if (!related || (related !== target && !jQuery.contains(target, related))) { + event.type = handleObj.origType; + ret = handleObj.handler.apply(this, arguments); + event.type = fix; + } + return ret; } - return ret; - } - }; -}); + }; + }); // IE submit delegation -if ( !jQuery.support.submitBubbles ) { + if (!jQuery.support.submitBubbles) { - jQuery.event.special.submit = { - setup: function() { - // Only need this for delegated form submit events - if ( jQuery.nodeName( this, "form" ) ) { - return false; - } + jQuery.event.special.submit = { + setup: function () { + // Only need this for delegated form submit events + if (jQuery.nodeName(this, "form")) { + return false; + } - // Lazy-add a submit handler when a descendant form may potentially be submitted - jQuery.event.add( this, "click._submit keypress._submit", function( e ) { - // Node name check avoids a VML-related crash in IE (#9807) - var elem = e.target, - form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined; - if ( form && !form._submit_attached ) { - jQuery.event.add( form, "submit._submit", function( event ) { - // If form was submitted by the user, bubble the event up the tree - if ( this.parentNode && !event.isTrigger ) { - jQuery.event.simulate( "submit", this.parentNode, event, true ); - } - }); - form._submit_attached = true; + // Lazy-add a submit handler when a descendant form may potentially be submitted + jQuery.event.add(this, "click._submit keypress._submit", function (e) { + // Node name check avoids a VML-related crash in IE (#9807) + var elem = e.target, + form = jQuery.nodeName(elem, "input") || jQuery.nodeName(elem, "button") ? elem.form : undefined; + if (form && !form._submit_attached) { + jQuery.event.add(form, "submit._submit", function (event) { + // If form was submitted by the user, bubble the event up the tree + if (this.parentNode && !event.isTrigger) { + jQuery.event.simulate("submit", this.parentNode, event, true); + } + }); + form._submit_attached = true; + } + }); + // return undefined since we don't need an event listener + }, + + teardown: function () { + // Only need this for delegated form submit events + if (jQuery.nodeName(this, "form")) { + return false; } - }); - // return undefined since we don't need an event listener - }, - teardown: function() { - // Only need this for delegated form submit events - if ( jQuery.nodeName( this, "form" ) ) { - return false; + // Remove delegated handlers; cleanData eventually reaps submit handlers attached above + jQuery.event.remove(this, "._submit"); } - - // Remove delegated handlers; cleanData eventually reaps submit handlers attached above - jQuery.event.remove( this, "._submit" ); - } - }; -} + }; + } // IE change delegation and checkbox/radio fix -if ( !jQuery.support.changeBubbles ) { + if (!jQuery.support.changeBubbles) { - jQuery.event.special.change = { + jQuery.event.special.change = { - setup: function() { + setup: function () { - if ( rformElems.test( this.nodeName ) ) { - // IE doesn't fire change on a check/radio until blur; trigger it on click - // after a propertychange. Eat the blur-change in special.change.handle. - // This still fires onchange a second time for check/radio after blur. - if ( this.type === "checkbox" || this.type === "radio" ) { - jQuery.event.add( this, "propertychange._change", function( event ) { - if ( event.originalEvent.propertyName === "checked" ) { - this._just_changed = true; - } - }); - jQuery.event.add( this, "click._change", function( event ) { - if ( this._just_changed && !event.isTrigger ) { - this._just_changed = false; - jQuery.event.simulate( "change", this, event, true ); - } - }); + if (rformElems.test(this.nodeName)) { + // IE doesn't fire change on a check/radio until blur; trigger it on click + // after a propertychange. Eat the blur-change in special.change.handle. + // This still fires onchange a second time for check/radio after blur. + if (this.type === "checkbox" || this.type === "radio") { + jQuery.event.add(this, "propertychange._change", function (event) { + if (event.originalEvent.propertyName === "checked") { + this._just_changed = true; + } + }); + jQuery.event.add(this, "click._change", function (event) { + if (this._just_changed && !event.isTrigger) { + this._just_changed = false; + jQuery.event.simulate("change", this, event, true); + } + }); + } + return false; } - return false; - } - // Delegated event; lazy-add a change handler on descendant inputs - jQuery.event.add( this, "beforeactivate._change", function( e ) { - var elem = e.target; + // Delegated event; lazy-add a change handler on descendant inputs + jQuery.event.add(this, "beforeactivate._change", function (e) { + var elem = e.target; - if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) { - jQuery.event.add( elem, "change._change", function( event ) { - if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { - jQuery.event.simulate( "change", this.parentNode, event, true ); - } - }); - elem._change_attached = true; - } - }); - }, + if (rformElems.test(elem.nodeName) && !elem._change_attached) { + jQuery.event.add(elem, "change._change", function (event) { + if (this.parentNode && !event.isSimulated && !event.isTrigger) { + jQuery.event.simulate("change", this.parentNode, event, true); + } + }); + elem._change_attached = true; + } + }); + }, - handle: function( event ) { - var elem = event.target; + handle: function (event) { + var elem = event.target; - // Swallow native change events from checkbox/radio, we already triggered them above - if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) { - return event.handleObj.handler.apply( this, arguments ); - } - }, + // Swallow native change events from checkbox/radio, we already triggered them above + if (this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox")) { + return event.handleObj.handler.apply(this, arguments); + } + }, - teardown: function() { - jQuery.event.remove( this, "._change" ); + teardown: function () { + jQuery.event.remove(this, "._change"); - return rformElems.test( this.nodeName ); - } - }; -} + return rformElems.test(this.nodeName); + } + }; + } // Create "bubbling" focus and blur events -if ( !jQuery.support.focusinBubbles ) { - jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { + if (!jQuery.support.focusinBubbles) { + jQuery.each({focus: "focusin", blur: "focusout"}, function (orig, fix) { - // Attach a single capturing handler while someone wants focusin/focusout - var attaches = 0, - handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); + // Attach a single capturing handler while someone wants focusin/focusout + var attaches = 0, + handler = function (event) { + jQuery.event.simulate(fix, event.target, jQuery.event.fix(event), true); + }; + + jQuery.event.special[fix] = { + setup: function () { + if (attaches++ === 0) { + document.addEventListener(orig, handler, true); + } + }, + teardown: function () { + if (--attaches === 0) { + document.removeEventListener(orig, handler, true); + } + } }; + }); + } + + jQuery.fn.extend({ + + on: function (types, selector, data, fn, /*INTERNAL*/ one) { + var origFn, type; - jQuery.event.special[ fix ] = { - setup: function() { - if ( attaches++ === 0 ) { - document.addEventListener( orig, handler, true ); + // Types can be a map of types/handlers + if (typeof types === "object") { + // ( types-Object, selector, data ) + if (typeof selector !== "string") { + // ( types-Object, data ) + data = selector; + selector = undefined; } - }, - teardown: function() { - if ( --attaches === 0 ) { - document.removeEventListener( orig, handler, true ); + for (type in types) { + this.on(type, selector, data, types[type], one); } + return this; } - }; - }); -} - -jQuery.fn.extend({ - - on: function( types, selector, data, fn, /*INTERNAL*/ one ) { - var origFn, type; - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - // ( types-Object, data ) - data = selector; - selector = undefined; + if (data == null && fn == null) { + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if (fn == null) { + if (typeof selector === "string") { + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } } - for ( type in types ) { - this.on( type, selector, data, types[ type ], one ); + if (fn === false) { + fn = returnFalse; + } else if (!fn) { + return this; } - return this; - } - if ( data == null && fn == null ) { - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - // ( types, data, fn ) - fn = data; - data = selector; + if (one === 1) { + origFn = fn; + fn = function (event) { + // Can use an empty set, since event contains the info + jQuery().off(event); + return origFn.apply(this, arguments); + }; + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || (origFn.guid = jQuery.guid++); + } + return this.each(function () { + jQuery.event.add(this, types, fn, data, selector); + }); + }, + one: function (types, selector, data, fn) { + return this.on.call(this, types, selector, data, fn, 1); + }, + off: function (types, selector, fn) { + if (types && types.preventDefault && types.handleObj) { + // ( event ) dispatched jQuery.Event + var handleObj = types.handleObj; + jQuery(types.delegateTarget).off( + handleObj.namespace ? handleObj.type + "." + handleObj.namespace : handleObj.type, + handleObj.selector, + handleObj.handler + ); + return this; + } + if (typeof types === "object") { + // ( types-object [, selector] ) + for (var type in types) { + this.off(type, selector, types[type]); + } + return this; + } + if (selector === false || typeof selector === "function") { + // ( types [, fn] ) + fn = selector; selector = undefined; } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return this; - } + if (fn === false) { + fn = returnFalse; + } + return this.each(function () { + jQuery.event.remove(this, types, fn, selector); + }); + }, - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return this.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - }); - }, - one: function( types, selector, data, fn ) { - return this.on.call( this, types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - if ( types && types.preventDefault && types.handleObj ) { - // ( event ) dispatched jQuery.Event - var handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace? handleObj.type + "." + handleObj.namespace : handleObj.type, - handleObj.selector, - handleObj.handler - ); + bind: function (types, data, fn) { + return this.on(types, null, data, fn); + }, + unbind: function (types, fn) { + return this.off(types, null, fn); + }, + + live: function (types, data, fn) { + jQuery(this.context).on(types, this.selector, data, fn); return this; - } - if ( typeof types === "object" ) { - // ( types-object [, selector] ) - for ( var type in types ) { - this.off( type, selector, types[ type ] ); - } + }, + die: function (types, fn) { + jQuery(this.context).off(types, this.selector || "**", fn); return this; - } - if ( selector === false || typeof selector === "function" ) { - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each(function() { - jQuery.event.remove( this, types, fn, selector ); - }); - }, - - bind: function( types, data, fn ) { - return this.on( types, null, data, fn ); - }, - unbind: function( types, fn ) { - return this.off( types, null, fn ); - }, - - live: function( types, data, fn ) { - jQuery( this.context ).on( types, this.selector, data, fn ); - return this; - }, - die: function( types, fn ) { - jQuery( this.context ).off( types, this.selector || "**", fn ); - return this; - }, - - delegate: function( selector, types, data, fn ) { - return this.on( types, selector, data, fn ); - }, - undelegate: function( selector, types, fn ) { - // ( namespace ) or ( selector, types [, fn] ) - return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn ); - }, - - trigger: function( type, data ) { - return this.each(function() { - jQuery.event.trigger( type, data, this ); - }); - }, - triggerHandler: function( type, data ) { - if ( this[0] ) { - return jQuery.event.trigger( type, data, this[0], true ); - } - }, + }, - toggle: function( fn ) { - // Save reference to arguments for access in closure - var args = arguments, - guid = fn.guid || jQuery.guid++, - i = 0, - toggler = function( event ) { - // Figure out which function to execute - var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i; - jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 ); + delegate: function (selector, types, data, fn) { + return this.on(types, selector, data, fn); + }, + undelegate: function (selector, types, fn) { + // ( namespace ) or ( selector, types [, fn] ) + return arguments.length == 1 ? this.off(selector, "**") : this.off(types, selector, fn); + }, - // Make sure that clicks stop - event.preventDefault(); + trigger: function (type, data) { + return this.each(function () { + jQuery.event.trigger(type, data, this); + }); + }, + triggerHandler: function (type, data) { + if (this[0]) { + return jQuery.event.trigger(type, data, this[0], true); + } + }, - // and execute the function - return args[ lastToggle ].apply( this, arguments ) || false; - }; + toggle: function (fn) { + // Save reference to arguments for access in closure + var args = arguments, + guid = fn.guid || jQuery.guid++, + i = 0, + toggler = function (event) { + // Figure out which function to execute + var lastToggle = (jQuery._data(this, "lastToggle" + fn.guid) || 0) % i; + jQuery._data(this, "lastToggle" + fn.guid, lastToggle + 1); - // link all the functions, so any of them can unbind this click handler - toggler.guid = guid; - while ( i < args.length ) { - args[ i++ ].guid = guid; - } + // Make sure that clicks stop + event.preventDefault(); - return this.click( toggler ); - }, + // and execute the function + return args[lastToggle].apply(this, arguments) || false; + }; - hover: function( fnOver, fnOut ) { - return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); - } -}); + // link all the functions, so any of them can unbind this click handler + toggler.guid = guid; + while (i < args.length) { + args[i++].guid = guid; + } -jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + - "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + - "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) { + return this.click(toggler); + }, - // Handle event binding - jQuery.fn[ name ] = function( data, fn ) { - if ( fn == null ) { - fn = data; - data = null; + hover: function (fnOver, fnOut) { + return this.mouseenter(fnOver).mouseleave(fnOut || fnOver); } + }); - return arguments.length > 0 ? - this.on( name, null, data, fn ) : - this.trigger( name ); - }; + jQuery.each(("blur focus focusin focusout load resize scroll unload click dblclick " + + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + + "change select submit keydown keypress keyup error contextmenu").split(" "), function (i, name) { - if ( jQuery.attrFn ) { - jQuery.attrFn[ name ] = true; - } + // Handle event binding + jQuery.fn[name] = function (data, fn) { + if (fn == null) { + fn = data; + data = null; + } - if ( rkeyEvent.test( name ) ) { - jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks; - } + return arguments.length > 0 ? + this.on(name, null, data, fn) : + this.trigger(name); + }; - if ( rmouseEvent.test( name ) ) { - jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks; - } -}); + if (jQuery.attrFn) { + jQuery.attrFn[name] = true; + } + if (rkeyEvent.test(name)) { + jQuery.event.fixHooks[name] = jQuery.event.keyHooks; + } + + if (rmouseEvent.test(name)) { + jQuery.event.fixHooks[name] = jQuery.event.mouseHooks; + } + }); -/*! + /*! * Sizzle CSS Selector Engine * Copyright 2011, The Dojo Foundation * Released under the MIT, BSD, and GPL Licenses. * More information: http://sizzlejs.com/ */ -(function(){ - -var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, - expando = "sizcache" + (Math.random() + '').replace('.', ''), - done = 0, - toString = Object.prototype.toString, - hasDuplicate = false, - baseHasDuplicate = true, - rBackslash = /\\/g, - rReturn = /\r\n/g, - rNonWord = /\W/; + (function () { + + var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, + expando = "sizcache" + (Math.random() + '').replace('.', ''), + done = 0, + toString = Object.prototype.toString, + hasDuplicate = false, + baseHasDuplicate = true, + rBackslash = /\\/g, + rReturn = /\r\n/g, + rNonWord = /\W/; // Here we check if the JavaScript engine is using some sort of // optimization where it does not always call our comparision // function. If that is the case, discard the hasDuplicate value. // Thus far that includes Google Chrome. -[0, 0].sort(function() { - baseHasDuplicate = false; - return 0; -}); + [0, 0].sort(function () { + baseHasDuplicate = false; + return 0; + }); -var Sizzle = function( selector, context, results, seed ) { - results = results || []; - context = context || document; + var Sizzle = function (selector, context, results, seed) { + results = results || []; + context = context || document; - var origContext = context; + var origContext = context; - if ( context.nodeType !== 1 && context.nodeType !== 9 ) { - return []; - } - - if ( !selector || typeof selector !== "string" ) { - return results; - } + if (context.nodeType !== 1 && context.nodeType !== 9) { + return []; + } - var m, set, checkSet, extra, ret, cur, pop, i, - prune = true, - contextXML = Sizzle.isXML( context ), - parts = [], - soFar = selector; - - // Reset the position of the chunker regexp (start from head) - do { - chunker.exec( "" ); - m = chunker.exec( soFar ); - - if ( m ) { - soFar = m[3]; - - parts.push( m[1] ); - - if ( m[2] ) { - extra = m[3]; - break; + if (!selector || typeof selector !== "string") { + return results; } - } - } while ( m ); - if ( parts.length > 1 && origPOS.exec( selector ) ) { + var m, set, checkSet, extra, ret, cur, pop, i, + prune = true, + contextXML = Sizzle.isXML(context), + parts = [], + soFar = selector; - if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { - set = posProcess( parts[0] + parts[1], context, seed ); + // Reset the position of the chunker regexp (start from head) + do { + chunker.exec(""); + m = chunker.exec(soFar); - } else { - set = Expr.relative[ parts[0] ] ? - [ context ] : - Sizzle( parts.shift(), context ); + if (m) { + soFar = m[3]; - while ( parts.length ) { - selector = parts.shift(); + parts.push(m[1]); - if ( Expr.relative[ selector ] ) { - selector += parts.shift(); + if (m[2]) { + extra = m[3]; + break; + } } - - set = posProcess( selector, set, seed ); - } - } + } while (m); - } else { - // Take a shortcut and set the context if the root selector is an ID - // (but not if it'll be faster if the inner selector is an ID) - if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && - Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { - - ret = Sizzle.find( parts.shift(), context, contextXML ); - context = ret.expr ? - Sizzle.filter( ret.expr, ret.set )[0] : - ret.set[0]; - } + if (parts.length > 1 && origPOS.exec(selector)) { - if ( context ) { - ret = seed ? - { expr: parts.pop(), set: makeArray(seed) } : - Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); + if (parts.length === 2 && Expr.relative[parts[0]]) { + set = posProcess(parts[0] + parts[1], context, seed); - set = ret.expr ? - Sizzle.filter( ret.expr, ret.set ) : - ret.set; - - if ( parts.length > 0 ) { - checkSet = makeArray( set ); + } else { + set = Expr.relative[parts[0]] ? + [context] : + Sizzle(parts.shift(), context); - } else { - prune = false; - } + while (parts.length) { + selector = parts.shift(); - while ( parts.length ) { - cur = parts.pop(); - pop = cur; + if (Expr.relative[selector]) { + selector += parts.shift(); + } - if ( !Expr.relative[ cur ] ) { - cur = ""; - } else { - pop = parts.pop(); + set = posProcess(selector, set, seed); + } } - if ( pop == null ) { - pop = context; + } else { + // Take a shortcut and set the context if the root selector is an ID + // (but not if it'll be faster if the inner selector is an ID) + if (!seed && parts.length > 1 && context.nodeType === 9 && !contextXML && + Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1])) { + + ret = Sizzle.find(parts.shift(), context, contextXML); + context = ret.expr ? + Sizzle.filter(ret.expr, ret.set)[0] : + ret.set[0]; } - Expr.relative[ cur ]( checkSet, pop, contextXML ); - } + if (context) { + ret = seed ? + {expr: parts.pop(), set: makeArray(seed)} : + Sizzle.find(parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML); - } else { - checkSet = parts = []; - } - } + set = ret.expr ? + Sizzle.filter(ret.expr, ret.set) : + ret.set; - if ( !checkSet ) { - checkSet = set; - } + if (parts.length > 0) { + checkSet = makeArray(set); - if ( !checkSet ) { - Sizzle.error( cur || selector ); - } + } else { + prune = false; + } + + while (parts.length) { + cur = parts.pop(); + pop = cur; - if ( toString.call(checkSet) === "[object Array]" ) { - if ( !prune ) { - results.push.apply( results, checkSet ); + if (!Expr.relative[cur]) { + cur = ""; + } else { + pop = parts.pop(); + } + + if (pop == null) { + pop = context; + } - } else if ( context && context.nodeType === 1 ) { - for ( i = 0; checkSet[i] != null; i++ ) { - if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) { - results.push( set[i] ); + Expr.relative[cur](checkSet, pop, contextXML); + } + + } else { + checkSet = parts = []; } } - } else { - for ( i = 0; checkSet[i] != null; i++ ) { - if ( checkSet[i] && checkSet[i].nodeType === 1 ) { - results.push( set[i] ); - } + if (!checkSet) { + checkSet = set; } - } - } else { - makeArray( checkSet, results ); - } + if (!checkSet) { + Sizzle.error(cur || selector); + } - if ( extra ) { - Sizzle( extra, origContext, results, seed ); - Sizzle.uniqueSort( results ); - } + if (toString.call(checkSet) === "[object Array]") { + if (!prune) { + results.push.apply(results, checkSet); + + } else if (context && context.nodeType === 1) { + for (i = 0; checkSet[i] != null; i++) { + if (checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i]))) { + results.push(set[i]); + } + } + + } else { + for (i = 0; checkSet[i] != null; i++) { + if (checkSet[i] && checkSet[i].nodeType === 1) { + results.push(set[i]); + } + } + } + + } else { + makeArray(checkSet, results); + } - return results; -}; + if (extra) { + Sizzle(extra, origContext, results, seed); + Sizzle.uniqueSort(results); + } + + return results; + }; -Sizzle.uniqueSort = function( results ) { - if ( sortOrder ) { - hasDuplicate = baseHasDuplicate; - results.sort( sortOrder ); + Sizzle.uniqueSort = function (results) { + if (sortOrder) { + hasDuplicate = baseHasDuplicate; + results.sort(sortOrder); - if ( hasDuplicate ) { - for ( var i = 1; i < results.length; i++ ) { - if ( results[i] === results[ i - 1 ] ) { - results.splice( i--, 1 ); + if (hasDuplicate) { + for (var i = 1; i < results.length; i++) { + if (results[i] === results[i - 1]) { + results.splice(i--, 1); + } + } } } - } - } - return results; -}; + return results; + }; -Sizzle.matches = function( expr, set ) { - return Sizzle( expr, null, null, set ); -}; + Sizzle.matches = function (expr, set) { + return Sizzle(expr, null, null, set); + }; -Sizzle.matchesSelector = function( node, expr ) { - return Sizzle( expr, null, null, [node] ).length > 0; -}; + Sizzle.matchesSelector = function (node, expr) { + return Sizzle(expr, null, null, [node]).length > 0; + }; -Sizzle.find = function( expr, context, isXML ) { - var set, i, len, match, type, left; + Sizzle.find = function (expr, context, isXML) { + var set, i, len, match, type, left; - if ( !expr ) { - return []; - } + if (!expr) { + return []; + } - for ( i = 0, len = Expr.order.length; i < len; i++ ) { - type = Expr.order[i]; - - if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { - left = match[1]; - match.splice( 1, 1 ); + for (i = 0, len = Expr.order.length; i < len; i++) { + type = Expr.order[i]; - if ( left.substr( left.length - 1 ) !== "\\" ) { - match[1] = (match[1] || "").replace( rBackslash, "" ); - set = Expr.find[ type ]( match, context, isXML ); + if ((match = Expr.leftMatch[type].exec(expr))) { + left = match[1]; + match.splice(1, 1); - if ( set != null ) { - expr = expr.replace( Expr.match[ type ], "" ); - break; + if (left.substr(left.length - 1) !== "\\") { + match[1] = (match[1] || "").replace(rBackslash, ""); + set = Expr.find[type](match, context, isXML); + + if (set != null) { + expr = expr.replace(Expr.match[type], ""); + break; + } + } } } - } - } - if ( !set ) { - set = typeof context.getElementsByTagName !== "undefined" ? - context.getElementsByTagName( "*" ) : - []; - } + if (!set) { + set = typeof context.getElementsByTagName !== "undefined" ? + context.getElementsByTagName("*") : + []; + } - return { set: set, expr: expr }; -}; + return {set: set, expr: expr}; + }; -Sizzle.filter = function( expr, set, inplace, not ) { - var match, anyFound, - type, found, item, filter, left, - i, pass, - old = expr, - result = [], - curLoop = set, - isXMLFilter = set && set[0] && Sizzle.isXML( set[0] ); + Sizzle.filter = function (expr, set, inplace, not) { + var match, anyFound, + type, found, item, filter, left, + i, pass, + old = expr, + result = [], + curLoop = set, + isXMLFilter = set && set[0] && Sizzle.isXML(set[0]); - while ( expr && set.length ) { - for ( type in Expr.filter ) { - if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { - filter = Expr.filter[ type ]; - left = match[1]; + while (expr && set.length) { + for (type in Expr.filter) { + if ((match = Expr.leftMatch[type].exec(expr)) != null && match[2]) { + filter = Expr.filter[type]; + left = match[1]; - anyFound = false; + anyFound = false; - match.splice(1,1); + match.splice(1, 1); - if ( left.substr( left.length - 1 ) === "\\" ) { - continue; - } + if (left.substr(left.length - 1) === "\\") { + continue; + } - if ( curLoop === result ) { - result = []; - } + if (curLoop === result) { + result = []; + } - if ( Expr.preFilter[ type ] ) { - match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); + if (Expr.preFilter[type]) { + match = Expr.preFilter[type](match, curLoop, inplace, result, not, isXMLFilter); - if ( !match ) { - anyFound = found = true; + if (!match) { + anyFound = found = true; - } else if ( match === true ) { - continue; - } - } + } else if (match === true) { + continue; + } + } - if ( match ) { - for ( i = 0; (item = curLoop[i]) != null; i++ ) { - if ( item ) { - found = filter( item, match, i, curLoop ); - pass = not ^ found; + if (match) { + for (i = 0; (item = curLoop[i]) != null; i++) { + if (item) { + found = filter(item, match, i, curLoop); + pass = not ^ found; - if ( inplace && found != null ) { - if ( pass ) { - anyFound = true; + if (inplace && found != null) { + if (pass) { + anyFound = true; - } else { - curLoop[i] = false; + } else { + curLoop[i] = false; + } + + } else if (pass) { + result.push(item); + anyFound = true; + } } + } + } + + if (found !== undefined) { + if (!inplace) { + curLoop = result; + } + + expr = expr.replace(Expr.match[type], ""); - } else if ( pass ) { - result.push( item ); - anyFound = true; + if (!anyFound) { + return []; } + + break; } } } - if ( found !== undefined ) { - if ( !inplace ) { - curLoop = result; - } - - expr = expr.replace( Expr.match[ type ], "" ); + // Improper expression + if (expr === old) { + if (anyFound == null) { + Sizzle.error(expr); - if ( !anyFound ) { - return []; + } else { + break; } - - break; } + + old = expr; } - } - // Improper expression - if ( expr === old ) { - if ( anyFound == null ) { - Sizzle.error( expr ); + return curLoop; + }; + + Sizzle.error = function (msg) { + throw new Error("Syntax error, unrecognized expression: " + msg); + }; + /** + * Utility function for retreiving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ + var getText = Sizzle.getText = function (elem) { + var i, node, + nodeType = elem.nodeType, + ret = ""; + + if (nodeType) { + if (nodeType === 1 || nodeType === 9) { + // Use textContent || innerText for elements + if (typeof elem.textContent === 'string') { + return elem.textContent; + } else if (typeof elem.innerText === 'string') { + // Replace IE's carriage returns + return elem.innerText.replace(rReturn, ''); + } else { + // Traverse it's children + for (elem = elem.firstChild; elem; elem = elem.nextSibling) { + ret += getText(elem); + } + } + } else if (nodeType === 3 || nodeType === 4) { + return elem.nodeValue; + } } else { - break; + + // If no nodeType, this is expected to be an array + for (i = 0; (node = elem[i]); i++) { + // Do not traverse comment nodes + if (node.nodeType !== 8) { + ret += getText(node); + } + } } - } + return ret; + }; - old = expr; - } + var Expr = Sizzle.selectors = { + order: ["ID", "NAME", "TAG"], + + match: { + ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, + CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, + NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/, + ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/, + TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/, + CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/, + POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/, + PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ + }, - return curLoop; -}; + leftMatch: {}, -Sizzle.error = function( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); -}; + attrMap: { + "class": "className", + "for": "htmlFor" + }, -/** - * Utility function for retreiving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ -var getText = Sizzle.getText = function( elem ) { - var i, node, - nodeType = elem.nodeType, - ret = ""; - - if ( nodeType ) { - if ( nodeType === 1 || nodeType === 9 ) { - // Use textContent || innerText for elements - if ( typeof elem.textContent === 'string' ) { - return elem.textContent; - } else if ( typeof elem.innerText === 'string' ) { - // Replace IE's carriage returns - return elem.innerText.replace( rReturn, '' ); - } else { - // Traverse it's children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling) { - ret += getText( elem ); + attrHandle: { + href: function (elem) { + return elem.getAttribute("href"); + }, + type: function (elem) { + return elem.getAttribute("type"); } - } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - } else { + }, - // If no nodeType, this is expected to be an array - for ( i = 0; (node = elem[i]); i++ ) { - // Do not traverse comment nodes - if ( node.nodeType !== 8 ) { - ret += getText( node ); - } - } - } - return ret; -}; - -var Expr = Sizzle.selectors = { - order: [ "ID", "NAME", "TAG" ], - - match: { - ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, - CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, - NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/, - ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/, - TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/, - CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/, - POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/, - PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ - }, - - leftMatch: {}, - - attrMap: { - "class": "className", - "for": "htmlFor" - }, - - attrHandle: { - href: function( elem ) { - return elem.getAttribute( "href" ); - }, - type: function( elem ) { - return elem.getAttribute( "type" ); - } - }, + relative: { + "+": function (checkSet, part) { + var isPartStr = typeof part === "string", + isTag = isPartStr && !rNonWord.test(part), + isPartStrNotTag = isPartStr && !isTag; - relative: { - "+": function(checkSet, part){ - var isPartStr = typeof part === "string", - isTag = isPartStr && !rNonWord.test( part ), - isPartStrNotTag = isPartStr && !isTag; + if (isTag) { + part = part.toLowerCase(); + } - if ( isTag ) { - part = part.toLowerCase(); - } + for (var i = 0, l = checkSet.length, elem; i < l; i++) { + if ((elem = checkSet[i])) { + while ((elem = elem.previousSibling) && elem.nodeType !== 1) { + } - for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { - if ( (elem = checkSet[i]) ) { - while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} + checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? + elem || false : + elem === part; + } + } - checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? - elem || false : - elem === part; - } - } + if (isPartStrNotTag) { + Sizzle.filter(part, checkSet, true); + } + }, - if ( isPartStrNotTag ) { - Sizzle.filter( part, checkSet, true ); - } - }, + ">": function (checkSet, part) { + var elem, + isPartStr = typeof part === "string", + i = 0, + l = checkSet.length; - ">": function( checkSet, part ) { - var elem, - isPartStr = typeof part === "string", - i = 0, - l = checkSet.length; + if (isPartStr && !rNonWord.test(part)) { + part = part.toLowerCase(); - if ( isPartStr && !rNonWord.test( part ) ) { - part = part.toLowerCase(); + for (; i < l; i++) { + elem = checkSet[i]; - for ( ; i < l; i++ ) { - elem = checkSet[i]; + if (elem) { + var parent = elem.parentNode; + checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; + } + } + + } else { + for (; i < l; i++) { + elem = checkSet[i]; + + if (elem) { + checkSet[i] = isPartStr ? + elem.parentNode : + elem.parentNode === part; + } + } + + if (isPartStr) { + Sizzle.filter(part, checkSet, true); + } + } + }, + + "": function (checkSet, part, isXML) { + var nodeCheck, + doneName = done++, + checkFn = dirCheck; + + if (typeof part === "string" && !rNonWord.test(part)) { + part = part.toLowerCase(); + nodeCheck = part; + checkFn = dirNodeCheck; + } + + checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML); + }, + + "~": function (checkSet, part, isXML) { + var nodeCheck, + doneName = done++, + checkFn = dirCheck; + + if (typeof part === "string" && !rNonWord.test(part)) { + part = part.toLowerCase(); + nodeCheck = part; + checkFn = dirNodeCheck; + } + + checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML); + } + }, + + find: { + ID: function (match, context, isXML) { + if (typeof context.getElementById !== "undefined" && !isXML) { + var m = context.getElementById(match[1]); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + return m && m.parentNode ? [m] : []; + } + }, + + NAME: function (match, context) { + if (typeof context.getElementsByName !== "undefined") { + var ret = [], + results = context.getElementsByName(match[1]); + + for (var i = 0, l = results.length; i < l; i++) { + if (results[i].getAttribute("name") === match[1]) { + ret.push(results[i]); + } + } - if ( elem ) { - var parent = elem.parentNode; - checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; + return ret.length === 0 ? null : ret; } - } - - } else { - for ( ; i < l; i++ ) { - elem = checkSet[i]; + }, - if ( elem ) { - checkSet[i] = isPartStr ? - elem.parentNode : - elem.parentNode === part; + TAG: function (match, context) { + if (typeof context.getElementsByTagName !== "undefined") { + return context.getElementsByTagName(match[1]); } } + }, + preFilter: { + CLASS: function (match, curLoop, inplace, result, not, isXML) { + match = " " + match[1].replace(rBackslash, "") + " "; - if ( isPartStr ) { - Sizzle.filter( part, checkSet, true ); - } - } - }, + if (isXML) { + return match; + } - "": function(checkSet, part, isXML){ - var nodeCheck, - doneName = done++, - checkFn = dirCheck; + for (var i = 0, elem; (elem = curLoop[i]) != null; i++) { + if (elem) { + if (not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0)) { + if (!inplace) { + result.push(elem); + } - if ( typeof part === "string" && !rNonWord.test( part ) ) { - part = part.toLowerCase(); - nodeCheck = part; - checkFn = dirNodeCheck; - } + } else if (inplace) { + curLoop[i] = false; + } + } + } - checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML ); - }, + return false; + }, - "~": function( checkSet, part, isXML ) { - var nodeCheck, - doneName = done++, - checkFn = dirCheck; + ID: function (match) { + return match[1].replace(rBackslash, ""); + }, - if ( typeof part === "string" && !rNonWord.test( part ) ) { - part = part.toLowerCase(); - nodeCheck = part; - checkFn = dirNodeCheck; - } + TAG: function (match, curLoop) { + return match[1].replace(rBackslash, "").toLowerCase(); + }, - checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML ); - } - }, + CHILD: function (match) { + if (match[1] === "nth") { + if (!match[2]) { + Sizzle.error(match[0]); + } - find: { - ID: function( match, context, isXML ) { - if ( typeof context.getElementById !== "undefined" && !isXML ) { - var m = context.getElementById(match[1]); - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - return m && m.parentNode ? [m] : []; - } - }, + match[2] = match[2].replace(/^\+|\s*/g, ''); - NAME: function( match, context ) { - if ( typeof context.getElementsByName !== "undefined" ) { - var ret = [], - results = context.getElementsByName( match[1] ); + // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' + var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec( + match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || + !/\D/.test(match[2]) && "0n+" + match[2] || match[2]); - for ( var i = 0, l = results.length; i < l; i++ ) { - if ( results[i].getAttribute("name") === match[1] ) { - ret.push( results[i] ); + // calculate the numbers (first)n+(last) including if they are negative + match[2] = (test[1] + (test[2] || 1)) - 0; + match[3] = test[3] - 0; + } else if (match[2]) { + Sizzle.error(match[0]); } - } - - return ret.length === 0 ? null : ret; - } - }, - TAG: function( match, context ) { - if ( typeof context.getElementsByTagName !== "undefined" ) { - return context.getElementsByTagName( match[1] ); - } - } - }, - preFilter: { - CLASS: function( match, curLoop, inplace, result, not, isXML ) { - match = " " + match[1].replace( rBackslash, "" ) + " "; + // TODO: Move to normal caching system + match[0] = done++; - if ( isXML ) { - return match; - } + return match; + }, - for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { - if ( elem ) { - if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) { - if ( !inplace ) { - result.push( elem ); - } + ATTR: function (match, curLoop, inplace, result, not, isXML) { + var name = match[1] = match[1].replace(rBackslash, ""); - } else if ( inplace ) { - curLoop[i] = false; + if (!isXML && Expr.attrMap[name]) { + match[1] = Expr.attrMap[name]; } - } - } - return false; - }, - - ID: function( match ) { - return match[1].replace( rBackslash, "" ); - }, + // Handle if an un-quoted value was used + match[4] = (match[4] || match[5] || "").replace(rBackslash, ""); - TAG: function( match, curLoop ) { - return match[1].replace( rBackslash, "" ).toLowerCase(); - }, + if (match[2] === "~=") { + match[4] = " " + match[4] + " "; + } - CHILD: function( match ) { - if ( match[1] === "nth" ) { - if ( !match[2] ) { - Sizzle.error( match[0] ); - } + return match; + }, - match[2] = match[2].replace(/^\+|\s*/g, ''); + PSEUDO: function (match, curLoop, inplace, result, not) { + if (match[1] === "not") { + // If we're dealing with a complex expression, or a simple one + if ((chunker.exec(match[3]) || "").length > 1 || /^\w/.test(match[3])) { + match[3] = Sizzle(match[3], null, null, curLoop); - // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' - var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec( - match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || - !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); + } else { + var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); - // calculate the numbers (first)n+(last) including if they are negative - match[2] = (test[1] + (test[2] || 1)) - 0; - match[3] = test[3] - 0; - } - else if ( match[2] ) { - Sizzle.error( match[0] ); - } + if (!inplace) { + result.push.apply(result, ret); + } - // TODO: Move to normal caching system - match[0] = done++; + return false; + } - return match; - }, + } else if (Expr.match.POS.test(match[0]) || Expr.match.CHILD.test(match[0])) { + return true; + } - ATTR: function( match, curLoop, inplace, result, not, isXML ) { - var name = match[1] = match[1].replace( rBackslash, "" ); - - if ( !isXML && Expr.attrMap[name] ) { - match[1] = Expr.attrMap[name]; - } + return match; + }, - // Handle if an un-quoted value was used - match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" ); + POS: function (match) { + match.unshift(true); - if ( match[2] === "~=" ) { - match[4] = " " + match[4] + " "; - } + return match; + } + }, - return match; - }, + filters: { + enabled: function (elem) { + return elem.disabled === false && elem.type !== "hidden"; + }, - PSEUDO: function( match, curLoop, inplace, result, not ) { - if ( match[1] === "not" ) { - // If we're dealing with a complex expression, or a simple one - if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { - match[3] = Sizzle(match[3], null, null, curLoop); + disabled: function (elem) { + return elem.disabled === true; + }, - } else { - var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); + checked: function (elem) { + return elem.checked === true; + }, - if ( !inplace ) { - result.push.apply( result, ret ); + selected: function (elem) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if (elem.parentNode) { + elem.parentNode.selectedIndex; } - return false; - } - - } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { - return true; - } - - return match; - }, + return elem.selected === true; + }, - POS: function( match ) { - match.unshift( true ); + parent: function (elem) { + return !!elem.firstChild; + }, - return match; - } - }, - - filters: { - enabled: function( elem ) { - return elem.disabled === false && elem.type !== "hidden"; - }, + empty: function (elem) { + return !elem.firstChild; + }, - disabled: function( elem ) { - return elem.disabled === true; - }, + has: function (elem, i, match) { + return !!Sizzle(match[3], elem).length; + }, - checked: function( elem ) { - return elem.checked === true; - }, - - selected: function( elem ) { - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, + header: function (elem) { + return (/h\d/i).test(elem.nodeName); + }, - parent: function( elem ) { - return !!elem.firstChild; - }, + text: function (elem) { + var attr = elem.getAttribute("type"), type = elem.type; + // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) + // use getAttribute instead to test this case + return elem.nodeName.toLowerCase() === "input" && "text" === type && (attr === type || attr === null); + }, - empty: function( elem ) { - return !elem.firstChild; - }, + radio: function (elem) { + return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type; + }, - has: function( elem, i, match ) { - return !!Sizzle( match[3], elem ).length; - }, + checkbox: function (elem) { + return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type; + }, - header: function( elem ) { - return (/h\d/i).test( elem.nodeName ); - }, + file: function (elem) { + return elem.nodeName.toLowerCase() === "input" && "file" === elem.type; + }, - text: function( elem ) { - var attr = elem.getAttribute( "type" ), type = elem.type; - // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) - // use getAttribute instead to test this case - return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null ); - }, + password: function (elem) { + return elem.nodeName.toLowerCase() === "input" && "password" === elem.type; + }, - radio: function( elem ) { - return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type; - }, + submit: function (elem) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && "submit" === elem.type; + }, - checkbox: function( elem ) { - return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type; - }, + image: function (elem) { + return elem.nodeName.toLowerCase() === "input" && "image" === elem.type; + }, - file: function( elem ) { - return elem.nodeName.toLowerCase() === "input" && "file" === elem.type; - }, + reset: function (elem) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && "reset" === elem.type; + }, - password: function( elem ) { - return elem.nodeName.toLowerCase() === "input" && "password" === elem.type; - }, + button: function (elem) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && "button" === elem.type || name === "button"; + }, - submit: function( elem ) { - var name = elem.nodeName.toLowerCase(); - return (name === "input" || name === "button") && "submit" === elem.type; - }, + input: function (elem) { + return (/input|select|textarea|button/i).test(elem.nodeName); + }, - image: function( elem ) { - return elem.nodeName.toLowerCase() === "input" && "image" === elem.type; - }, + focus: function (elem) { + return elem === elem.ownerDocument.activeElement; + } + }, + setFilters: { + first: function (elem, i) { + return i === 0; + }, - reset: function( elem ) { - var name = elem.nodeName.toLowerCase(); - return (name === "input" || name === "button") && "reset" === elem.type; - }, + last: function (elem, i, match, array) { + return i === array.length - 1; + }, - button: function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && "button" === elem.type || name === "button"; - }, + even: function (elem, i) { + return i % 2 === 0; + }, - input: function( elem ) { - return (/input|select|textarea|button/i).test( elem.nodeName ); - }, + odd: function (elem, i) { + return i % 2 === 1; + }, - focus: function( elem ) { - return elem === elem.ownerDocument.activeElement; - } - }, - setFilters: { - first: function( elem, i ) { - return i === 0; - }, + lt: function (elem, i, match) { + return i < match[3] - 0; + }, - last: function( elem, i, match, array ) { - return i === array.length - 1; - }, + gt: function (elem, i, match) { + return i > match[3] - 0; + }, - even: function( elem, i ) { - return i % 2 === 0; - }, + nth: function (elem, i, match) { + return match[3] - 0 === i; + }, - odd: function( elem, i ) { - return i % 2 === 1; - }, + eq: function (elem, i, match) { + return match[3] - 0 === i; + } + }, + filter: { + PSEUDO: function (elem, match, i, array) { + var name = match[1], + filter = Expr.filters[name]; - lt: function( elem, i, match ) { - return i < match[3] - 0; - }, + if (filter) { + return filter(elem, i, match, array); - gt: function( elem, i, match ) { - return i > match[3] - 0; - }, + } else if (name === "contains") { + return (elem.textContent || elem.innerText || getText([elem]) || "").indexOf(match[3]) >= 0; - nth: function( elem, i, match ) { - return match[3] - 0 === i; - }, + } else if (name === "not") { + var not = match[3]; - eq: function( elem, i, match ) { - return match[3] - 0 === i; - } - }, - filter: { - PSEUDO: function( elem, match, i, array ) { - var name = match[1], - filter = Expr.filters[ name ]; + for (var j = 0, l = not.length; j < l; j++) { + if (not[j] === elem) { + return false; + } + } - if ( filter ) { - return filter( elem, i, match, array ); + return true; - } else if ( name === "contains" ) { - return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0; + } else { + Sizzle.error(name); + } + }, - } else if ( name === "not" ) { - var not = match[3]; + CHILD: function (elem, match) { + var first, last, + doneName, parent, cache, + count, diff, + type = match[1], + node = elem; + + switch (type) { + case "only": + case "first": + while ((node = node.previousSibling)) { + if (node.nodeType === 1) { + return false; + } + } - for ( var j = 0, l = not.length; j < l; j++ ) { - if ( not[j] === elem ) { - return false; - } - } + if (type === "first") { + return true; + } - return true; + node = elem; - } else { - Sizzle.error( name ); - } - }, + case "last": + while ((node = node.nextSibling)) { + if (node.nodeType === 1) { + return false; + } + } - CHILD: function( elem, match ) { - var first, last, - doneName, parent, cache, - count, diff, - type = match[1], - node = elem; - - switch ( type ) { - case "only": - case "first": - while ( (node = node.previousSibling) ) { - if ( node.nodeType === 1 ) { - return false; - } - } + return true; - if ( type === "first" ) { - return true; - } + case "nth": + first = match[2]; + last = match[3]; - node = elem; + if (first === 1 && last === 0) { + return true; + } - case "last": - while ( (node = node.nextSibling) ) { - if ( node.nodeType === 1 ) { - return false; - } - } + doneName = match[0]; + parent = elem.parentNode; - return true; + if (parent && (parent[expando] !== doneName || !elem.nodeIndex)) { + count = 0; - case "nth": - first = match[2]; - last = match[3]; + for (node = parent.firstChild; node; node = node.nextSibling) { + if (node.nodeType === 1) { + node.nodeIndex = ++count; + } + } - if ( first === 1 && last === 0 ) { - return true; - } - - doneName = match[0]; - parent = elem.parentNode; - - if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) { - count = 0; - - for ( node = parent.firstChild; node; node = node.nextSibling ) { - if ( node.nodeType === 1 ) { - node.nodeIndex = ++count; + parent[expando] = doneName; } - } - parent[ expando ] = doneName; - } - - diff = elem.nodeIndex - last; + diff = elem.nodeIndex - last; - if ( first === 0 ) { - return diff === 0; + if (first === 0) { + return diff === 0; - } else { - return ( diff % first === 0 && diff / first >= 0 ); + } else { + return (diff % first === 0 && diff / first >= 0); + } } - } - }, + }, - ID: function( elem, match ) { - return elem.nodeType === 1 && elem.getAttribute("id") === match; - }, + ID: function (elem, match) { + return elem.nodeType === 1 && elem.getAttribute("id") === match; + }, - TAG: function( elem, match ) { - return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match; - }, - - CLASS: function( elem, match ) { - return (" " + (elem.className || elem.getAttribute("class")) + " ") - .indexOf( match ) > -1; - }, + TAG: function (elem, match) { + return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match; + }, - ATTR: function( elem, match ) { - var name = match[1], - result = Sizzle.attr ? - Sizzle.attr( elem, name ) : - Expr.attrHandle[ name ] ? - Expr.attrHandle[ name ]( elem ) : - elem[ name ] != null ? - elem[ name ] : - elem.getAttribute( name ), - value = result + "", - type = match[2], - check = match[4]; - - return result == null ? - type === "!=" : - !type && Sizzle.attr ? - result != null : - type === "=" ? - value === check : - type === "*=" ? - value.indexOf(check) >= 0 : - type === "~=" ? - (" " + value + " ").indexOf(check) >= 0 : - !check ? - value && result !== false : - type === "!=" ? - value !== check : - type === "^=" ? - value.indexOf(check) === 0 : - type === "$=" ? - value.substr(value.length - check.length) === check : - type === "|=" ? - value === check || value.substr(0, check.length + 1) === check + "-" : - false; - }, + CLASS: function (elem, match) { + return (" " + (elem.className || elem.getAttribute("class")) + " ") + .indexOf(match) > -1; + }, + + ATTR: function (elem, match) { + var name = match[1], + result = Sizzle.attr ? + Sizzle.attr(elem, name) : + Expr.attrHandle[name] ? + Expr.attrHandle[name](elem) : + elem[name] != null ? + elem[name] : + elem.getAttribute(name), + value = result + "", + type = match[2], + check = match[4]; + + return result == null ? + type === "!=" : + !type && Sizzle.attr ? + result != null : + type === "=" ? + value === check : + type === "*=" ? + value.indexOf(check) >= 0 : + type === "~=" ? + (" " + value + " ").indexOf(check) >= 0 : + !check ? + value && result !== false : + type === "!=" ? + value !== check : + type === "^=" ? + value.indexOf(check) === 0 : + type === "$=" ? + value.substr(value.length - check.length) === check : + type === "|=" ? + value === check || value.substr(0, check.length + 1) === check + "-" : + false; + }, - POS: function( elem, match, i, array ) { - var name = match[2], - filter = Expr.setFilters[ name ]; + POS: function (elem, match, i, array) { + var name = match[2], + filter = Expr.setFilters[name]; - if ( filter ) { - return filter( elem, i, match, array ); + if (filter) { + return filter(elem, i, match, array); + } + } } - } - } -}; + }; -var origPOS = Expr.match.POS, - fescape = function(all, num){ - return "\\" + (num - 0 + 1); - }; + var origPOS = Expr.match.POS, + fescape = function (all, num) { + return "\\" + (num - 0 + 1); + }; -for ( var type in Expr.match ) { - Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) ); - Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) ); -} + for (var type in Expr.match) { + Expr.match[type] = new RegExp(Expr.match[type].source + (/(?![^\[]*\])(?![^\(]*\))/.source)); + Expr.leftMatch[type] = new RegExp(/(^(?:.|\r|\n)*?)/.source + Expr.match[type].source.replace(/\\(\d+)/g, fescape)); + } -var makeArray = function( array, results ) { - array = Array.prototype.slice.call( array, 0 ); + var makeArray = function (array, results) { + array = Array.prototype.slice.call(array, 0); - if ( results ) { - results.push.apply( results, array ); - return results; - } - - return array; -}; + if (results) { + results.push.apply(results, array); + return results; + } + + return array; + }; // Perform a simple check to determine if the browser is capable of // converting a NodeList to an array using builtin methods. // Also verifies that the returned array holds DOM nodes // (which is not the case in the Blackberry browser) -try { - Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType; + try { + Array.prototype.slice.call(document.documentElement.childNodes, 0)[0].nodeType; // Provide a fallback method if it does not work -} catch( e ) { - makeArray = function( array, results ) { - var i = 0, - ret = results || []; + } catch (e) { + makeArray = function (array, results) { + var i = 0, + ret = results || []; - if ( toString.call(array) === "[object Array]" ) { - Array.prototype.push.apply( ret, array ); + if (toString.call(array) === "[object Array]") { + Array.prototype.push.apply(ret, array); - } else { - if ( typeof array.length === "number" ) { - for ( var l = array.length; i < l; i++ ) { - ret.push( array[i] ); - } + } else { + if (typeof array.length === "number") { + for (var l = array.length; i < l; i++) { + ret.push(array[i]); + } - } else { - for ( ; array[i]; i++ ) { - ret.push( array[i] ); + } else { + for (; array[i]; i++) { + ret.push(array[i]); + } + } } - } + + return ret; + }; } - return ret; - }; -} + var sortOrder, siblingCheck; -var sortOrder, siblingCheck; + if (document.documentElement.compareDocumentPosition) { + sortOrder = function (a, b) { + if (a === b) { + hasDuplicate = true; + return 0; + } -if ( document.documentElement.compareDocumentPosition ) { - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - return 0; - } + if (!a.compareDocumentPosition || !b.compareDocumentPosition) { + return a.compareDocumentPosition ? -1 : 1; + } - if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { - return a.compareDocumentPosition ? -1 : 1; - } + return a.compareDocumentPosition(b) & 4 ? -1 : 1; + }; - return a.compareDocumentPosition(b) & 4 ? -1 : 1; - }; + } else { + sortOrder = function (a, b) { + // The nodes are identical, we can exit early + if (a === b) { + hasDuplicate = true; + return 0; -} else { - sortOrder = function( a, b ) { - // The nodes are identical, we can exit early - if ( a === b ) { - hasDuplicate = true; - return 0; + // Fallback to using sourceIndex (in IE) if it's available on both nodes + } else if (a.sourceIndex && b.sourceIndex) { + return a.sourceIndex - b.sourceIndex; + } - // Fallback to using sourceIndex (in IE) if it's available on both nodes - } else if ( a.sourceIndex && b.sourceIndex ) { - return a.sourceIndex - b.sourceIndex; - } + var al, bl, + ap = [], + bp = [], + aup = a.parentNode, + bup = b.parentNode, + cur = aup; - var al, bl, - ap = [], - bp = [], - aup = a.parentNode, - bup = b.parentNode, - cur = aup; + // If the nodes are siblings (or identical) we can do a quick check + if (aup === bup) { + return siblingCheck(a, b); - // If the nodes are siblings (or identical) we can do a quick check - if ( aup === bup ) { - return siblingCheck( a, b ); + // If no parents were found then the nodes are disconnected + } else if (!aup) { + return -1; - // If no parents were found then the nodes are disconnected - } else if ( !aup ) { - return -1; + } else if (!bup) { + return 1; + } - } else if ( !bup ) { - return 1; - } + // Otherwise they're somewhere else in the tree so we need + // to build up a full list of the parentNodes for comparison + while (cur) { + ap.unshift(cur); + cur = cur.parentNode; + } - // Otherwise they're somewhere else in the tree so we need - // to build up a full list of the parentNodes for comparison - while ( cur ) { - ap.unshift( cur ); - cur = cur.parentNode; - } + cur = bup; - cur = bup; + while (cur) { + bp.unshift(cur); + cur = cur.parentNode; + } - while ( cur ) { - bp.unshift( cur ); - cur = cur.parentNode; - } + al = ap.length; + bl = bp.length; - al = ap.length; - bl = bp.length; + // Start walking down the tree looking for a discrepancy + for (var i = 0; i < al && i < bl; i++) { + if (ap[i] !== bp[i]) { + return siblingCheck(ap[i], bp[i]); + } + } - // Start walking down the tree looking for a discrepancy - for ( var i = 0; i < al && i < bl; i++ ) { - if ( ap[i] !== bp[i] ) { - return siblingCheck( ap[i], bp[i] ); - } - } + // We ended someplace up the tree so do a sibling check + return i === al ? + siblingCheck(a, bp[i], -1) : + siblingCheck(ap[i], b, 1); + }; - // We ended someplace up the tree so do a sibling check - return i === al ? - siblingCheck( a, bp[i], -1 ) : - siblingCheck( ap[i], b, 1 ); - }; + siblingCheck = function (a, b, ret) { + if (a === b) { + return ret; + } - siblingCheck = function( a, b, ret ) { - if ( a === b ) { - return ret; - } + var cur = a.nextSibling; - var cur = a.nextSibling; + while (cur) { + if (cur === b) { + return -1; + } - while ( cur ) { - if ( cur === b ) { - return -1; - } + cur = cur.nextSibling; + } - cur = cur.nextSibling; + return 1; + }; } - return 1; - }; -} - // Check to see if the browser returns elements by name when // querying by getElementById (and provide a workaround) -(function(){ - // We're going to inject a fake input element with a specified name - var form = document.createElement("div"), - id = "script" + (new Date()).getTime(), - root = document.documentElement; - - form.innerHTML = ""; - - // Inject it into the root element, check its status, and remove it quickly - root.insertBefore( form, root.firstChild ); - - // The workaround has to do additional checks after a getElementById - // Which slows things down for other browsers (hence the branching) - if ( document.getElementById( id ) ) { - Expr.find.ID = function( match, context, isXML ) { - if ( typeof context.getElementById !== "undefined" && !isXML ) { - var m = context.getElementById(match[1]); - - return m ? - m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? - [m] : - undefined : - []; - } - }; + (function () { + // We're going to inject a fake input element with a specified name + var form = document.createElement("div"), + id = "script" + (new Date()).getTime(), + root = document.documentElement; + + form.innerHTML = ""; + + // Inject it into the root element, check its status, and remove it quickly + root.insertBefore(form, root.firstChild); + + // The workaround has to do additional checks after a getElementById + // Which slows things down for other browsers (hence the branching) + if (document.getElementById(id)) { + Expr.find.ID = function (match, context, isXML) { + if (typeof context.getElementById !== "undefined" && !isXML) { + var m = context.getElementById(match[1]); + + return m ? + m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? + [m] : + undefined : + []; + } + }; - Expr.filter.ID = function( elem, match ) { - var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); + Expr.filter.ID = function (elem, match) { + var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); - return elem.nodeType === 1 && node && node.nodeValue === match; - }; - } + return elem.nodeType === 1 && node && node.nodeValue === match; + }; + } - root.removeChild( form ); + root.removeChild(form); - // release memory in IE - root = form = null; -})(); + // release memory in IE + root = form = null; + })(); -(function(){ - // Check to see if the browser returns only elements - // when doing getElementsByTagName("*") + (function () { + // Check to see if the browser returns only elements + // when doing getElementsByTagName("*") - // Create a fake element - var div = document.createElement("div"); - div.appendChild( document.createComment("") ); + // Create a fake element + var div = document.createElement("div"); + div.appendChild(document.createComment("")); - // Make sure no comments are found - if ( div.getElementsByTagName("*").length > 0 ) { - Expr.find.TAG = function( match, context ) { - var results = context.getElementsByTagName( match[1] ); + // Make sure no comments are found + if (div.getElementsByTagName("*").length > 0) { + Expr.find.TAG = function (match, context) { + var results = context.getElementsByTagName(match[1]); - // Filter out possible comments - if ( match[1] === "*" ) { - var tmp = []; + // Filter out possible comments + if (match[1] === "*") { + var tmp = []; - for ( var i = 0; results[i]; i++ ) { - if ( results[i].nodeType === 1 ) { - tmp.push( results[i] ); + for (var i = 0; results[i]; i++) { + if (results[i].nodeType === 1) { + tmp.push(results[i]); + } + } + + results = tmp; } + + return results; + }; + } + + // Check to see if an attribute returns normalized href attributes + div.innerHTML = ""; + + if (div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && + div.firstChild.getAttribute("href") !== "#") { + + Expr.attrHandle.href = function (elem) { + return elem.getAttribute("href", 2); + }; + } + + // release memory in IE + div = null; + })(); + + if (document.querySelectorAll) { + (function () { + var oldSizzle = Sizzle, + div = document.createElement("div"), + id = "__sizzle__"; + + div.innerHTML = "

    "; + + // Safari can't handle uppercase or unicode characters when + // in quirks mode. + if (div.querySelectorAll && div.querySelectorAll(".TEST").length === 0) { + return; } - results = tmp; - } - - return results; - }; - } + Sizzle = function (query, context, extra, seed) { + context = context || document; - // Check to see if an attribute returns normalized href attributes - div.innerHTML = ""; + // Only use querySelectorAll on non-XML documents + // (ID selectors don't work in non-HTML documents) + if (!seed && !Sizzle.isXML(context)) { + // See if we find a selector to speed up + var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(query); - if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && - div.firstChild.getAttribute("href") !== "#" ) { + if (match && (context.nodeType === 1 || context.nodeType === 9)) { + // Speed-up: Sizzle("TAG") + if (match[1]) { + return makeArray(context.getElementsByTagName(query), extra); - Expr.attrHandle.href = function( elem ) { - return elem.getAttribute( "href", 2 ); - }; - } + // Speed-up: Sizzle(".CLASS") + } else if (match[2] && Expr.find.CLASS && context.getElementsByClassName) { + return makeArray(context.getElementsByClassName(match[2]), extra); + } + } - // release memory in IE - div = null; -})(); + if (context.nodeType === 9) { + // Speed-up: Sizzle("body") + // The body element only exists once, optimize finding it + if (query === "body" && context.body) { + return makeArray([context.body], extra); + + // Speed-up: Sizzle("#ID") + } else if (match && match[3]) { + var elem = context.getElementById(match[3]); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if (elem && elem.parentNode) { + // Handle the case where IE and Opera return items + // by name instead of ID + if (elem.id === match[3]) { + return makeArray([elem], extra); + } -if ( document.querySelectorAll ) { - (function(){ - var oldSizzle = Sizzle, - div = document.createElement("div"), - id = "__sizzle__"; + } else { + return makeArray([], extra); + } + } - div.innerHTML = "

    "; + try { + return makeArray(context.querySelectorAll(query), extra); + } catch (qsaError) { + } - // Safari can't handle uppercase or unicode characters when - // in quirks mode. - if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { - return; - } - - Sizzle = function( query, context, extra, seed ) { - context = context || document; + // qSA works strangely on Element-rooted queries + // We can work around this by specifying an extra ID on the root + // and working up from there (Thanks to Andrew Dupont for the technique) + // IE 8 doesn't work on object elements + } else if (context.nodeType === 1 && context.nodeName.toLowerCase() !== "object") { + var oldContext = context, + old = context.getAttribute("id"), + nid = old || id, + hasParent = context.parentNode, + relativeHierarchySelector = /^\s*[+~]/.test(query); + + if (!old) { + context.setAttribute("id", nid); + } else { + nid = nid.replace(/'/g, "\\$&"); + } + if (relativeHierarchySelector && hasParent) { + context = context.parentNode; + } - // Only use querySelectorAll on non-XML documents - // (ID selectors don't work in non-HTML documents) - if ( !seed && !Sizzle.isXML(context) ) { - // See if we find a selector to speed up - var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query ); - - if ( match && (context.nodeType === 1 || context.nodeType === 9) ) { - // Speed-up: Sizzle("TAG") - if ( match[1] ) { - return makeArray( context.getElementsByTagName( query ), extra ); - - // Speed-up: Sizzle(".CLASS") - } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) { - return makeArray( context.getElementsByClassName( match[2] ), extra ); - } - } - - if ( context.nodeType === 9 ) { - // Speed-up: Sizzle("body") - // The body element only exists once, optimize finding it - if ( query === "body" && context.body ) { - return makeArray( [ context.body ], extra ); - - // Speed-up: Sizzle("#ID") - } else if ( match && match[3] ) { - var elem = context.getElementById( match[3] ); + try { + if (!relativeHierarchySelector || hasParent) { + return makeArray(context.querySelectorAll("[id='" + nid + "'] " + query), extra); + } - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - if ( elem && elem.parentNode ) { - // Handle the case where IE and Opera return items - // by name instead of ID - if ( elem.id === match[3] ) { - return makeArray( [ elem ], extra ); + } catch (pseudoError) { + } finally { + if (!old) { + oldContext.removeAttribute("id"); + } } - - } else { - return makeArray( [], extra ); } } - - try { - return makeArray( context.querySelectorAll(query), extra ); - } catch(qsaError) {} - - // qSA works strangely on Element-rooted queries - // We can work around this by specifying an extra ID on the root - // and working up from there (Thanks to Andrew Dupont for the technique) - // IE 8 doesn't work on object elements - } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { - var oldContext = context, - old = context.getAttribute( "id" ), - nid = old || id, - hasParent = context.parentNode, - relativeHierarchySelector = /^\s*[+~]/.test( query ); - - if ( !old ) { - context.setAttribute( "id", nid ); - } else { - nid = nid.replace( /'/g, "\\$&" ); - } - if ( relativeHierarchySelector && hasParent ) { - context = context.parentNode; - } - try { - if ( !relativeHierarchySelector || hasParent ) { - return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra ); - } + return oldSizzle(query, context, extra, seed); + }; - } catch(pseudoError) { - } finally { - if ( !old ) { - oldContext.removeAttribute( "id" ); - } - } + for (var prop in oldSizzle) { + Sizzle[prop] = oldSizzle[prop]; } - } - - return oldSizzle(query, context, extra, seed); - }; - for ( var prop in oldSizzle ) { - Sizzle[ prop ] = oldSizzle[ prop ]; + // release memory in IE + div = null; + })(); } - // release memory in IE - div = null; - })(); -} + (function () { + var html = document.documentElement, + matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector; -(function(){ - var html = document.documentElement, - matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector; + if (matches) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9 fails this) + var disconnectedMatch = !matches.call(document.createElement("div"), "div"), + pseudoWorks = false; - if ( matches ) { - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9 fails this) - var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ), - pseudoWorks = false; + try { + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call(document.documentElement, "[test!='']:sizzle"); - try { - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( document.documentElement, "[test!='']:sizzle" ); - - } catch( pseudoError ) { - pseudoWorks = true; - } + } catch (pseudoError) { + pseudoWorks = true; + } - Sizzle.matchesSelector = function( node, expr ) { - // Make sure that attribute selectors are quoted - expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']"); - - if ( !Sizzle.isXML( node ) ) { - try { - if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) { - var ret = matches.call( node, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || !disconnectedMatch || - // As well, disconnected nodes are said to be in a document - // fragment in IE 9, so check for that - node.document && node.document.nodeType !== 11 ) { - return ret; + Sizzle.matchesSelector = function (node, expr) { + // Make sure that attribute selectors are quoted + expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']"); + + if (!Sizzle.isXML(node)) { + try { + if (pseudoWorks || !Expr.match.PSEUDO.test(expr) && !/!=/.test(expr)) { + var ret = matches.call(node, expr); + + // IE 9's matchesSelector returns false on disconnected nodes + if (ret || !disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9, so check for that + node.document && node.document.nodeType !== 11) { + return ret; + } + } + } catch (e) { } } - } catch(e) {} + + return Sizzle(expr, null, null, [node]).length > 0; + }; } + })(); - return Sizzle(expr, null, null, [node]).length > 0; - }; - } -})(); + (function () { + var div = document.createElement("div"); -(function(){ - var div = document.createElement("div"); + div.innerHTML = "
    "; - div.innerHTML = "
    "; + // Opera can't find a second classname (in 9.6) + // Also, make sure that getElementsByClassName actually exists + if (!div.getElementsByClassName || div.getElementsByClassName("e").length === 0) { + return; + } - // Opera can't find a second classname (in 9.6) - // Also, make sure that getElementsByClassName actually exists - if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) { - return; - } + // Safari caches class attributes, doesn't catch changes (in 3.2) + div.lastChild.className = "e"; - // Safari caches class attributes, doesn't catch changes (in 3.2) - div.lastChild.className = "e"; + if (div.getElementsByClassName("e").length === 1) { + return; + } - if ( div.getElementsByClassName("e").length === 1 ) { - return; - } - - Expr.order.splice(1, 0, "CLASS"); - Expr.find.CLASS = function( match, context, isXML ) { - if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { - return context.getElementsByClassName(match[1]); - } - }; + Expr.order.splice(1, 0, "CLASS"); + Expr.find.CLASS = function (match, context, isXML) { + if (typeof context.getElementsByClassName !== "undefined" && !isXML) { + return context.getElementsByClassName(match[1]); + } + }; - // release memory in IE - div = null; -})(); + // release memory in IE + div = null; + })(); -function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { - for ( var i = 0, l = checkSet.length; i < l; i++ ) { - var elem = checkSet[i]; + function dirNodeCheck(dir, cur, doneName, checkSet, nodeCheck, isXML) { + for (var i = 0, l = checkSet.length; i < l; i++) { + var elem = checkSet[i]; - if ( elem ) { - var match = false; + if (elem) { + var match = false; - elem = elem[dir]; + elem = elem[dir]; - while ( elem ) { - if ( elem[ expando ] === doneName ) { - match = checkSet[elem.sizset]; - break; - } + while (elem) { + if (elem[expando] === doneName) { + match = checkSet[elem.sizset]; + break; + } - if ( elem.nodeType === 1 && !isXML ){ - elem[ expando ] = doneName; - elem.sizset = i; - } + if (elem.nodeType === 1 && !isXML) { + elem[expando] = doneName; + elem.sizset = i; + } - if ( elem.nodeName.toLowerCase() === cur ) { - match = elem; - break; - } + if (elem.nodeName.toLowerCase() === cur) { + match = elem; + break; + } - elem = elem[dir]; - } + elem = elem[dir]; + } - checkSet[i] = match; + checkSet[i] = match; + } + } } - } -} -function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { - for ( var i = 0, l = checkSet.length; i < l; i++ ) { - var elem = checkSet[i]; + function dirCheck(dir, cur, doneName, checkSet, nodeCheck, isXML) { + for (var i = 0, l = checkSet.length; i < l; i++) { + var elem = checkSet[i]; - if ( elem ) { - var match = false; - - elem = elem[dir]; + if (elem) { + var match = false; - while ( elem ) { - if ( elem[ expando ] === doneName ) { - match = checkSet[elem.sizset]; - break; - } - - if ( elem.nodeType === 1 ) { - if ( !isXML ) { - elem[ expando ] = doneName; - elem.sizset = i; - } + elem = elem[dir]; - if ( typeof cur !== "string" ) { - if ( elem === cur ) { - match = true; + while (elem) { + if (elem[expando] === doneName) { + match = checkSet[elem.sizset]; break; } - } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { - match = elem; - break; + if (elem.nodeType === 1) { + if (!isXML) { + elem[expando] = doneName; + elem.sizset = i; + } + + if (typeof cur !== "string") { + if (elem === cur) { + match = true; + break; + } + + } else if (Sizzle.filter(cur, [elem]).length > 0) { + match = elem; + break; + } + } + + elem = elem[dir]; } - } - elem = elem[dir]; + checkSet[i] = match; + } } + } + + if (document.documentElement.contains) { + Sizzle.contains = function (a, b) { + return a !== b && (a.contains ? a.contains(b) : true); + }; + + } else if (document.documentElement.compareDocumentPosition) { + Sizzle.contains = function (a, b) { + return !!(a.compareDocumentPosition(b) & 16); + }; - checkSet[i] = match; + } else { + Sizzle.contains = function () { + return false; + }; } - } -} -if ( document.documentElement.contains ) { - Sizzle.contains = function( a, b ) { - return a !== b && (a.contains ? a.contains(b) : true); - }; + Sizzle.isXML = function (elem) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; -} else if ( document.documentElement.compareDocumentPosition ) { - Sizzle.contains = function( a, b ) { - return !!(a.compareDocumentPosition(b) & 16); - }; + return documentElement ? documentElement.nodeName !== "HTML" : false; + }; -} else { - Sizzle.contains = function() { - return false; - }; -} - -Sizzle.isXML = function( elem ) { - // documentElement is verified for cases where it doesn't yet exist - // (such as loading iframes in IE - #4833) - var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; - - return documentElement ? documentElement.nodeName !== "HTML" : false; -}; - -var posProcess = function( selector, context, seed ) { - var match, - tmpSet = [], - later = "", - root = context.nodeType ? [context] : context; - - // Position selectors must be done after the filter - // And so must :not(positional) so we move all PSEUDOs to the end - while ( (match = Expr.match.PSEUDO.exec( selector )) ) { - later += match[0]; - selector = selector.replace( Expr.match.PSEUDO, "" ); - } + var posProcess = function (selector, context, seed) { + var match, + tmpSet = [], + later = "", + root = context.nodeType ? [context] : context; - selector = Expr.relative[selector] ? selector + "*" : selector; + // Position selectors must be done after the filter + // And so must :not(positional) so we move all PSEUDOs to the end + while ((match = Expr.match.PSEUDO.exec(selector))) { + later += match[0]; + selector = selector.replace(Expr.match.PSEUDO, ""); + } - for ( var i = 0, l = root.length; i < l; i++ ) { - Sizzle( selector, root[i], tmpSet, seed ); - } + selector = Expr.relative[selector] ? selector + "*" : selector; - return Sizzle.filter( later, tmpSet ); -}; + for (var i = 0, l = root.length; i < l; i++) { + Sizzle(selector, root[i], tmpSet, seed); + } + + return Sizzle.filter(later, tmpSet); + }; // EXPOSE // Override sizzle attribute retrieval -Sizzle.attr = jQuery.attr; -Sizzle.selectors.attrMap = {}; -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; -jQuery.expr[":"] = jQuery.expr.filters; -jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; - - -})(); - - -var runtil = /Until$/, - rparentsprev = /^(?:parents|prevUntil|prevAll)/, - // Note: This RegExp should be improved, or likely pulled from Sizzle - rmultiselector = /,/, - isSimple = /^.[^:#\[\.,]*$/, - slice = Array.prototype.slice, - POS = jQuery.expr.match.POS, - // methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; + Sizzle.attr = jQuery.attr; + Sizzle.selectors.attrMap = {}; + jQuery.find = Sizzle; + jQuery.expr = Sizzle.selectors; + jQuery.expr[":"] = jQuery.expr.filters; + jQuery.unique = Sizzle.uniqueSort; + jQuery.text = Sizzle.getText; + jQuery.isXMLDoc = Sizzle.isXML; + jQuery.contains = Sizzle.contains; -jQuery.fn.extend({ - find: function( selector ) { - var self = this, - i, l; - if ( typeof selector !== "string" ) { - return jQuery( selector ).filter(function() { - for ( i = 0, l = self.length; i < l; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; + })(); + + + var runtil = /Until$/, + rparentsprev = /^(?:parents|prevUntil|prevAll)/, + // Note: This RegExp should be improved, or likely pulled from Sizzle + rmultiselector = /,/, + isSimple = /^.[^:#\[\.,]*$/, + slice = Array.prototype.slice, + POS = jQuery.expr.match.POS, + // methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + + jQuery.fn.extend({ + find: function (selector) { + var self = this, + i, l; + + if (typeof selector !== "string") { + return jQuery(selector).filter(function () { + for (i = 0, l = self.length; i < l; i++) { + if (jQuery.contains(self[i], this)) { + return true; + } } - } - }); - } + }); + } - var ret = this.pushStack( "", "find", selector ), - length, n, r; + var ret = this.pushStack("", "find", selector), + length, n, r; - for ( i = 0, l = this.length; i < l; i++ ) { - length = ret.length; - jQuery.find( selector, this[i], ret ); + for (i = 0, l = this.length; i < l; i++) { + length = ret.length; + jQuery.find(selector, this[i], ret); - if ( i > 0 ) { - // Make sure that the results are unique - for ( n = length; n < ret.length; n++ ) { - for ( r = 0; r < length; r++ ) { - if ( ret[r] === ret[n] ) { - ret.splice(n--, 1); - break; + if (i > 0) { + // Make sure that the results are unique + for (n = length; n < ret.length; n++) { + for (r = 0; r < length; r++) { + if (ret[r] === ret[n]) { + ret.splice(n--, 1); + break; + } } } } } - } - return ret; - }, + return ret; + }, - has: function( target ) { - var targets = jQuery( target ); - return this.filter(function() { - for ( var i = 0, l = targets.length; i < l; i++ ) { - if ( jQuery.contains( this, targets[i] ) ) { - return true; + has: function (target) { + var targets = jQuery(target); + return this.filter(function () { + for (var i = 0, l = targets.length; i < l; i++) { + if (jQuery.contains(this, targets[i])) { + return true; + } } - } - }); - }, + }); + }, + + not: function (selector) { + return this.pushStack(winnow(this, selector, false), "not", selector); + }, - not: function( selector ) { - return this.pushStack( winnow(this, selector, false), "not", selector); - }, + filter: function (selector) { + return this.pushStack(winnow(this, selector, true), "filter", selector); + }, - filter: function( selector ) { - return this.pushStack( winnow(this, selector, true), "filter", selector ); - }, + is: function (selector) { + return !!selector && ( + typeof selector === "string" ? + // If this is a positional selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + POS.test(selector) ? + jQuery(selector, this.context).index(this[0]) >= 0 : + jQuery.filter(selector, this).length > 0 : + this.filter(selector).length > 0); + }, - is: function( selector ) { - return !!selector && ( - typeof selector === "string" ? - // If this is a positional selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - POS.test( selector ) ? - jQuery( selector, this.context ).index( this[0] ) >= 0 : - jQuery.filter( selector, this ).length > 0 : - this.filter( selector ).length > 0 ); - }, + closest: function (selectors, context) { + var ret = [], i, l, cur = this[0]; - closest: function( selectors, context ) { - var ret = [], i, l, cur = this[0]; - - // Array (deprecated as of jQuery 1.7) - if ( jQuery.isArray( selectors ) ) { - var level = 1; + // Array (deprecated as of jQuery 1.7) + if (jQuery.isArray(selectors)) { + var level = 1; - while ( cur && cur.ownerDocument && cur !== context ) { - for ( i = 0; i < selectors.length; i++ ) { + while (cur && cur.ownerDocument && cur !== context) { + for (i = 0; i < selectors.length; i++) { - if ( jQuery( cur ).is( selectors[ i ] ) ) { - ret.push({ selector: selectors[ i ], elem: cur, level: level }); + if (jQuery(cur).is(selectors[i])) { + ret.push({selector: selectors[i], elem: cur, level: level}); + } } + + cur = cur.parentNode; + level++; } - cur = cur.parentNode; - level++; + return ret; } - return ret; - } - - // String - var pos = POS.test( selectors ) || typeof selectors !== "string" ? - jQuery( selectors, context || this.context ) : + // String + var pos = POS.test(selectors) || typeof selectors !== "string" ? + jQuery(selectors, context || this.context) : 0; - for ( i = 0, l = this.length; i < l; i++ ) { - cur = this[i]; - - while ( cur ) { - if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) { - ret.push( cur ); - break; + for (i = 0, l = this.length; i < l; i++) { + cur = this[i]; - } else { - cur = cur.parentNode; - if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) { + while (cur) { + if (pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors)) { + ret.push(cur); break; + + } else { + cur = cur.parentNode; + if (!cur || !cur.ownerDocument || cur === context || cur.nodeType === 11) { + break; + } } } } - } - ret = ret.length > 1 ? jQuery.unique( ret ) : ret; + ret = ret.length > 1 ? jQuery.unique(ret) : ret; - return this.pushStack( ret, "closest", selectors ); - }, + return this.pushStack(ret, "closest", selectors); + }, - // Determine the position of an element within - // the matched set of elements - index: function( elem ) { + // Determine the position of an element within + // the matched set of elements + index: function (elem) { - // No argument, return index in parent - if ( !elem ) { - return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1; - } + // No argument, return index in parent + if (!elem) { + return (this[0] && this[0].parentNode) ? this.prevAll().length : -1; + } - // index in selector - if ( typeof elem === "string" ) { - return jQuery.inArray( this[0], jQuery( elem ) ); - } + // index in selector + if (typeof elem === "string") { + return jQuery.inArray(this[0], jQuery(elem)); + } - // Locate the position of the desired element - return jQuery.inArray( - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[0] : elem, this ); - }, - - add: function( selector, context ) { - var set = typeof selector === "string" ? - jQuery( selector, context ) : - jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ), - all = jQuery.merge( this.get(), set ); - - return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ? - all : - jQuery.unique( all ) ); - }, - - andSelf: function() { - return this.add( this.prevObject ); - } -}); + // Locate the position of the desired element + return jQuery.inArray( + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[0] : elem, this); + }, + + add: function (selector, context) { + var set = typeof selector === "string" ? + jQuery(selector, context) : + jQuery.makeArray(selector && selector.nodeType ? [selector] : selector), + all = jQuery.merge(this.get(), set); + + return this.pushStack(isDisconnected(set[0]) || isDisconnected(all[0]) ? + all : + jQuery.unique(all)); + }, + + andSelf: function () { + return this.add(this.prevObject); + } + }); // A painfully simple check to see if an element is disconnected // from a document (should be improved, where feasible). -function isDisconnected( node ) { - return !node || !node.parentNode || node.parentNode.nodeType === 11; -} - -jQuery.each({ - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return jQuery.dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, i, until ) { - return jQuery.dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return jQuery.nth( elem, 2, "nextSibling" ); - }, - prev: function( elem ) { - return jQuery.nth( elem, 2, "previousSibling" ); - }, - nextAll: function( elem ) { - return jQuery.dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return jQuery.dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, i, until ) { - return jQuery.dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, i, until ) { - return jQuery.dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return jQuery.sibling( elem.parentNode.firstChild, elem ); - }, - children: function( elem ) { - return jQuery.sibling( elem.firstChild ); - }, - contents: function( elem ) { - return jQuery.nodeName( elem, "iframe" ) ? - elem.contentDocument || elem.contentWindow.document : - jQuery.makeArray( elem.childNodes ); + function isDisconnected(node) { + return !node || !node.parentNode || node.parentNode.nodeType === 11; } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var ret = jQuery.map( this, fn, until ); - if ( !runtil.test( name ) ) { - selector = until; + jQuery.each({ + parent: function (elem) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function (elem) { + return jQuery.dir(elem, "parentNode"); + }, + parentsUntil: function (elem, i, until) { + return jQuery.dir(elem, "parentNode", until); + }, + next: function (elem) { + return jQuery.nth(elem, 2, "nextSibling"); + }, + prev: function (elem) { + return jQuery.nth(elem, 2, "previousSibling"); + }, + nextAll: function (elem) { + return jQuery.dir(elem, "nextSibling"); + }, + prevAll: function (elem) { + return jQuery.dir(elem, "previousSibling"); + }, + nextUntil: function (elem, i, until) { + return jQuery.dir(elem, "nextSibling", until); + }, + prevUntil: function (elem, i, until) { + return jQuery.dir(elem, "previousSibling", until); + }, + siblings: function (elem) { + return jQuery.sibling(elem.parentNode.firstChild, elem); + }, + children: function (elem) { + return jQuery.sibling(elem.firstChild); + }, + contents: function (elem) { + return jQuery.nodeName(elem, "iframe") ? + elem.contentDocument || elem.contentWindow.document : + jQuery.makeArray(elem.childNodes); } + }, function (name, fn) { + jQuery.fn[name] = function (until, selector) { + var ret = jQuery.map(this, fn, until); - if ( selector && typeof selector === "string" ) { - ret = jQuery.filter( selector, ret ); - } + if (!runtil.test(name)) { + selector = until; + } - ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret; + if (selector && typeof selector === "string") { + ret = jQuery.filter(selector, ret); + } - if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) { - ret = ret.reverse(); - } + ret = this.length > 1 && !guaranteedUnique[name] ? jQuery.unique(ret) : ret; - return this.pushStack( ret, name, slice.call( arguments ).join(",") ); - }; -}); + if ((this.length > 1 || rmultiselector.test(selector)) && rparentsprev.test(name)) { + ret = ret.reverse(); + } -jQuery.extend({ - filter: function( expr, elems, not ) { - if ( not ) { - expr = ":not(" + expr + ")"; - } + return this.pushStack(ret, name, slice.call(arguments).join(",")); + }; + }); - return elems.length === 1 ? - jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] : - jQuery.find.matches(expr, elems); - }, + jQuery.extend({ + filter: function (expr, elems, not) { + if (not) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 ? + jQuery.find.matchesSelector(elems[0], expr) ? [elems[0]] : [] : + jQuery.find.matches(expr, elems); + }, - dir: function( elem, dir, until ) { - var matched = [], - cur = elem[ dir ]; + dir: function (elem, dir, until) { + var matched = [], + cur = elem[dir]; - while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { - if ( cur.nodeType === 1 ) { - matched.push( cur ); + while (cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery(cur).is(until))) { + if (cur.nodeType === 1) { + matched.push(cur); + } + cur = cur[dir]; } - cur = cur[dir]; - } - return matched; - }, + return matched; + }, - nth: function( cur, result, dir, elem ) { - result = result || 1; - var num = 0; + nth: function (cur, result, dir, elem) { + result = result || 1; + var num = 0; - for ( ; cur; cur = cur[dir] ) { - if ( cur.nodeType === 1 && ++num === result ) { - break; + for (; cur; cur = cur[dir]) { + if (cur.nodeType === 1 && ++num === result) { + break; + } } - } - return cur; - }, + return cur; + }, - sibling: function( n, elem ) { - var r = []; + sibling: function (n, elem) { + var r = []; - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - r.push( n ); + for (; n; n = n.nextSibling) { + if (n.nodeType === 1 && n !== elem) { + r.push(n); + } } - } - return r; - } -}); + return r; + } + }); // Implement the identical functionality for filter and not -function winnow( elements, qualifier, keep ) { + function winnow(elements, qualifier, keep) { - // Can't pass null or undefined to indexOf in Firefox 4 - // Set to 0 to skip string check - qualifier = qualifier || 0; + // Can't pass null or undefined to indexOf in Firefox 4 + // Set to 0 to skip string check + qualifier = qualifier || 0; - if ( jQuery.isFunction( qualifier ) ) { - return jQuery.grep(elements, function( elem, i ) { - var retVal = !!qualifier.call( elem, i, elem ); - return retVal === keep; - }); + if (jQuery.isFunction(qualifier)) { + return jQuery.grep(elements, function (elem, i) { + var retVal = !!qualifier.call(elem, i, elem); + return retVal === keep; + }); - } else if ( qualifier.nodeType ) { - return jQuery.grep(elements, function( elem, i ) { - return ( elem === qualifier ) === keep; - }); + } else if (qualifier.nodeType) { + return jQuery.grep(elements, function (elem, i) { + return (elem === qualifier) === keep; + }); - } else if ( typeof qualifier === "string" ) { - var filtered = jQuery.grep(elements, function( elem ) { - return elem.nodeType === 1; - }); + } else if (typeof qualifier === "string") { + var filtered = jQuery.grep(elements, function (elem) { + return elem.nodeType === 1; + }); - if ( isSimple.test( qualifier ) ) { - return jQuery.filter(qualifier, filtered, !keep); - } else { - qualifier = jQuery.filter( qualifier, filtered ); + if (isSimple.test(qualifier)) { + return jQuery.filter(qualifier, filtered, !keep); + } else { + qualifier = jQuery.filter(qualifier, filtered); + } } + + return jQuery.grep(elements, function (elem, i) { + return (jQuery.inArray(elem, qualifier) >= 0) === keep; + }); } - return jQuery.grep(elements, function( elem, i ) { - return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep; - }); -} + function createSafeFragment(document) { + var list = nodeNames.split("|"), + safeFrag = document.createDocumentFragment(); + if (safeFrag.createElement) { + while (list.length) { + safeFrag.createElement( + list.pop() + ); + } + } + return safeFrag; + } + var nodeNames = "abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|" + + "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", + rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, + rleadingWhitespace = /^\s+/, + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig, + rtagName = /<([\w:]+)/, + rtbody = /", ""], + legend: [1, "
    ", "
    "], + thead: [1, "", "
    "], + tr: [2, "", "
    "], + td: [3, "", "
    "], + col: [2, "", "
    "], + area: [1, "", ""], + _default: [0, "", ""] + }, + safeFragment = createSafeFragment(document); -function createSafeFragment( document ) { - var list = nodeNames.split( "|" ), - safeFrag = document.createDocumentFragment(); + wrapMap.optgroup = wrapMap.option; + wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; + wrapMap.th = wrapMap.td; - if ( safeFrag.createElement ) { - while ( list.length ) { - safeFrag.createElement( - list.pop() - ); - } +// IE can't serialize and
    - Snippet: - - - - - - - - - - - - - - - - - - - - - - - - - -
    DirectiveHowSourceRendered
    ng-bind-htmlAutomatically uses $sanitize
    <div ng-bind-html="snippet">
    </div>
    ng-bind-htmlBypass $sanitize by explicitly trusting the dangerous value -
    <div ng-bind-html="deliberatelyTrustDangerousSnippet()">
    -</div>
    -
    ng-bindAutomatically escapes
    <div ng-bind="snippet">
    </div>
    -
    - - + Snippet: + + + + + + + + + + + + + + + + + + + + + + + + + +
    DirectiveHowSourceRendered
    ng-bind-htmlAutomatically uses $sanitize
    <div ng-bind-html="snippet">
    </div>
    ng-bind-htmlBypass $sanitize by explicitly trusting the dangerous value +
    <div ng-bind-html="deliberatelyTrustDangerousSnippet()">
    +     </div>
    +
    ng-bindAutomatically escapes
    <div ng-bind="snippet">
    </div>
    + + + it('should sanitize the html snippet by default', function() { expect(element(by.css('#bind-html-with-sanitize div')).getInnerHtml()). toBe('

    an html\nclick here\nsnippet

    '); @@ -134,41 +135,41 @@ var $sanitizeMinErr = angular.$$minErr('$sanitize'); expect(element(by.css('#bind-default div')).getInnerHtml()).toBe( "new <b onclick=\"alert(1)\">text</b>"); }); -
    - - */ -function $SanitizeProvider() { - this.$get = ['$$sanitizeUri', function($$sanitizeUri) { - return function(html) { - var buf = []; - htmlParser(html, htmlSanitizeWriter(buf, function(uri, isImage) { - return !/^unsafe/.test($$sanitizeUri(uri, isImage)); - })); - return buf.join(''); - }; - }]; -} - -function sanitizeText(chars) { - var buf = []; - var writer = htmlSanitizeWriter(buf, angular.noop); - writer.chars(chars); - return buf.join(''); -} +
    + + */ + function $SanitizeProvider() { + this.$get = ['$$sanitizeUri', function ($$sanitizeUri) { + return function (html) { + var buf = []; + htmlParser(html, htmlSanitizeWriter(buf, function (uri, isImage) { + return !/^unsafe/.test($$sanitizeUri(uri, isImage)); + })); + return buf.join(''); + }; + }]; + } + + function sanitizeText(chars) { + var buf = []; + var writer = htmlSanitizeWriter(buf, angular.noop); + writer.chars(chars); + return buf.join(''); + } // Regular Expressions for parsing tags and attributes -var START_TAG_REGEXP = - /^<\s*([\w:-]+)((?:\s+[\w:-]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)\s*>/, - END_TAG_REGEXP = /^<\s*\/\s*([\w:-]+)[^>]*>/, - ATTR_REGEXP = /([\w:-]+)(?:\s*=\s*(?:(?:"((?:[^"])*)")|(?:'((?:[^'])*)')|([^>\s]+)))?/g, - BEGIN_TAG_REGEXP = /^/g, - DOCTYPE_REGEXP = /]*?)>/i, - CDATA_REGEXP = //g, - // Match everything outside of normal chars and " (quote character) - NON_ALPHANUMERIC_REGEXP = /([^\#-~| |!])/g; + var START_TAG_REGEXP = + /^<\s*([\w:-]+)((?:\s+[\w:-]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)\s*>/, + END_TAG_REGEXP = /^<\s*\/\s*([\w:-]+)[^>]*>/, + ATTR_REGEXP = /([\w:-]+)(?:\s*=\s*(?:(?:"((?:[^"])*)")|(?:'((?:[^'])*)')|([^>\s]+)))?/g, + BEGIN_TAG_REGEXP = /^/g, + DOCTYPE_REGEXP = /]*?)>/i, + CDATA_REGEXP = //g, + // Match everything outside of normal chars and " (quote character) + NON_ALPHANUMERIC_REGEXP = /([^\#-~| |!])/g; // Good source of info about elements and attributes @@ -177,326 +178,327 @@ var START_TAG_REGEXP = // Safe Void Elements - HTML5 // http://dev.w3.org/html5/spec/Overview.html#void-elements -var voidElements = makeMap("area,br,col,hr,img,wbr"); + var voidElements = makeMap("area,br,col,hr,img,wbr"); // Elements that you can, intentionally, leave open (and which close themselves) // http://dev.w3.org/html5/spec/Overview.html#optional-tags -var optionalEndTagBlockElements = makeMap("colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr"), - optionalEndTagInlineElements = makeMap("rp,rt"), - optionalEndTagElements = angular.extend({}, - optionalEndTagInlineElements, - optionalEndTagBlockElements); + var optionalEndTagBlockElements = makeMap("colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr"), + optionalEndTagInlineElements = makeMap("rp,rt"), + optionalEndTagElements = angular.extend({}, + optionalEndTagInlineElements, + optionalEndTagBlockElements); // Safe Block Elements - HTML5 -var blockElements = angular.extend({}, optionalEndTagBlockElements, makeMap("address,article," + - "aside,blockquote,caption,center,del,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5," + - "h6,header,hgroup,hr,ins,map,menu,nav,ol,pre,script,section,table,ul")); + var blockElements = angular.extend({}, optionalEndTagBlockElements, makeMap("address,article," + + "aside,blockquote,caption,center,del,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5," + + "h6,header,hgroup,hr,ins,map,menu,nav,ol,pre,script,section,table,ul")); // Inline Elements - HTML5 -var inlineElements = angular.extend({}, optionalEndTagInlineElements, makeMap("a,abbr,acronym,b," + - "bdi,bdo,big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,q,ruby,rp,rt,s," + - "samp,small,span,strike,strong,sub,sup,time,tt,u,var")); + var inlineElements = angular.extend({}, optionalEndTagInlineElements, makeMap("a,abbr,acronym,b," + + "bdi,bdo,big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,q,ruby,rp,rt,s," + + "samp,small,span,strike,strong,sub,sup,time,tt,u,var")); // Special Elements (can contain anything) -var specialElements = makeMap("script,style"); + var specialElements = makeMap("script,style"); -var validElements = angular.extend({}, - voidElements, - blockElements, - inlineElements, - optionalEndTagElements); + var validElements = angular.extend({}, + voidElements, + blockElements, + inlineElements, + optionalEndTagElements); //Attributes that have href and hence need to be sanitized -var uriAttrs = makeMap("background,cite,href,longdesc,src,usemap"); -var validAttrs = angular.extend({}, uriAttrs, makeMap( - 'abbr,align,alt,axis,bgcolor,border,cellpadding,cellspacing,class,clear,'+ - 'color,cols,colspan,compact,coords,dir,face,headers,height,hreflang,hspace,'+ - 'ismap,lang,language,nohref,nowrap,rel,rev,rows,rowspan,rules,'+ - 'scope,scrolling,shape,size,span,start,summary,target,title,type,'+ - 'valign,value,vspace,width')); - -function makeMap(str) { - var obj = {}, items = str.split(','), i; - for (i = 0; i < items.length; i++) obj[items[i]] = true; - return obj; -} - - -/** - * @example - * htmlParser(htmlString, { - * start: function(tag, attrs, unary) {}, - * end: function(tag) {}, - * chars: function(text) {}, - * comment: function(text) {} - * }); - * - * @param {string} html string - * @param {object} handler - */ -function htmlParser( html, handler ) { - var index, chars, match, stack = [], last = html; - stack.last = function() { return stack[ stack.length - 1 ]; }; - - while ( html ) { - chars = true; - - // Make sure we're not in a script or style element - if ( !stack.last() || !specialElements[ stack.last() ] ) { - - // Comment - if ( html.indexOf("", index) === index) { - if (handler.comment) handler.comment( html.substring( 4, index ) ); - html = html.substring( index + 3 ); - chars = false; - } - // DOCTYPE - } else if ( DOCTYPE_REGEXP.test(html) ) { - match = html.match( DOCTYPE_REGEXP ); - - if ( match ) { - html = html.replace( match[0] , ''); - chars = false; - } - // end tag - } else if ( BEGING_END_TAGE_REGEXP.test(html) ) { - match = html.match( END_TAG_REGEXP ); - - if ( match ) { - html = html.substring( match[0].length ); - match[0].replace( END_TAG_REGEXP, parseEndTag ); - chars = false; - } - - // start tag - } else if ( BEGIN_TAG_REGEXP.test(html) ) { - match = html.match( START_TAG_REGEXP ); - - if ( match ) { - html = html.substring( match[0].length ); - match[0].replace( START_TAG_REGEXP, parseStartTag ); - chars = false; - } - } - - if ( chars ) { - index = html.indexOf("<"); - - var text = index < 0 ? html : html.substring( 0, index ); - html = index < 0 ? "" : html.substring( index ); - - if (handler.chars) handler.chars( decodeEntities(text) ); - } - - } else { - html = html.replace(new RegExp("(.*)<\\s*\\/\\s*" + stack.last() + "[^>]*>", 'i'), - function(all, text){ - text = text.replace(COMMENT_REGEXP, "$1").replace(CDATA_REGEXP, "$1"); - - if (handler.chars) handler.chars( decodeEntities(text) ); - - return ""; - }); - - parseEndTag( "", stack.last() ); - } - - if ( html == last ) { - throw $sanitizeMinErr('badparse', "The sanitizer was unable to parse the following block " + - "of html: {0}", html); - } - last = html; - } - - // Clean up any remaining tags - parseEndTag(); - - function parseStartTag( tag, tagName, rest, unary ) { - tagName = angular.lowercase(tagName); - if ( blockElements[ tagName ] ) { - while ( stack.last() && inlineElements[ stack.last() ] ) { - parseEndTag( "", stack.last() ); - } - } - - if ( optionalEndTagElements[ tagName ] && stack.last() == tagName ) { - parseEndTag( "", tagName ); - } - - unary = voidElements[ tagName ] || !!unary; - - if ( !unary ) - stack.push( tagName ); - - var attrs = {}; - - rest.replace(ATTR_REGEXP, - function(match, name, doubleQuotedValue, singleQuotedValue, unquotedValue) { - var value = doubleQuotedValue - || singleQuotedValue - || unquotedValue - || ''; - - attrs[name] = decodeEntities(value); - }); - if (handler.start) handler.start( tagName, attrs, unary ); - } - - function parseEndTag( tag, tagName ) { - var pos = 0, i; - tagName = angular.lowercase(tagName); - if ( tagName ) - // Find the closest opened tag of the same type - for ( pos = stack.length - 1; pos >= 0; pos-- ) - if ( stack[ pos ] == tagName ) - break; - - if ( pos >= 0 ) { - // Close all the open elements, up the stack - for ( i = stack.length - 1; i >= pos; i-- ) - if (handler.end) handler.end( stack[ i ] ); - - // Remove the open elements from the stack - stack.length = pos; - } - } -} - -var hiddenPre=document.createElement("pre"); -var spaceRe = /^(\s*)([\s\S]*?)(\s*)$/; -/** - * decodes all entities into regular string - * @param value - * @returns {string} A string with decoded entities. - */ -function decodeEntities(value) { - if (!value) { return ''; } - - // Note: IE8 does not preserve spaces at the start/end of innerHTML - // so we must capture them and reattach them afterward - var parts = spaceRe.exec(value); - var spaceBefore = parts[1]; - var spaceAfter = parts[3]; - var content = parts[2]; - if (content) { - hiddenPre.innerHTML=content.replace(//g, '>'); -} - -/** - * create an HTML/XML writer which writes to buffer - * @param {Array} buf use buf.jain('') to get out sanitized html string - * @returns {object} in the form of { - * start: function(tag, attrs, unary) {}, - * end: function(tag) {}, - * chars: function(text) {}, - * comment: function(text) {} - * } - */ -function htmlSanitizeWriter(buf, uriValidator){ - var ignore = false; - var out = angular.bind(buf, buf.push); - return { - start: function(tag, attrs, unary){ - tag = angular.lowercase(tag); - if (!ignore && specialElements[tag]) { - ignore = tag; - } - if (!ignore && validElements[tag] === true) { - out('<'); - out(tag); - angular.forEach(attrs, function(value, key){ - var lkey=angular.lowercase(key); - var isImage = (tag === 'img' && lkey === 'src') || (lkey === 'background'); - if (validAttrs[lkey] === true && - (uriAttrs[lkey] !== true || uriValidator(value, isImage))) { - out(' '); - out(key); - out('="'); - out(encodeEntities(value)); - out('"'); - } - }); - out(unary ? '/>' : '>'); - } - }, - end: function(tag){ - tag = angular.lowercase(tag); - if (!ignore && validElements[tag] === true) { - out(''); - } - if (tag == ignore) { - ignore = false; - } - }, - chars: function(chars){ - if (!ignore) { - out(encodeEntities(chars)); - } - } - }; -} + var uriAttrs = makeMap("background,cite,href,longdesc,src,usemap"); + var validAttrs = angular.extend({}, uriAttrs, makeMap( + 'abbr,align,alt,axis,bgcolor,border,cellpadding,cellspacing,class,clear,' + + 'color,cols,colspan,compact,coords,dir,face,headers,height,hreflang,hspace,' + + 'ismap,lang,language,nohref,nowrap,rel,rev,rows,rowspan,rules,' + + 'scope,scrolling,shape,size,span,start,summary,target,title,type,' + + 'valign,value,vspace,width')); + + function makeMap(str) { + var obj = {}, items = str.split(','), i; + for (i = 0; i < items.length; i++) obj[items[i]] = true; + return obj; + } + + + /** + * @example + * htmlParser(htmlString, { + * start: function(tag, attrs, unary) {}, + * end: function(tag) {}, + * chars: function(text) {}, + * comment: function(text) {} + * }); + * + * @param {string} html string + * @param {object} handler + */ + function htmlParser(html, handler) { + var index, chars, match, stack = [], last = html; + stack.last = function () { + return stack[stack.length - 1]; + }; + + while (html) { + chars = true; + + // Make sure we're not in a script or style element + if (!stack.last() || !specialElements[stack.last()]) { + + // Comment + if (html.indexOf("", index) === index) { + if (handler.comment) handler.comment(html.substring(4, index)); + html = html.substring(index + 3); + chars = false; + } + // DOCTYPE + } else if (DOCTYPE_REGEXP.test(html)) { + match = html.match(DOCTYPE_REGEXP); + + if (match) { + html = html.replace(match[0], ''); + chars = false; + } + // end tag + } else if (BEGING_END_TAGE_REGEXP.test(html)) { + match = html.match(END_TAG_REGEXP); + + if (match) { + html = html.substring(match[0].length); + match[0].replace(END_TAG_REGEXP, parseEndTag); + chars = false; + } + + // start tag + } else if (BEGIN_TAG_REGEXP.test(html)) { + match = html.match(START_TAG_REGEXP); + + if (match) { + html = html.substring(match[0].length); + match[0].replace(START_TAG_REGEXP, parseStartTag); + chars = false; + } + } + + if (chars) { + index = html.indexOf("<"); + + var text = index < 0 ? html : html.substring(0, index); + html = index < 0 ? "" : html.substring(index); + + if (handler.chars) handler.chars(decodeEntities(text)); + } + + } else { + html = html.replace(new RegExp("(.*)<\\s*\\/\\s*" + stack.last() + "[^>]*>", 'i'), + function (all, text) { + text = text.replace(COMMENT_REGEXP, "$1").replace(CDATA_REGEXP, "$1"); + + if (handler.chars) handler.chars(decodeEntities(text)); + + return ""; + }); + + parseEndTag("", stack.last()); + } + + if (html == last) { + throw $sanitizeMinErr('badparse', "The sanitizer was unable to parse the following block " + + "of html: {0}", html); + } + last = html; + } + + // Clean up any remaining tags + parseEndTag(); + + function parseStartTag(tag, tagName, rest, unary) { + tagName = angular.lowercase(tagName); + if (blockElements[tagName]) { + while (stack.last() && inlineElements[stack.last()]) { + parseEndTag("", stack.last()); + } + } + + if (optionalEndTagElements[tagName] && stack.last() == tagName) { + parseEndTag("", tagName); + } + + unary = voidElements[tagName] || !!unary; + + if (!unary) + stack.push(tagName); + + var attrs = {}; + + rest.replace(ATTR_REGEXP, + function (match, name, doubleQuotedValue, singleQuotedValue, unquotedValue) { + var value = doubleQuotedValue + || singleQuotedValue + || unquotedValue + || ''; + + attrs[name] = decodeEntities(value); + }); + if (handler.start) handler.start(tagName, attrs, unary); + } + + function parseEndTag(tag, tagName) { + var pos = 0, i; + tagName = angular.lowercase(tagName); + if (tagName) + // Find the closest opened tag of the same type + for (pos = stack.length - 1; pos >= 0; pos--) + if (stack[pos] == tagName) + break; + + if (pos >= 0) { + // Close all the open elements, up the stack + for (i = stack.length - 1; i >= pos; i--) + if (handler.end) handler.end(stack[i]); + + // Remove the open elements from the stack + stack.length = pos; + } + } + } + + var hiddenPre = document.createElement("pre"); + var spaceRe = /^(\s*)([\s\S]*?)(\s*)$/; + + /** + * decodes all entities into regular string + * @param value + * @returns {string} A string with decoded entities. + */ + function decodeEntities(value) { + if (!value) { + return ''; + } + + // Note: IE8 does not preserve spaces at the start/end of innerHTML + // so we must capture them and reattach them afterward + var parts = spaceRe.exec(value); + var spaceBefore = parts[1]; + var spaceAfter = parts[3]; + var content = parts[2]; + if (content) { + hiddenPre.innerHTML = content.replace(//g, '>'); + } + + /** + * create an HTML/XML writer which writes to buffer + * @param {Array} buf use buf.jain('') to get out sanitized html string + * @returns {object} in the form of { + * start: function(tag, attrs, unary) {}, + * end: function(tag) {}, + * chars: function(text) {}, + * comment: function(text) {} + * } + */ + function htmlSanitizeWriter(buf, uriValidator) { + var ignore = false; + var out = angular.bind(buf, buf.push); + return { + start: function (tag, attrs, unary) { + tag = angular.lowercase(tag); + if (!ignore && specialElements[tag]) { + ignore = tag; + } + if (!ignore && validElements[tag] === true) { + out('<'); + out(tag); + angular.forEach(attrs, function (value, key) { + var lkey = angular.lowercase(key); + var isImage = (tag === 'img' && lkey === 'src') || (lkey === 'background'); + if (validAttrs[lkey] === true && + (uriAttrs[lkey] !== true || uriValidator(value, isImage))) { + out(' '); + out(key); + out('="'); + out(encodeEntities(value)); + out('"'); + } + }); + out(unary ? '/>' : '>'); + } + }, + end: function (tag) { + tag = angular.lowercase(tag); + if (!ignore && validElements[tag] === true) { + out(''); + } + if (tag == ignore) { + ignore = false; + } + }, + chars: function (chars) { + if (!ignore) { + out(encodeEntities(chars)); + } + } + }; + } // define ngSanitize module and register $sanitize service -angular.module('ngSanitize', []).provider('$sanitize', $SanitizeProvider); - -/* global sanitizeText: false */ - -/** - * @ngdoc filter - * @name ngSanitize.filter:linky - * @function - * - * @description - * Finds links in text input and turns them into html links. Supports http/https/ftp/mailto and - * plain email address links. - * - * Requires the {@link ngSanitize `ngSanitize`} module to be installed. - * - * @param {string} text Input text. - * @param {string} target Window (_blank|_self|_parent|_top) or named frame to open links in. - * @returns {string} Html-linkified text. - * - * @usage - - * - * @example - + angular.module('ngSanitize', []).provider('$sanitize', $SanitizeProvider); + + /* global sanitizeText: false */ + + /** + * @ngdoc filter + * @name ngSanitize.filter:linky + * @function + * + * @description + * Finds links in text input and turns them into html links. Supports http/https/ftp/mailto and + * plain email address links. + * + * Requires the {@link ngSanitize `ngSanitize`} module to be installed. + * + * @param {string} text Input text. + * @param {string} target Window (_blank|_self|_parent|_top) or named frame to open links in. + * @returns {string} Html-linkified text. + * + * @usage + + * + * @example + - -
    - Snippet: - - - - - - - - - - - - - - - - - - - - - -
    FilterSourceRendered
    linky filter -
    <div ng-bind-html="snippet | linky">
    </div>
    -
    -
    -
    linky target -
    <div ng-bind-html="snippetWithTarget | linky:'_blank'">
    </div>
    -
    -
    -
    no filter
    <div ng-bind="snippet">
    </div>
    + +
    + Snippet: + + + + + + + + + + + + + + + + + + + + + +
    FilterSourceRendered
    linky filter +
    <div ng-bind-html="snippet | linky">
    </div>
    +
    +
    +
    linky target +
    <div ng-bind-html="snippetWithTarget | linky:'_blank'">
    </div>
    +
    +
    +
    no filter
    <div ng-bind="snippet">
    </div>
    - it('should linkify the snippet with urls', function() { + it('should linkify the snippet with urls', function() { expect(element(by.id('linky-filter')).element(by.binding('snippet | linky')).getText()). toBe('Pretty text with some links: http://angularjs.org/, us@somewhere.org, ' + 'another@somewhere.org, and one more: ftp://127.0.0.1/.'); expect(element.all(by.css('#linky-filter a')).count()).toEqual(4); }); - it('should not linkify snippet without the linky filter', function() { + it('should not linkify snippet without the linky filter', function() { expect(element(by.id('escaped-html')).element(by.binding('snippet')).getText()). toBe('Pretty text with some links: http://angularjs.org/, mailto:us@somewhere.org, ' + 'another@somewhere.org, and one more: ftp://127.0.0.1/.'); expect(element.all(by.css('#escaped-html a')).count()).toEqual(0); }); - it('should update', function() { + it('should update', function() { element(by.model('snippet')).clear(); element(by.model('snippet')).sendKeys('new http://link.'); expect(element(by.id('linky-filter')).element(by.binding('snippet | linky')).getText()). @@ -564,62 +566,62 @@ angular.module('ngSanitize', []).provider('$sanitize', $SanitizeProvider); .toBe('new http://link.'); }); - it('should work with the target property', function() { + it('should work with the target property', function() { expect(element(by.id('linky-target')). element(by.binding("snippetWithTarget | linky:'_blank'")).getText()). toBe('http://angularjs.org/'); expect(element(by.css('#linky-target a')).getAttribute('target')).toEqual('_blank'); }); - - */ -angular.module('ngSanitize').filter('linky', ['$sanitize', function($sanitize) { - var LINKY_URL_REGEXP = - /((ftp|https?):\/\/|(mailto:)?[A-Za-z0-9._%+-]+@)\S*[^\s.;,(){}<>]/, - MAILTO_REGEXP = /^mailto:/; - - return function(text, target) { - if (!text) return text; - var match; - var raw = text; - var html = []; - var url; - var i; - while ((match = raw.match(LINKY_URL_REGEXP))) { - // We can not end in these as they are sometimes found at the end of the sentence - url = match[0]; - // if we did not match ftp/http/mailto then assume mailto - if (match[2] == match[3]) url = 'mailto:' + url; - i = match.index; - addText(raw.substr(0, i)); - addLink(url, match[0].replace(MAILTO_REGEXP, '')); - raw = raw.substring(i + match[0].length); - } - addText(raw); - return $sanitize(html.join('')); - - function addText(text) { - if (!text) { - return; - } - html.push(sanitizeText(text)); - } - - function addLink(url, text) { - html.push(''); - addText(text); - html.push(''); - } - }; -}]); + + */ + angular.module('ngSanitize').filter('linky', ['$sanitize', function ($sanitize) { + var LINKY_URL_REGEXP = + /((ftp|https?):\/\/|(mailto:)?[A-Za-z0-9._%+-]+@)\S*[^\s.;,(){}<>]/, + MAILTO_REGEXP = /^mailto:/; + + return function (text, target) { + if (!text) return text; + var match; + var raw = text; + var html = []; + var url; + var i; + while ((match = raw.match(LINKY_URL_REGEXP))) { + // We can not end in these as they are sometimes found at the end of the sentence + url = match[0]; + // if we did not match ftp/http/mailto then assume mailto + if (match[2] == match[3]) url = 'mailto:' + url; + i = match.index; + addText(raw.substr(0, i)); + addLink(url, match[0].replace(MAILTO_REGEXP, '')); + raw = raw.substring(i + match[0].length); + } + addText(raw); + return $sanitize(html.join('')); + + function addText(text) { + if (!text) { + return; + } + html.push(sanitizeText(text)); + } + + function addLink(url, text) { + html.push(''); + addText(text); + html.push(''); + } + }; + }]); })(window, window.angular); diff --git a/len-activiti/src/main/resources/static/editor-app/libs/angular-translate-loader-static-files/angular-translate-loader-static-files.js b/len-activiti/src/main/resources/static/editor-app/libs/angular-translate-loader-static-files/angular-translate-loader-static-files.js index ee3303e..458da34 100644 --- a/len-activiti/src/main/resources/static/editor-app/libs/angular-translate-loader-static-files/angular-translate-loader-static-files.js +++ b/len-activiti/src/main/resources/static/editor-app/libs/angular-translate-loader-static-files/angular-translate-loader-static-files.js @@ -4,28 +4,28 @@ * Copyright (c) 2014 ; Licensed MIT */ angular.module('pascalprecht.translate').factory('$translateStaticFilesLoader', [ - '$q', - '$http', - function ($q, $http) { - return function (options) { - if (!options || (!angular.isString(options.prefix) || !angular.isString(options.suffix))) { - throw new Error('Couldn\'t load static files, no prefix or suffix specified!'); - } - var deferred = $q.defer(); - $http(angular.extend({ - url: [ - options.prefix, - options.key, - options.suffix - ].join(''), - method: 'GET', - params: '' - }, options.$http)).success(function (data) { - deferred.resolve(data); - }).error(function (data) { - deferred.reject(options.key); - }); - return deferred.promise; - }; - } -]); \ No newline at end of file + '$q', + '$http', + function ($q, $http) { + return function (options) { + if (!options || (!angular.isString(options.prefix) || !angular.isString(options.suffix))) { + throw new Error('Couldn\'t load static files, no prefix or suffix specified!'); + } + var deferred = $q.defer(); + $http(angular.extend({ + url: [ + options.prefix, + options.key, + options.suffix + ].join(''), + method: 'GET', + params: '' + }, options.$http)).success(function (data) { + deferred.resolve(data); + }).error(function (data) { + deferred.reject(options.key); + }); + return deferred.promise; + }; + } +]); diff --git a/len-activiti/src/main/resources/static/editor-app/libs/angular-translate-storage-cookie/angular-translate-storage-cookie.js b/len-activiti/src/main/resources/static/editor-app/libs/angular-translate-storage-cookie/angular-translate-storage-cookie.js index 34f180b..382c46d 100644 --- a/len-activiti/src/main/resources/static/editor-app/libs/angular-translate-storage-cookie/angular-translate-storage-cookie.js +++ b/len-activiti/src/main/resources/static/editor-app/libs/angular-translate-storage-cookie/angular-translate-storage-cookie.js @@ -4,16 +4,16 @@ * Copyright (c) 2014 ; Licensed MIT */ angular.module('pascalprecht.translate').factory('$translateCookieStorage', [ - '$cookieStore', - function ($cookieStore) { - var $translateCookieStorage = { - get: function (name) { - return $cookieStore.get(name); - }, - set: function (name, value) { - $cookieStore.put(name, value); - } - }; - return $translateCookieStorage; - } -]); \ No newline at end of file + '$cookieStore', + function ($cookieStore) { + var $translateCookieStorage = { + get: function (name) { + return $cookieStore.get(name); + }, + set: function (name, value) { + $cookieStore.put(name, value); + } + }; + return $translateCookieStorage; + } +]); diff --git a/len-activiti/src/main/resources/static/editor-app/libs/angular-translate_2.4.2/angular-translate.js b/len-activiti/src/main/resources/static/editor-app/libs/angular-translate_2.4.2/angular-translate.js index 46bcb55..20dfb69 100644 --- a/len-activiti/src/main/resources/static/editor-app/libs/angular-translate_2.4.2/angular-translate.js +++ b/len-activiti/src/main/resources/static/editor-app/libs/angular-translate_2.4.2/angular-translate.js @@ -4,957 +4,971 @@ * Copyright (c) 2014 ; Licensed MIT */ angular.module('pascalprecht.translate', ['ng']).run([ - '$translate', - function ($translate) { - var key = $translate.storageKey(), storage = $translate.storage(); - if (storage) { - if (!storage.get(key)) { - if (angular.isString($translate.preferredLanguage())) { - $translate.use($translate.preferredLanguage()); - } else { - storage.set(key, $translate.use()); - } - } else { - $translate.use(storage.get(key)); - } - } else if (angular.isString($translate.preferredLanguage())) { - $translate.use($translate.preferredLanguage()); - } - } + '$translate', + function ($translate) { + var key = $translate.storageKey(), storage = $translate.storage(); + if (storage) { + if (!storage.get(key)) { + if (angular.isString($translate.preferredLanguage())) { + $translate.use($translate.preferredLanguage()); + } else { + storage.set(key, $translate.use()); + } + } else { + $translate.use(storage.get(key)); + } + } else if (angular.isString($translate.preferredLanguage())) { + $translate.use($translate.preferredLanguage()); + } + } ]); angular.module('pascalprecht.translate').provider('$translate', [ - '$STORAGE_KEY', - function ($STORAGE_KEY) { - var $translationTable = {}, $preferredLanguage, $availableLanguageKeys = [], $languageKeyAliases, $fallbackLanguage, $fallbackWasString, $uses, $nextLang, $storageFactory, $storageKey = $STORAGE_KEY, $storagePrefix, $missingTranslationHandlerFactory, $interpolationFactory, $interpolatorFactories = [], $interpolationSanitizationStrategy = false, $loaderFactory, $cloakClassName = 'translate-cloak', $loaderOptions, $notFoundIndicatorLeft, $notFoundIndicatorRight, $postCompilingEnabled = false, NESTED_OBJECT_DELIMITER = '.', loaderCache; - var version = '2.4.2'; - var getLocale = function () { - var nav = window.navigator; - return ((angular.isArray(nav.languages) ? nav.languages[0] : nav.language || nav.browserLanguage || nav.systemLanguage || nav.userLanguage) || '').split('-').join('_'); - }; - var indexOf = function (array, searchElement) { - for (var i = 0, len = array.length; i < len; i++) { - if (array[i] === searchElement) { - return i; - } - } - return -1; - }; - var trim = function () { - return this.replace(/^\s+|\s+$/g, ''); - }; - var negotiateLocale = function (preferred) { - var avail = [], locale = angular.lowercase(preferred), i = 0, n = $availableLanguageKeys.length; - for (; i < n; i++) { - avail.push(angular.lowercase($availableLanguageKeys[i])); - } - if (indexOf(avail, locale) > -1) { - return preferred; - } - if ($languageKeyAliases) { - var alias; - for (var langKeyAlias in $languageKeyAliases) { - var hasWildcardKey = false; - var hasExactKey = Object.prototype.hasOwnProperty.call($languageKeyAliases, langKeyAlias) && angular.lowercase(langKeyAlias) === angular.lowercase(preferred); - if (langKeyAlias.slice(-1) === '*') { - hasWildcardKey = langKeyAlias.slice(0, -1) === preferred.slice(0, langKeyAlias.length - 1); - } - if (hasExactKey || hasWildcardKey) { - alias = $languageKeyAliases[langKeyAlias]; - if (indexOf(avail, angular.lowercase(alias)) > -1) { - return alias; - } - } - } - } - var parts = preferred.split('_'); - if (parts.length > 1 && indexOf(avail, angular.lowercase(parts[0])) > -1) { - return parts[0]; - } - return preferred; - }; - var translations = function (langKey, translationTable) { - if (!langKey && !translationTable) { - return $translationTable; - } - if (langKey && !translationTable) { - if (angular.isString(langKey)) { - return $translationTable[langKey]; - } - } else { - if (!angular.isObject($translationTable[langKey])) { - $translationTable[langKey] = {}; - } - angular.extend($translationTable[langKey], flatObject(translationTable)); - } - return this; - }; - this.translations = translations; - this.cloakClassName = function (name) { - if (!name) { - return $cloakClassName; - } - $cloakClassName = name; - return this; - }; - var flatObject = function (data, path, result, prevKey) { - var key, keyWithPath, keyWithShortPath, val; - if (!path) { - path = []; - } - if (!result) { - result = {}; - } - for (key in data) { - if (!Object.prototype.hasOwnProperty.call(data, key)) { - continue; - } - val = data[key]; - if (angular.isObject(val)) { - flatObject(val, path.concat(key), result, key); - } else { - keyWithPath = path.length ? '' + path.join(NESTED_OBJECT_DELIMITER) + NESTED_OBJECT_DELIMITER + key : key; - if (path.length && key === prevKey) { - keyWithShortPath = '' + path.join(NESTED_OBJECT_DELIMITER); - result[keyWithShortPath] = '@:' + keyWithPath; - } - result[keyWithPath] = val; - } - } - return result; - }; - this.addInterpolation = function (factory) { - $interpolatorFactories.push(factory); - return this; - }; - this.useMessageFormatInterpolation = function () { - return this.useInterpolation('$translateMessageFormatInterpolation'); - }; - this.useInterpolation = function (factory) { - $interpolationFactory = factory; - return this; - }; - this.useSanitizeValueStrategy = function (value) { - $interpolationSanitizationStrategy = value; - return this; - }; - this.preferredLanguage = function (langKey) { - setupPreferredLanguage(langKey); - return this; - }; - var setupPreferredLanguage = function (langKey) { - if (langKey) { - $preferredLanguage = langKey; - } - return $preferredLanguage; - }; - this.translationNotFoundIndicator = function (indicator) { - this.translationNotFoundIndicatorLeft(indicator); - this.translationNotFoundIndicatorRight(indicator); - return this; - }; - this.translationNotFoundIndicatorLeft = function (indicator) { - if (!indicator) { - return $notFoundIndicatorLeft; - } - $notFoundIndicatorLeft = indicator; - return this; - }; - this.translationNotFoundIndicatorRight = function (indicator) { - if (!indicator) { - return $notFoundIndicatorRight; - } - $notFoundIndicatorRight = indicator; - return this; - }; - this.fallbackLanguage = function (langKey) { - fallbackStack(langKey); - return this; - }; - var fallbackStack = function (langKey) { - if (langKey) { - if (angular.isString(langKey)) { - $fallbackWasString = true; - $fallbackLanguage = [langKey]; - } else if (angular.isArray(langKey)) { - $fallbackWasString = false; - $fallbackLanguage = langKey; - } - if (angular.isString($preferredLanguage) && indexOf($fallbackLanguage, $preferredLanguage) < 0) { - $fallbackLanguage.push($preferredLanguage); - } - return this; - } else { - if ($fallbackWasString) { - return $fallbackLanguage[0]; - } else { - return $fallbackLanguage; - } - } - }; - this.use = function (langKey) { - if (langKey) { - if (!$translationTable[langKey] && !$loaderFactory) { - throw new Error('$translateProvider couldn\'t find translationTable for langKey: \'' + langKey + '\''); - } - $uses = langKey; - return this; - } - return $uses; - }; - var storageKey = function (key) { - if (!key) { - if ($storagePrefix) { - return $storagePrefix + $storageKey; - } - return $storageKey; - } - $storageKey = key; - }; - this.storageKey = storageKey; - this.useUrlLoader = function (url, options) { - return this.useLoader('$translateUrlLoader', angular.extend({ url: url }, options)); - }; - this.useStaticFilesLoader = function (options) { - return this.useLoader('$translateStaticFilesLoader', options); - }; - this.useLoader = function (loaderFactory, options) { - $loaderFactory = loaderFactory; - $loaderOptions = options || {}; - return this; - }; - this.useLocalStorage = function () { - return this.useStorage('$translateLocalStorage'); - }; - this.useCookieStorage = function () { - return this.useStorage('$translateCookieStorage'); - }; - this.useStorage = function (storageFactory) { - $storageFactory = storageFactory; - return this; - }; - this.storagePrefix = function (prefix) { - if (!prefix) { - return prefix; - } - $storagePrefix = prefix; - return this; - }; - this.useMissingTranslationHandlerLog = function () { - return this.useMissingTranslationHandler('$translateMissingTranslationHandlerLog'); - }; - this.useMissingTranslationHandler = function (factory) { - $missingTranslationHandlerFactory = factory; - return this; - }; - this.usePostCompiling = function (value) { - $postCompilingEnabled = !!value; - return this; - }; - this.determinePreferredLanguage = function (fn) { - var locale = fn && angular.isFunction(fn) ? fn() : getLocale(); - if (!$availableLanguageKeys.length) { - $preferredLanguage = locale; - } else { - $preferredLanguage = negotiateLocale(locale); - } - return this; - }; - this.registerAvailableLanguageKeys = function (languageKeys, aliases) { - if (languageKeys) { - $availableLanguageKeys = languageKeys; - if (aliases) { - $languageKeyAliases = aliases; - } - return this; - } - return $availableLanguageKeys; - }; - this.useLoaderCache = function (cache) { - if (cache === false) { - loaderCache = undefined; - } else if (cache === true) { - loaderCache = true; - } else if (typeof cache === 'undefined') { - loaderCache = '$translationCache'; - } else if (cache) { - loaderCache = cache; - } - return this; - }; - this.$get = [ - '$log', - '$injector', - '$rootScope', - '$q', - function ($log, $injector, $rootScope, $q) { - var Storage, defaultInterpolator = $injector.get($interpolationFactory || '$translateDefaultInterpolation'), pendingLoader = false, interpolatorHashMap = {}, langPromises = {}, fallbackIndex, startFallbackIteration; - var $translate = function (translationId, interpolateParams, interpolationId) { - if (angular.isArray(translationId)) { - var translateAll = function (translationIds) { - var results = {}; - var promises = []; - var translate = function (translationId) { - var deferred = $q.defer(); - var regardless = function (value) { - results[translationId] = value; - deferred.resolve([ - translationId, - value - ]); - }; - $translate(translationId, interpolateParams, interpolationId).then(regardless, regardless); - return deferred.promise; - }; - for (var i = 0, c = translationIds.length; i < c; i++) { - promises.push(translate(translationIds[i])); - } - return $q.all(promises).then(function () { - return results; - }); - }; - return translateAll(translationId); - } - var deferred = $q.defer(); - if (translationId) { - translationId = trim.apply(translationId); - } - var promiseToWaitFor = function () { - var promise = $preferredLanguage ? langPromises[$preferredLanguage] : langPromises[$uses]; - fallbackIndex = 0; - if ($storageFactory && !promise) { - var langKey = Storage.get($storageKey); - promise = langPromises[langKey]; - if ($fallbackLanguage && $fallbackLanguage.length) { - var index = indexOf($fallbackLanguage, langKey); - fallbackIndex = index === 0 ? 1 : 0; - if (indexOf($fallbackLanguage, $preferredLanguage) < 0) { - $fallbackLanguage.push($preferredLanguage); - } - } - } - return promise; - }(); - if (!promiseToWaitFor) { - determineTranslation(translationId, interpolateParams, interpolationId).then(deferred.resolve, deferred.reject); - } else { - promiseToWaitFor.then(function () { - determineTranslation(translationId, interpolateParams, interpolationId).then(deferred.resolve, deferred.reject); - }, deferred.reject); - } - return deferred.promise; - }; - var applyNotFoundIndicators = function (translationId) { - if ($notFoundIndicatorLeft) { - translationId = [ - $notFoundIndicatorLeft, - translationId - ].join(' '); - } - if ($notFoundIndicatorRight) { - translationId = [ - translationId, - $notFoundIndicatorRight - ].join(' '); - } - return translationId; - }; - var useLanguage = function (key) { - $uses = key; - $rootScope.$emit('$translateChangeSuccess', { language: key }); - if ($storageFactory) { - Storage.set($translate.storageKey(), $uses); - } - defaultInterpolator.setLocale($uses); - angular.forEach(interpolatorHashMap, function (interpolator, id) { - interpolatorHashMap[id].setLocale($uses); - }); - $rootScope.$emit('$translateChangeEnd', { language: key }); - }; - var loadAsync = function (key) { - if (!key) { - throw 'No language key specified for loading.'; - } - var deferred = $q.defer(); - $rootScope.$emit('$translateLoadingStart', { language: key }); - pendingLoader = true; - var cache = loaderCache; - if (typeof cache === 'string') { - cache = $injector.get(cache); - } - var loaderOptions = angular.extend({}, $loaderOptions, { - key: key, - $http: angular.extend({}, { cache: cache }, $loaderOptions.$http) - }); - $injector.get($loaderFactory)(loaderOptions).then(function (data) { - var translationTable = {}; - $rootScope.$emit('$translateLoadingSuccess', { language: key }); - if (angular.isArray(data)) { - angular.forEach(data, function (table) { - angular.extend(translationTable, flatObject(table)); - }); - } else { - angular.extend(translationTable, flatObject(data)); - } - pendingLoader = false; - deferred.resolve({ - key: key, - table: translationTable - }); - $rootScope.$emit('$translateLoadingEnd', { language: key }); - }, function (key) { - $rootScope.$emit('$translateLoadingError', { language: key }); - deferred.reject(key); - $rootScope.$emit('$translateLoadingEnd', { language: key }); - }); - return deferred.promise; - }; - if ($storageFactory) { - Storage = $injector.get($storageFactory); - if (!Storage.get || !Storage.set) { - throw new Error('Couldn\'t use storage \'' + $storageFactory + '\', missing get() or set() method!'); - } - } - if (angular.isFunction(defaultInterpolator.useSanitizeValueStrategy)) { - defaultInterpolator.useSanitizeValueStrategy($interpolationSanitizationStrategy); - } - if ($interpolatorFactories.length) { - angular.forEach($interpolatorFactories, function (interpolatorFactory) { - var interpolator = $injector.get(interpolatorFactory); - interpolator.setLocale($preferredLanguage || $uses); - if (angular.isFunction(interpolator.useSanitizeValueStrategy)) { - interpolator.useSanitizeValueStrategy($interpolationSanitizationStrategy); - } - interpolatorHashMap[interpolator.getInterpolationIdentifier()] = interpolator; - }); - } - var getTranslationTable = function (langKey) { - var deferred = $q.defer(); - if (Object.prototype.hasOwnProperty.call($translationTable, langKey)) { - deferred.resolve($translationTable[langKey]); - } else if (langPromises[langKey]) { - langPromises[langKey].then(function (data) { - translations(data.key, data.table); - deferred.resolve(data.table); - }, deferred.reject); - } else { - deferred.reject(); - } - return deferred.promise; - }; - var getFallbackTranslation = function (langKey, translationId, interpolateParams, Interpolator) { - var deferred = $q.defer(); - getTranslationTable(langKey).then(function (translationTable) { - if (Object.prototype.hasOwnProperty.call(translationTable, translationId)) { - Interpolator.setLocale(langKey); - deferred.resolve(Interpolator.interpolate(translationTable[translationId], interpolateParams)); - Interpolator.setLocale($uses); - } else { - deferred.reject(); - } - }, deferred.reject); - return deferred.promise; - }; - var getFallbackTranslationInstant = function (langKey, translationId, interpolateParams, Interpolator) { - var result, translationTable = $translationTable[langKey]; - if (Object.prototype.hasOwnProperty.call(translationTable, translationId)) { - Interpolator.setLocale(langKey); - result = Interpolator.interpolate(translationTable[translationId], interpolateParams); - Interpolator.setLocale($uses); - } - return result; - }; - var translateByHandler = function (translationId) { - if ($missingTranslationHandlerFactory) { - var resultString = $injector.get($missingTranslationHandlerFactory)(translationId, $uses); - if (resultString !== undefined) { - return resultString; - } else { - return translationId; - } - } else { - return translationId; - } - }; - var resolveForFallbackLanguage = function (fallbackLanguageIndex, translationId, interpolateParams, Interpolator) { - var deferred = $q.defer(); - if (fallbackLanguageIndex < $fallbackLanguage.length) { - var langKey = $fallbackLanguage[fallbackLanguageIndex]; - getFallbackTranslation(langKey, translationId, interpolateParams, Interpolator).then(deferred.resolve, function () { - resolveForFallbackLanguage(fallbackLanguageIndex + 1, translationId, interpolateParams, Interpolator).then(deferred.resolve); - }); - } else { - deferred.resolve(translateByHandler(translationId)); - } - return deferred.promise; - }; - var resolveForFallbackLanguageInstant = function (fallbackLanguageIndex, translationId, interpolateParams, Interpolator) { - var result; - if (fallbackLanguageIndex < $fallbackLanguage.length) { - var langKey = $fallbackLanguage[fallbackLanguageIndex]; - result = getFallbackTranslationInstant(langKey, translationId, interpolateParams, Interpolator); - if (!result) { - result = resolveForFallbackLanguageInstant(fallbackLanguageIndex + 1, translationId, interpolateParams, Interpolator); - } - } - return result; - }; - var fallbackTranslation = function (translationId, interpolateParams, Interpolator) { - return resolveForFallbackLanguage(startFallbackIteration > 0 ? startFallbackIteration : fallbackIndex, translationId, interpolateParams, Interpolator); - }; - var fallbackTranslationInstant = function (translationId, interpolateParams, Interpolator) { - return resolveForFallbackLanguageInstant(startFallbackIteration > 0 ? startFallbackIteration : fallbackIndex, translationId, interpolateParams, Interpolator); - }; - var determineTranslation = function (translationId, interpolateParams, interpolationId) { - var deferred = $q.defer(); - var table = $uses ? $translationTable[$uses] : $translationTable, Interpolator = interpolationId ? interpolatorHashMap[interpolationId] : defaultInterpolator; - if (table && Object.prototype.hasOwnProperty.call(table, translationId)) { - var translation = table[translationId]; - if (translation.substr(0, 2) === '@:') { - $translate(translation.substr(2), interpolateParams, interpolationId).then(deferred.resolve, deferred.reject); - } else { - deferred.resolve(Interpolator.interpolate(translation, interpolateParams)); - } - } else { - var missingTranslationHandlerTranslation; - if ($missingTranslationHandlerFactory && !pendingLoader) { - missingTranslationHandlerTranslation = translateByHandler(translationId); - } - if ($uses && $fallbackLanguage && $fallbackLanguage.length) { - fallbackTranslation(translationId, interpolateParams, Interpolator).then(function (translation) { - deferred.resolve(translation); - }, function (_translationId) { - deferred.reject(applyNotFoundIndicators(_translationId)); - }); - } else if ($missingTranslationHandlerFactory && !pendingLoader && missingTranslationHandlerTranslation) { - deferred.resolve(missingTranslationHandlerTranslation); - } else { - deferred.reject(applyNotFoundIndicators(translationId)); - } - } - return deferred.promise; - }; - var determineTranslationInstant = function (translationId, interpolateParams, interpolationId) { - var result, table = $uses ? $translationTable[$uses] : $translationTable, Interpolator = interpolationId ? interpolatorHashMap[interpolationId] : defaultInterpolator; - if (table && Object.prototype.hasOwnProperty.call(table, translationId)) { - var translation = table[translationId]; - if (translation.substr(0, 2) === '@:') { - result = determineTranslationInstant(translation.substr(2), interpolateParams, interpolationId); - } else { - result = Interpolator.interpolate(translation, interpolateParams); - } - } else { - var missingTranslationHandlerTranslation; - if ($missingTranslationHandlerFactory && !pendingLoader) { - missingTranslationHandlerTranslation = translateByHandler(translationId); - } - if ($uses && $fallbackLanguage && $fallbackLanguage.length) { - fallbackIndex = 0; - result = fallbackTranslationInstant(translationId, interpolateParams, Interpolator); - } else if ($missingTranslationHandlerFactory && !pendingLoader && missingTranslationHandlerTranslation) { - result = missingTranslationHandlerTranslation; - } else { - result = applyNotFoundIndicators(translationId); - } - } - return result; - }; - $translate.preferredLanguage = function (langKey) { - if (langKey) { - setupPreferredLanguage(langKey); - } - return $preferredLanguage; - }; - $translate.cloakClassName = function () { - return $cloakClassName; - }; - $translate.fallbackLanguage = function (langKey) { - if (langKey !== undefined && langKey !== null) { - fallbackStack(langKey); - if ($loaderFactory) { - if ($fallbackLanguage && $fallbackLanguage.length) { - for (var i = 0, len = $fallbackLanguage.length; i < len; i++) { - if (!langPromises[$fallbackLanguage[i]]) { - langPromises[$fallbackLanguage[i]] = loadAsync($fallbackLanguage[i]); - } - } - } - } - $translate.use($translate.use()); - } - if ($fallbackWasString) { - return $fallbackLanguage[0]; - } else { - return $fallbackLanguage; - } - }; - $translate.useFallbackLanguage = function (langKey) { - if (langKey !== undefined && langKey !== null) { - if (!langKey) { - startFallbackIteration = 0; - } else { - var langKeyPosition = indexOf($fallbackLanguage, langKey); - if (langKeyPosition > -1) { - startFallbackIteration = langKeyPosition; - } - } - } - }; - $translate.proposedLanguage = function () { - return $nextLang; - }; - $translate.storage = function () { - return Storage; - }; - $translate.use = function (key) { - if (!key) { - return $uses; - } - var deferred = $q.defer(); - $rootScope.$emit('$translateChangeStart', { language: key }); - var aliasedKey = negotiateLocale(key); - if (aliasedKey) { - key = aliasedKey; - } - if (!$translationTable[key] && $loaderFactory && !langPromises[key]) { - $nextLang = key; - langPromises[key] = loadAsync(key).then(function (translation) { - translations(translation.key, translation.table); - deferred.resolve(translation.key); - useLanguage(translation.key); - if ($nextLang === key) { - $nextLang = undefined; - } - }, function (key) { - if ($nextLang === key) { - $nextLang = undefined; - } - $rootScope.$emit('$translateChangeError', { language: key }); - deferred.reject(key); - $rootScope.$emit('$translateChangeEnd', { language: key }); - }); - } else { - deferred.resolve(key); - useLanguage(key); - } - return deferred.promise; - }; - $translate.storageKey = function () { - return storageKey(); - }; - $translate.isPostCompilingEnabled = function () { - return $postCompilingEnabled; - }; - $translate.refresh = function (langKey) { - if (!$loaderFactory) { - throw new Error('Couldn\'t refresh translation table, no loader registered!'); - } - var deferred = $q.defer(); - function resolve() { - deferred.resolve(); - $rootScope.$emit('$translateRefreshEnd', { language: langKey }); - } - function reject() { - deferred.reject(); - $rootScope.$emit('$translateRefreshEnd', { language: langKey }); - } - $rootScope.$emit('$translateRefreshStart', { language: langKey }); - if (!langKey) { - var tables = [], loadingKeys = {}; - if ($fallbackLanguage && $fallbackLanguage.length) { - for (var i = 0, len = $fallbackLanguage.length; i < len; i++) { - tables.push(loadAsync($fallbackLanguage[i])); - loadingKeys[$fallbackLanguage[i]] = true; - } - } - if ($uses && !loadingKeys[$uses]) { - tables.push(loadAsync($uses)); - } - $q.all(tables).then(function (tableData) { - angular.forEach(tableData, function (data) { - if ($translationTable[data.key]) { - delete $translationTable[data.key]; - } - translations(data.key, data.table); - }); - if ($uses) { - useLanguage($uses); - } - resolve(); - }); - } else if ($translationTable[langKey]) { - loadAsync(langKey).then(function (data) { - translations(data.key, data.table); - if (langKey === $uses) { - useLanguage($uses); - } - resolve(); - }, reject); - } else { - reject(); - } - return deferred.promise; - }; - $translate.instant = function (translationId, interpolateParams, interpolationId) { - if (translationId === null || angular.isUndefined(translationId)) { - return translationId; - } - if (angular.isArray(translationId)) { - var results = {}; - for (var i = 0, c = translationId.length; i < c; i++) { - results[translationId[i]] = $translate.instant(translationId[i], interpolateParams, interpolationId); - } - return results; - } - if (angular.isString(translationId) && translationId.length < 1) { - return translationId; - } - if (translationId) { - translationId = trim.apply(translationId); - } - var result, possibleLangKeys = []; - if ($preferredLanguage) { - possibleLangKeys.push($preferredLanguage); - } - if ($uses) { - possibleLangKeys.push($uses); - } - if ($fallbackLanguage && $fallbackLanguage.length) { - possibleLangKeys = possibleLangKeys.concat($fallbackLanguage); - } - for (var j = 0, d = possibleLangKeys.length; j < d; j++) { - var possibleLangKey = possibleLangKeys[j]; - if ($translationTable[possibleLangKey]) { - if (typeof $translationTable[possibleLangKey][translationId] !== 'undefined') { - result = determineTranslationInstant(translationId, interpolateParams, interpolationId); - } - } - if (typeof result !== 'undefined') { - break; - } - } - if (!result && result !== '') { - result = defaultInterpolator.interpolate(translationId, interpolateParams); - if ($missingTranslationHandlerFactory && !pendingLoader) { - result = translateByHandler(translationId); - } - } - return result; - }; - $translate.versionInfo = function () { - return version; - }; - $translate.loaderCache = function () { - return loaderCache; - }; - if ($loaderFactory) { - if (angular.equals($translationTable, {})) { - $translate.use($translate.use()); - } - if ($fallbackLanguage && $fallbackLanguage.length) { - var processAsyncResult = function (translation) { - translations(translation.key, translation.table); - $rootScope.$emit('$translateChangeEnd', { language: translation.key }); - }; - for (var i = 0, len = $fallbackLanguage.length; i < len; i++) { - langPromises[$fallbackLanguage[i]] = loadAsync($fallbackLanguage[i]).then(processAsyncResult); - } - } - } - return $translate; - } - ]; - } + '$STORAGE_KEY', + function ($STORAGE_KEY) { + var $translationTable = {}, $preferredLanguage, $availableLanguageKeys = [], $languageKeyAliases, + $fallbackLanguage, $fallbackWasString, $uses, $nextLang, $storageFactory, $storageKey = $STORAGE_KEY, + $storagePrefix, $missingTranslationHandlerFactory, $interpolationFactory, $interpolatorFactories = [], + $interpolationSanitizationStrategy = false, $loaderFactory, $cloakClassName = 'translate-cloak', + $loaderOptions, $notFoundIndicatorLeft, $notFoundIndicatorRight, $postCompilingEnabled = false, + NESTED_OBJECT_DELIMITER = '.', loaderCache; + var version = '2.4.2'; + var getLocale = function () { + var nav = window.navigator; + return ((angular.isArray(nav.languages) ? nav.languages[0] : nav.language || nav.browserLanguage || nav.systemLanguage || nav.userLanguage) || '').split('-').join('_'); + }; + var indexOf = function (array, searchElement) { + for (var i = 0, len = array.length; i < len; i++) { + if (array[i] === searchElement) { + return i; + } + } + return -1; + }; + var trim = function () { + return this.replace(/^\s+|\s+$/g, ''); + }; + var negotiateLocale = function (preferred) { + var avail = [], locale = angular.lowercase(preferred), i = 0, n = $availableLanguageKeys.length; + for (; i < n; i++) { + avail.push(angular.lowercase($availableLanguageKeys[i])); + } + if (indexOf(avail, locale) > -1) { + return preferred; + } + if ($languageKeyAliases) { + var alias; + for (var langKeyAlias in $languageKeyAliases) { + var hasWildcardKey = false; + var hasExactKey = Object.prototype.hasOwnProperty.call($languageKeyAliases, langKeyAlias) && angular.lowercase(langKeyAlias) === angular.lowercase(preferred); + if (langKeyAlias.slice(-1) === '*') { + hasWildcardKey = langKeyAlias.slice(0, -1) === preferred.slice(0, langKeyAlias.length - 1); + } + if (hasExactKey || hasWildcardKey) { + alias = $languageKeyAliases[langKeyAlias]; + if (indexOf(avail, angular.lowercase(alias)) > -1) { + return alias; + } + } + } + } + var parts = preferred.split('_'); + if (parts.length > 1 && indexOf(avail, angular.lowercase(parts[0])) > -1) { + return parts[0]; + } + return preferred; + }; + var translations = function (langKey, translationTable) { + if (!langKey && !translationTable) { + return $translationTable; + } + if (langKey && !translationTable) { + if (angular.isString(langKey)) { + return $translationTable[langKey]; + } + } else { + if (!angular.isObject($translationTable[langKey])) { + $translationTable[langKey] = {}; + } + angular.extend($translationTable[langKey], flatObject(translationTable)); + } + return this; + }; + this.translations = translations; + this.cloakClassName = function (name) { + if (!name) { + return $cloakClassName; + } + $cloakClassName = name; + return this; + }; + var flatObject = function (data, path, result, prevKey) { + var key, keyWithPath, keyWithShortPath, val; + if (!path) { + path = []; + } + if (!result) { + result = {}; + } + for (key in data) { + if (!Object.prototype.hasOwnProperty.call(data, key)) { + continue; + } + val = data[key]; + if (angular.isObject(val)) { + flatObject(val, path.concat(key), result, key); + } else { + keyWithPath = path.length ? '' + path.join(NESTED_OBJECT_DELIMITER) + NESTED_OBJECT_DELIMITER + key : key; + if (path.length && key === prevKey) { + keyWithShortPath = '' + path.join(NESTED_OBJECT_DELIMITER); + result[keyWithShortPath] = '@:' + keyWithPath; + } + result[keyWithPath] = val; + } + } + return result; + }; + this.addInterpolation = function (factory) { + $interpolatorFactories.push(factory); + return this; + }; + this.useMessageFormatInterpolation = function () { + return this.useInterpolation('$translateMessageFormatInterpolation'); + }; + this.useInterpolation = function (factory) { + $interpolationFactory = factory; + return this; + }; + this.useSanitizeValueStrategy = function (value) { + $interpolationSanitizationStrategy = value; + return this; + }; + this.preferredLanguage = function (langKey) { + setupPreferredLanguage(langKey); + return this; + }; + var setupPreferredLanguage = function (langKey) { + if (langKey) { + $preferredLanguage = langKey; + } + return $preferredLanguage; + }; + this.translationNotFoundIndicator = function (indicator) { + this.translationNotFoundIndicatorLeft(indicator); + this.translationNotFoundIndicatorRight(indicator); + return this; + }; + this.translationNotFoundIndicatorLeft = function (indicator) { + if (!indicator) { + return $notFoundIndicatorLeft; + } + $notFoundIndicatorLeft = indicator; + return this; + }; + this.translationNotFoundIndicatorRight = function (indicator) { + if (!indicator) { + return $notFoundIndicatorRight; + } + $notFoundIndicatorRight = indicator; + return this; + }; + this.fallbackLanguage = function (langKey) { + fallbackStack(langKey); + return this; + }; + var fallbackStack = function (langKey) { + if (langKey) { + if (angular.isString(langKey)) { + $fallbackWasString = true; + $fallbackLanguage = [langKey]; + } else if (angular.isArray(langKey)) { + $fallbackWasString = false; + $fallbackLanguage = langKey; + } + if (angular.isString($preferredLanguage) && indexOf($fallbackLanguage, $preferredLanguage) < 0) { + $fallbackLanguage.push($preferredLanguage); + } + return this; + } else { + if ($fallbackWasString) { + return $fallbackLanguage[0]; + } else { + return $fallbackLanguage; + } + } + }; + this.use = function (langKey) { + if (langKey) { + if (!$translationTable[langKey] && !$loaderFactory) { + throw new Error('$translateProvider couldn\'t find translationTable for langKey: \'' + langKey + '\''); + } + $uses = langKey; + return this; + } + return $uses; + }; + var storageKey = function (key) { + if (!key) { + if ($storagePrefix) { + return $storagePrefix + $storageKey; + } + return $storageKey; + } + $storageKey = key; + }; + this.storageKey = storageKey; + this.useUrlLoader = function (url, options) { + return this.useLoader('$translateUrlLoader', angular.extend({url: url}, options)); + }; + this.useStaticFilesLoader = function (options) { + return this.useLoader('$translateStaticFilesLoader', options); + }; + this.useLoader = function (loaderFactory, options) { + $loaderFactory = loaderFactory; + $loaderOptions = options || {}; + return this; + }; + this.useLocalStorage = function () { + return this.useStorage('$translateLocalStorage'); + }; + this.useCookieStorage = function () { + return this.useStorage('$translateCookieStorage'); + }; + this.useStorage = function (storageFactory) { + $storageFactory = storageFactory; + return this; + }; + this.storagePrefix = function (prefix) { + if (!prefix) { + return prefix; + } + $storagePrefix = prefix; + return this; + }; + this.useMissingTranslationHandlerLog = function () { + return this.useMissingTranslationHandler('$translateMissingTranslationHandlerLog'); + }; + this.useMissingTranslationHandler = function (factory) { + $missingTranslationHandlerFactory = factory; + return this; + }; + this.usePostCompiling = function (value) { + $postCompilingEnabled = !!value; + return this; + }; + this.determinePreferredLanguage = function (fn) { + var locale = fn && angular.isFunction(fn) ? fn() : getLocale(); + if (!$availableLanguageKeys.length) { + $preferredLanguage = locale; + } else { + $preferredLanguage = negotiateLocale(locale); + } + return this; + }; + this.registerAvailableLanguageKeys = function (languageKeys, aliases) { + if (languageKeys) { + $availableLanguageKeys = languageKeys; + if (aliases) { + $languageKeyAliases = aliases; + } + return this; + } + return $availableLanguageKeys; + }; + this.useLoaderCache = function (cache) { + if (cache === false) { + loaderCache = undefined; + } else if (cache === true) { + loaderCache = true; + } else if (typeof cache === 'undefined') { + loaderCache = '$translationCache'; + } else if (cache) { + loaderCache = cache; + } + return this; + }; + this.$get = [ + '$log', + '$injector', + '$rootScope', + '$q', + function ($log, $injector, $rootScope, $q) { + var Storage, + defaultInterpolator = $injector.get($interpolationFactory || '$translateDefaultInterpolation'), + pendingLoader = false, interpolatorHashMap = {}, langPromises = {}, fallbackIndex, + startFallbackIteration; + var $translate = function (translationId, interpolateParams, interpolationId) { + if (angular.isArray(translationId)) { + var translateAll = function (translationIds) { + var results = {}; + var promises = []; + var translate = function (translationId) { + var deferred = $q.defer(); + var regardless = function (value) { + results[translationId] = value; + deferred.resolve([ + translationId, + value + ]); + }; + $translate(translationId, interpolateParams, interpolationId).then(regardless, regardless); + return deferred.promise; + }; + for (var i = 0, c = translationIds.length; i < c; i++) { + promises.push(translate(translationIds[i])); + } + return $q.all(promises).then(function () { + return results; + }); + }; + return translateAll(translationId); + } + var deferred = $q.defer(); + if (translationId) { + translationId = trim.apply(translationId); + } + var promiseToWaitFor = function () { + var promise = $preferredLanguage ? langPromises[$preferredLanguage] : langPromises[$uses]; + fallbackIndex = 0; + if ($storageFactory && !promise) { + var langKey = Storage.get($storageKey); + promise = langPromises[langKey]; + if ($fallbackLanguage && $fallbackLanguage.length) { + var index = indexOf($fallbackLanguage, langKey); + fallbackIndex = index === 0 ? 1 : 0; + if (indexOf($fallbackLanguage, $preferredLanguage) < 0) { + $fallbackLanguage.push($preferredLanguage); + } + } + } + return promise; + }(); + if (!promiseToWaitFor) { + determineTranslation(translationId, interpolateParams, interpolationId).then(deferred.resolve, deferred.reject); + } else { + promiseToWaitFor.then(function () { + determineTranslation(translationId, interpolateParams, interpolationId).then(deferred.resolve, deferred.reject); + }, deferred.reject); + } + return deferred.promise; + }; + var applyNotFoundIndicators = function (translationId) { + if ($notFoundIndicatorLeft) { + translationId = [ + $notFoundIndicatorLeft, + translationId + ].join(' '); + } + if ($notFoundIndicatorRight) { + translationId = [ + translationId, + $notFoundIndicatorRight + ].join(' '); + } + return translationId; + }; + var useLanguage = function (key) { + $uses = key; + $rootScope.$emit('$translateChangeSuccess', {language: key}); + if ($storageFactory) { + Storage.set($translate.storageKey(), $uses); + } + defaultInterpolator.setLocale($uses); + angular.forEach(interpolatorHashMap, function (interpolator, id) { + interpolatorHashMap[id].setLocale($uses); + }); + $rootScope.$emit('$translateChangeEnd', {language: key}); + }; + var loadAsync = function (key) { + if (!key) { + throw 'No language key specified for loading.'; + } + var deferred = $q.defer(); + $rootScope.$emit('$translateLoadingStart', {language: key}); + pendingLoader = true; + var cache = loaderCache; + if (typeof cache === 'string') { + cache = $injector.get(cache); + } + var loaderOptions = angular.extend({}, $loaderOptions, { + key: key, + $http: angular.extend({}, {cache: cache}, $loaderOptions.$http) + }); + $injector.get($loaderFactory)(loaderOptions).then(function (data) { + var translationTable = {}; + $rootScope.$emit('$translateLoadingSuccess', {language: key}); + if (angular.isArray(data)) { + angular.forEach(data, function (table) { + angular.extend(translationTable, flatObject(table)); + }); + } else { + angular.extend(translationTable, flatObject(data)); + } + pendingLoader = false; + deferred.resolve({ + key: key, + table: translationTable + }); + $rootScope.$emit('$translateLoadingEnd', {language: key}); + }, function (key) { + $rootScope.$emit('$translateLoadingError', {language: key}); + deferred.reject(key); + $rootScope.$emit('$translateLoadingEnd', {language: key}); + }); + return deferred.promise; + }; + if ($storageFactory) { + Storage = $injector.get($storageFactory); + if (!Storage.get || !Storage.set) { + throw new Error('Couldn\'t use storage \'' + $storageFactory + '\', missing get() or set() method!'); + } + } + if (angular.isFunction(defaultInterpolator.useSanitizeValueStrategy)) { + defaultInterpolator.useSanitizeValueStrategy($interpolationSanitizationStrategy); + } + if ($interpolatorFactories.length) { + angular.forEach($interpolatorFactories, function (interpolatorFactory) { + var interpolator = $injector.get(interpolatorFactory); + interpolator.setLocale($preferredLanguage || $uses); + if (angular.isFunction(interpolator.useSanitizeValueStrategy)) { + interpolator.useSanitizeValueStrategy($interpolationSanitizationStrategy); + } + interpolatorHashMap[interpolator.getInterpolationIdentifier()] = interpolator; + }); + } + var getTranslationTable = function (langKey) { + var deferred = $q.defer(); + if (Object.prototype.hasOwnProperty.call($translationTable, langKey)) { + deferred.resolve($translationTable[langKey]); + } else if (langPromises[langKey]) { + langPromises[langKey].then(function (data) { + translations(data.key, data.table); + deferred.resolve(data.table); + }, deferred.reject); + } else { + deferred.reject(); + } + return deferred.promise; + }; + var getFallbackTranslation = function (langKey, translationId, interpolateParams, Interpolator) { + var deferred = $q.defer(); + getTranslationTable(langKey).then(function (translationTable) { + if (Object.prototype.hasOwnProperty.call(translationTable, translationId)) { + Interpolator.setLocale(langKey); + deferred.resolve(Interpolator.interpolate(translationTable[translationId], interpolateParams)); + Interpolator.setLocale($uses); + } else { + deferred.reject(); + } + }, deferred.reject); + return deferred.promise; + }; + var getFallbackTranslationInstant = function (langKey, translationId, interpolateParams, Interpolator) { + var result, translationTable = $translationTable[langKey]; + if (Object.prototype.hasOwnProperty.call(translationTable, translationId)) { + Interpolator.setLocale(langKey); + result = Interpolator.interpolate(translationTable[translationId], interpolateParams); + Interpolator.setLocale($uses); + } + return result; + }; + var translateByHandler = function (translationId) { + if ($missingTranslationHandlerFactory) { + var resultString = $injector.get($missingTranslationHandlerFactory)(translationId, $uses); + if (resultString !== undefined) { + return resultString; + } else { + return translationId; + } + } else { + return translationId; + } + }; + var resolveForFallbackLanguage = function (fallbackLanguageIndex, translationId, interpolateParams, Interpolator) { + var deferred = $q.defer(); + if (fallbackLanguageIndex < $fallbackLanguage.length) { + var langKey = $fallbackLanguage[fallbackLanguageIndex]; + getFallbackTranslation(langKey, translationId, interpolateParams, Interpolator).then(deferred.resolve, function () { + resolveForFallbackLanguage(fallbackLanguageIndex + 1, translationId, interpolateParams, Interpolator).then(deferred.resolve); + }); + } else { + deferred.resolve(translateByHandler(translationId)); + } + return deferred.promise; + }; + var resolveForFallbackLanguageInstant = function (fallbackLanguageIndex, translationId, interpolateParams, Interpolator) { + var result; + if (fallbackLanguageIndex < $fallbackLanguage.length) { + var langKey = $fallbackLanguage[fallbackLanguageIndex]; + result = getFallbackTranslationInstant(langKey, translationId, interpolateParams, Interpolator); + if (!result) { + result = resolveForFallbackLanguageInstant(fallbackLanguageIndex + 1, translationId, interpolateParams, Interpolator); + } + } + return result; + }; + var fallbackTranslation = function (translationId, interpolateParams, Interpolator) { + return resolveForFallbackLanguage(startFallbackIteration > 0 ? startFallbackIteration : fallbackIndex, translationId, interpolateParams, Interpolator); + }; + var fallbackTranslationInstant = function (translationId, interpolateParams, Interpolator) { + return resolveForFallbackLanguageInstant(startFallbackIteration > 0 ? startFallbackIteration : fallbackIndex, translationId, interpolateParams, Interpolator); + }; + var determineTranslation = function (translationId, interpolateParams, interpolationId) { + var deferred = $q.defer(); + var table = $uses ? $translationTable[$uses] : $translationTable, + Interpolator = interpolationId ? interpolatorHashMap[interpolationId] : defaultInterpolator; + if (table && Object.prototype.hasOwnProperty.call(table, translationId)) { + var translation = table[translationId]; + if (translation.substr(0, 2) === '@:') { + $translate(translation.substr(2), interpolateParams, interpolationId).then(deferred.resolve, deferred.reject); + } else { + deferred.resolve(Interpolator.interpolate(translation, interpolateParams)); + } + } else { + var missingTranslationHandlerTranslation; + if ($missingTranslationHandlerFactory && !pendingLoader) { + missingTranslationHandlerTranslation = translateByHandler(translationId); + } + if ($uses && $fallbackLanguage && $fallbackLanguage.length) { + fallbackTranslation(translationId, interpolateParams, Interpolator).then(function (translation) { + deferred.resolve(translation); + }, function (_translationId) { + deferred.reject(applyNotFoundIndicators(_translationId)); + }); + } else if ($missingTranslationHandlerFactory && !pendingLoader && missingTranslationHandlerTranslation) { + deferred.resolve(missingTranslationHandlerTranslation); + } else { + deferred.reject(applyNotFoundIndicators(translationId)); + } + } + return deferred.promise; + }; + var determineTranslationInstant = function (translationId, interpolateParams, interpolationId) { + var result, table = $uses ? $translationTable[$uses] : $translationTable, + Interpolator = interpolationId ? interpolatorHashMap[interpolationId] : defaultInterpolator; + if (table && Object.prototype.hasOwnProperty.call(table, translationId)) { + var translation = table[translationId]; + if (translation.substr(0, 2) === '@:') { + result = determineTranslationInstant(translation.substr(2), interpolateParams, interpolationId); + } else { + result = Interpolator.interpolate(translation, interpolateParams); + } + } else { + var missingTranslationHandlerTranslation; + if ($missingTranslationHandlerFactory && !pendingLoader) { + missingTranslationHandlerTranslation = translateByHandler(translationId); + } + if ($uses && $fallbackLanguage && $fallbackLanguage.length) { + fallbackIndex = 0; + result = fallbackTranslationInstant(translationId, interpolateParams, Interpolator); + } else if ($missingTranslationHandlerFactory && !pendingLoader && missingTranslationHandlerTranslation) { + result = missingTranslationHandlerTranslation; + } else { + result = applyNotFoundIndicators(translationId); + } + } + return result; + }; + $translate.preferredLanguage = function (langKey) { + if (langKey) { + setupPreferredLanguage(langKey); + } + return $preferredLanguage; + }; + $translate.cloakClassName = function () { + return $cloakClassName; + }; + $translate.fallbackLanguage = function (langKey) { + if (langKey !== undefined && langKey !== null) { + fallbackStack(langKey); + if ($loaderFactory) { + if ($fallbackLanguage && $fallbackLanguage.length) { + for (var i = 0, len = $fallbackLanguage.length; i < len; i++) { + if (!langPromises[$fallbackLanguage[i]]) { + langPromises[$fallbackLanguage[i]] = loadAsync($fallbackLanguage[i]); + } + } + } + } + $translate.use($translate.use()); + } + if ($fallbackWasString) { + return $fallbackLanguage[0]; + } else { + return $fallbackLanguage; + } + }; + $translate.useFallbackLanguage = function (langKey) { + if (langKey !== undefined && langKey !== null) { + if (!langKey) { + startFallbackIteration = 0; + } else { + var langKeyPosition = indexOf($fallbackLanguage, langKey); + if (langKeyPosition > -1) { + startFallbackIteration = langKeyPosition; + } + } + } + }; + $translate.proposedLanguage = function () { + return $nextLang; + }; + $translate.storage = function () { + return Storage; + }; + $translate.use = function (key) { + if (!key) { + return $uses; + } + var deferred = $q.defer(); + $rootScope.$emit('$translateChangeStart', {language: key}); + var aliasedKey = negotiateLocale(key); + if (aliasedKey) { + key = aliasedKey; + } + if (!$translationTable[key] && $loaderFactory && !langPromises[key]) { + $nextLang = key; + langPromises[key] = loadAsync(key).then(function (translation) { + translations(translation.key, translation.table); + deferred.resolve(translation.key); + useLanguage(translation.key); + if ($nextLang === key) { + $nextLang = undefined; + } + }, function (key) { + if ($nextLang === key) { + $nextLang = undefined; + } + $rootScope.$emit('$translateChangeError', {language: key}); + deferred.reject(key); + $rootScope.$emit('$translateChangeEnd', {language: key}); + }); + } else { + deferred.resolve(key); + useLanguage(key); + } + return deferred.promise; + }; + $translate.storageKey = function () { + return storageKey(); + }; + $translate.isPostCompilingEnabled = function () { + return $postCompilingEnabled; + }; + $translate.refresh = function (langKey) { + if (!$loaderFactory) { + throw new Error('Couldn\'t refresh translation table, no loader registered!'); + } + var deferred = $q.defer(); + + function resolve() { + deferred.resolve(); + $rootScope.$emit('$translateRefreshEnd', {language: langKey}); + } + + function reject() { + deferred.reject(); + $rootScope.$emit('$translateRefreshEnd', {language: langKey}); + } + + $rootScope.$emit('$translateRefreshStart', {language: langKey}); + if (!langKey) { + var tables = [], loadingKeys = {}; + if ($fallbackLanguage && $fallbackLanguage.length) { + for (var i = 0, len = $fallbackLanguage.length; i < len; i++) { + tables.push(loadAsync($fallbackLanguage[i])); + loadingKeys[$fallbackLanguage[i]] = true; + } + } + if ($uses && !loadingKeys[$uses]) { + tables.push(loadAsync($uses)); + } + $q.all(tables).then(function (tableData) { + angular.forEach(tableData, function (data) { + if ($translationTable[data.key]) { + delete $translationTable[data.key]; + } + translations(data.key, data.table); + }); + if ($uses) { + useLanguage($uses); + } + resolve(); + }); + } else if ($translationTable[langKey]) { + loadAsync(langKey).then(function (data) { + translations(data.key, data.table); + if (langKey === $uses) { + useLanguage($uses); + } + resolve(); + }, reject); + } else { + reject(); + } + return deferred.promise; + }; + $translate.instant = function (translationId, interpolateParams, interpolationId) { + if (translationId === null || angular.isUndefined(translationId)) { + return translationId; + } + if (angular.isArray(translationId)) { + var results = {}; + for (var i = 0, c = translationId.length; i < c; i++) { + results[translationId[i]] = $translate.instant(translationId[i], interpolateParams, interpolationId); + } + return results; + } + if (angular.isString(translationId) && translationId.length < 1) { + return translationId; + } + if (translationId) { + translationId = trim.apply(translationId); + } + var result, possibleLangKeys = []; + if ($preferredLanguage) { + possibleLangKeys.push($preferredLanguage); + } + if ($uses) { + possibleLangKeys.push($uses); + } + if ($fallbackLanguage && $fallbackLanguage.length) { + possibleLangKeys = possibleLangKeys.concat($fallbackLanguage); + } + for (var j = 0, d = possibleLangKeys.length; j < d; j++) { + var possibleLangKey = possibleLangKeys[j]; + if ($translationTable[possibleLangKey]) { + if (typeof $translationTable[possibleLangKey][translationId] !== 'undefined') { + result = determineTranslationInstant(translationId, interpolateParams, interpolationId); + } + } + if (typeof result !== 'undefined') { + break; + } + } + if (!result && result !== '') { + result = defaultInterpolator.interpolate(translationId, interpolateParams); + if ($missingTranslationHandlerFactory && !pendingLoader) { + result = translateByHandler(translationId); + } + } + return result; + }; + $translate.versionInfo = function () { + return version; + }; + $translate.loaderCache = function () { + return loaderCache; + }; + if ($loaderFactory) { + if (angular.equals($translationTable, {})) { + $translate.use($translate.use()); + } + if ($fallbackLanguage && $fallbackLanguage.length) { + var processAsyncResult = function (translation) { + translations(translation.key, translation.table); + $rootScope.$emit('$translateChangeEnd', {language: translation.key}); + }; + for (var i = 0, len = $fallbackLanguage.length; i < len; i++) { + langPromises[$fallbackLanguage[i]] = loadAsync($fallbackLanguage[i]).then(processAsyncResult); + } + } + } + return $translate; + } + ]; + } ]); angular.module('pascalprecht.translate').factory('$translateDefaultInterpolation', [ - '$interpolate', - function ($interpolate) { - var $translateInterpolator = {}, $locale, $identifier = 'default', $sanitizeValueStrategy = null, sanitizeValueStrategies = { - escaped: function (params) { - var result = {}; - for (var key in params) { - if (Object.prototype.hasOwnProperty.call(params, key)) { - result[key] = angular.element('
    ').text(params[key]).html(); - } - } - return result; - } - }; - var sanitizeParams = function (params) { - var result; - if (angular.isFunction(sanitizeValueStrategies[$sanitizeValueStrategy])) { - result = sanitizeValueStrategies[$sanitizeValueStrategy](params); - } else { - result = params; - } - return result; - }; - $translateInterpolator.setLocale = function (locale) { - $locale = locale; - }; - $translateInterpolator.getInterpolationIdentifier = function () { - return $identifier; - }; - $translateInterpolator.useSanitizeValueStrategy = function (value) { - $sanitizeValueStrategy = value; - return this; - }; - $translateInterpolator.interpolate = function (string, interpolateParams) { - if ($sanitizeValueStrategy) { - interpolateParams = sanitizeParams(interpolateParams); - } - return $interpolate(string)(interpolateParams || {}); - }; - return $translateInterpolator; - } + '$interpolate', + function ($interpolate) { + var $translateInterpolator = {}, $locale, $identifier = 'default', $sanitizeValueStrategy = null, + sanitizeValueStrategies = { + escaped: function (params) { + var result = {}; + for (var key in params) { + if (Object.prototype.hasOwnProperty.call(params, key)) { + result[key] = angular.element('
    ').text(params[key]).html(); + } + } + return result; + } + }; + var sanitizeParams = function (params) { + var result; + if (angular.isFunction(sanitizeValueStrategies[$sanitizeValueStrategy])) { + result = sanitizeValueStrategies[$sanitizeValueStrategy](params); + } else { + result = params; + } + return result; + }; + $translateInterpolator.setLocale = function (locale) { + $locale = locale; + }; + $translateInterpolator.getInterpolationIdentifier = function () { + return $identifier; + }; + $translateInterpolator.useSanitizeValueStrategy = function (value) { + $sanitizeValueStrategy = value; + return this; + }; + $translateInterpolator.interpolate = function (string, interpolateParams) { + if ($sanitizeValueStrategy) { + interpolateParams = sanitizeParams(interpolateParams); + } + return $interpolate(string)(interpolateParams || {}); + }; + return $translateInterpolator; + } ]); angular.module('pascalprecht.translate').constant('$STORAGE_KEY', 'NG_TRANSLATE_LANG_KEY'); angular.module('pascalprecht.translate').directive('translate', [ - '$translate', - '$q', - '$interpolate', - '$compile', - '$parse', - '$rootScope', - function ($translate, $q, $interpolate, $compile, $parse, $rootScope) { - return { - restrict: 'AE', - scope: true, - compile: function (tElement, tAttr) { - var translateValuesExist = tAttr.translateValues ? tAttr.translateValues : undefined; - var translateInterpolation = tAttr.translateInterpolation ? tAttr.translateInterpolation : undefined; - var translateValueExist = tElement[0].outerHTML.match(/translate-value-+/i); - var interpolateRegExp = '^(.*)(' + $interpolate.startSymbol() + '.*' + $interpolate.endSymbol() + ')(.*)'; - return function linkFn(scope, iElement, iAttr) { - scope.interpolateParams = {}; - scope.preText = ''; - scope.postText = ''; - iAttr.$observe('translate', function (translationId) { - if (angular.equals(translationId, '') || !angular.isDefined(translationId)) { - var interpolateMatches = iElement.text().match(interpolateRegExp); - if (angular.isArray(interpolateMatches)) { - scope.preText = interpolateMatches[1]; - scope.postText = interpolateMatches[3]; - scope.translationId = $interpolate(interpolateMatches[2])(scope.$parent); - } else { - scope.translationId = iElement.text().replace(/^\s+|\s+$/g, ''); - } - } else { - scope.translationId = translationId; - } - }); - iAttr.$observe('translateDefault', function (value) { - scope.defaultText = value; - }); - if (translateValuesExist) { - iAttr.$observe('translateValues', function (interpolateParams) { - if (interpolateParams) { - scope.$parent.$watch(function () { - angular.extend(scope.interpolateParams, $parse(interpolateParams)(scope.$parent)); - }); - } - }); - } - if (translateValueExist) { - var fn = function (attrName) { - iAttr.$observe(attrName, function (value) { - scope.interpolateParams[angular.lowercase(attrName.substr(14, 1)) + attrName.substr(15)] = value; - }); - }; - for (var attr in iAttr) { - if (Object.prototype.hasOwnProperty.call(iAttr, attr) && attr.substr(0, 14) === 'translateValue' && attr !== 'translateValues') { - fn(attr); - } - } - } - var applyElementContent = function (value, scope, successful) { - if (!successful && typeof scope.defaultText !== 'undefined') { - value = scope.defaultText; - } - iElement.html(scope.preText + value + scope.postText); - var globallyEnabled = $translate.isPostCompilingEnabled(); - var locallyDefined = typeof tAttr.translateCompile !== 'undefined'; - var locallyEnabled = locallyDefined && tAttr.translateCompile !== 'false'; - if (globallyEnabled && !locallyDefined || locallyEnabled) { - $compile(iElement.contents())(scope); - } - }; - var updateTranslationFn = function () { - if (!translateValuesExist && !translateValueExist) { - return function () { - var unwatch = scope.$watch('translationId', function (value) { - if (scope.translationId && value) { - $translate(value, {}, translateInterpolation).then(function (translation) { - applyElementContent(translation, scope, true); - unwatch(); - }, function (translationId) { - applyElementContent(translationId, scope, false); - unwatch(); - }); - } - }, true); - }; - } else { - return function () { - var updateTranslations = function () { - if (scope.translationId && scope.interpolateParams) { - $translate(scope.translationId, scope.interpolateParams, translateInterpolation).then(function (translation) { - applyElementContent(translation, scope, true); - }, function (translationId) { - applyElementContent(translationId, scope, false); - }); - } - }; - scope.$watch('interpolateParams', updateTranslations, true); - scope.$watch('translationId', updateTranslations); - }; - } - }(); - var unbind = $rootScope.$on('$translateChangeSuccess', updateTranslationFn); - updateTranslationFn(); - scope.$on('$destroy', unbind); - }; - } - }; - } + '$translate', + '$q', + '$interpolate', + '$compile', + '$parse', + '$rootScope', + function ($translate, $q, $interpolate, $compile, $parse, $rootScope) { + return { + restrict: 'AE', + scope: true, + compile: function (tElement, tAttr) { + var translateValuesExist = tAttr.translateValues ? tAttr.translateValues : undefined; + var translateInterpolation = tAttr.translateInterpolation ? tAttr.translateInterpolation : undefined; + var translateValueExist = tElement[0].outerHTML.match(/translate-value-+/i); + var interpolateRegExp = '^(.*)(' + $interpolate.startSymbol() + '.*' + $interpolate.endSymbol() + ')(.*)'; + return function linkFn(scope, iElement, iAttr) { + scope.interpolateParams = {}; + scope.preText = ''; + scope.postText = ''; + iAttr.$observe('translate', function (translationId) { + if (angular.equals(translationId, '') || !angular.isDefined(translationId)) { + var interpolateMatches = iElement.text().match(interpolateRegExp); + if (angular.isArray(interpolateMatches)) { + scope.preText = interpolateMatches[1]; + scope.postText = interpolateMatches[3]; + scope.translationId = $interpolate(interpolateMatches[2])(scope.$parent); + } else { + scope.translationId = iElement.text().replace(/^\s+|\s+$/g, ''); + } + } else { + scope.translationId = translationId; + } + }); + iAttr.$observe('translateDefault', function (value) { + scope.defaultText = value; + }); + if (translateValuesExist) { + iAttr.$observe('translateValues', function (interpolateParams) { + if (interpolateParams) { + scope.$parent.$watch(function () { + angular.extend(scope.interpolateParams, $parse(interpolateParams)(scope.$parent)); + }); + } + }); + } + if (translateValueExist) { + var fn = function (attrName) { + iAttr.$observe(attrName, function (value) { + scope.interpolateParams[angular.lowercase(attrName.substr(14, 1)) + attrName.substr(15)] = value; + }); + }; + for (var attr in iAttr) { + if (Object.prototype.hasOwnProperty.call(iAttr, attr) && attr.substr(0, 14) === 'translateValue' && attr !== 'translateValues') { + fn(attr); + } + } + } + var applyElementContent = function (value, scope, successful) { + if (!successful && typeof scope.defaultText !== 'undefined') { + value = scope.defaultText; + } + iElement.html(scope.preText + value + scope.postText); + var globallyEnabled = $translate.isPostCompilingEnabled(); + var locallyDefined = typeof tAttr.translateCompile !== 'undefined'; + var locallyEnabled = locallyDefined && tAttr.translateCompile !== 'false'; + if (globallyEnabled && !locallyDefined || locallyEnabled) { + $compile(iElement.contents())(scope); + } + }; + var updateTranslationFn = function () { + if (!translateValuesExist && !translateValueExist) { + return function () { + var unwatch = scope.$watch('translationId', function (value) { + if (scope.translationId && value) { + $translate(value, {}, translateInterpolation).then(function (translation) { + applyElementContent(translation, scope, true); + unwatch(); + }, function (translationId) { + applyElementContent(translationId, scope, false); + unwatch(); + }); + } + }, true); + }; + } else { + return function () { + var updateTranslations = function () { + if (scope.translationId && scope.interpolateParams) { + $translate(scope.translationId, scope.interpolateParams, translateInterpolation).then(function (translation) { + applyElementContent(translation, scope, true); + }, function (translationId) { + applyElementContent(translationId, scope, false); + }); + } + }; + scope.$watch('interpolateParams', updateTranslations, true); + scope.$watch('translationId', updateTranslations); + }; + } + }(); + var unbind = $rootScope.$on('$translateChangeSuccess', updateTranslationFn); + updateTranslationFn(); + scope.$on('$destroy', unbind); + }; + } + }; + } ]); angular.module('pascalprecht.translate').directive('translateCloak', [ - '$rootScope', - '$translate', - function ($rootScope, $translate) { - return { - compile: function (tElement) { - var applyCloak = function () { - tElement.addClass($translate.cloakClassName()); - }, removeCloak = function () { - tElement.removeClass($translate.cloakClassName()); - }, removeListener = $rootScope.$on('$translateChangeEnd', function () { - removeCloak(); - removeListener(); - removeListener = null; - }); - applyCloak(); - return function linkFn(scope, iElement, iAttr) { - if (iAttr.translateCloak && iAttr.translateCloak.length) { - iAttr.$observe('translateCloak', function (translationId) { - $translate(translationId).then(removeCloak, applyCloak); - }); - } - }; - } - }; - } + '$rootScope', + '$translate', + function ($rootScope, $translate) { + return { + compile: function (tElement) { + var applyCloak = function () { + tElement.addClass($translate.cloakClassName()); + }, removeCloak = function () { + tElement.removeClass($translate.cloakClassName()); + }, removeListener = $rootScope.$on('$translateChangeEnd', function () { + removeCloak(); + removeListener(); + removeListener = null; + }); + applyCloak(); + return function linkFn(scope, iElement, iAttr) { + if (iAttr.translateCloak && iAttr.translateCloak.length) { + iAttr.$observe('translateCloak', function (translationId) { + $translate(translationId).then(removeCloak, applyCloak); + }); + } + }; + } + }; + } ]); angular.module('pascalprecht.translate').filter('translate', [ - '$parse', - '$translate', - function ($parse, $translate) { - var translateFilter = function (translationId, interpolateParams, interpolation) { - if (!angular.isObject(interpolateParams)) { - interpolateParams = $parse(interpolateParams)(this); - } - return $translate.instant(translationId, interpolateParams, interpolation); - }; - translateFilter.$stateful = true; - return translateFilter; - } -]); \ No newline at end of file + '$parse', + '$translate', + function ($parse, $translate) { + var translateFilter = function (translationId, interpolateParams, interpolation) { + if (!angular.isObject(interpolateParams)) { + interpolateParams = $parse(interpolateParams)(this); + } + return $translate.instant(translationId, interpolateParams, interpolation); + }; + translateFilter.$stateful = true; + return translateFilter; + } +]); diff --git a/len-activiti/src/main/resources/static/editor-app/libs/bootstrap-daterangepicker_1.3.7/daterangepicker-bs3.css b/len-activiti/src/main/resources/static/editor-app/libs/bootstrap-daterangepicker_1.3.7/daterangepicker-bs3.css index abcaa46..11d14b4 100644 --- a/len-activiti/src/main/resources/static/editor-app/libs/bootstrap-daterangepicker_1.3.7/daterangepicker-bs3.css +++ b/len-activiti/src/main/resources/static/editor-app/libs/bootstrap-daterangepicker_1.3.7/daterangepicker-bs3.css @@ -9,259 +9,259 @@ */ .daterangepicker.dropdown-menu { - max-width: none; - z-index: 3000; + max-width: none; + z-index: 3000; } .daterangepicker.opensleft .ranges, .daterangepicker.opensleft .calendar { - float: left; - margin: 4px; + float: left; + margin: 4px; } .daterangepicker.opensright .ranges, .daterangepicker.opensright .calendar { - float: right; - margin: 4px; + float: right; + margin: 4px; } .daterangepicker .ranges { - width: 160px; - text-align: left; + width: 160px; + text-align: left; } -.daterangepicker .ranges .range_inputs>div { - float: left; +.daterangepicker .ranges .range_inputs > div { + float: left; } -.daterangepicker .ranges .range_inputs>div:nth-child(2) { - padding-left: 11px; +.daterangepicker .ranges .range_inputs > div:nth-child(2) { + padding-left: 11px; } .daterangepicker .calendar { - display: none; - max-width: 270px; + display: none; + max-width: 270px; } .daterangepicker.show-calendar .calendar { - display: block; + display: block; } .daterangepicker .calendar.single .calendar-date { - border: none; + border: none; } .daterangepicker .calendar th, .daterangepicker .calendar td { - font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; - white-space: nowrap; - text-align: center; - min-width: 32px; + font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; + white-space: nowrap; + text-align: center; + min-width: 32px; } .daterangepicker .daterangepicker_start_input label, .daterangepicker .daterangepicker_end_input label { - color: #333; - display: block; - font-size: 11px; - font-weight: normal; - height: 20px; - line-height: 20px; - margin-bottom: 2px; - text-shadow: #fff 1px 1px 0px; - text-transform: uppercase; - width: 74px; + color: #333; + display: block; + font-size: 11px; + font-weight: normal; + height: 20px; + line-height: 20px; + margin-bottom: 2px; + text-shadow: #fff 1px 1px 0px; + text-transform: uppercase; + width: 74px; } .daterangepicker .ranges input { - font-size: 11px; + font-size: 11px; } .daterangepicker .ranges .input-mini { - background-color: #eee; - border: 1px solid #ccc; - border-radius: 4px; - color: #555; - display: block; - font-size: 11px; - height: 30px; - line-height: 30px; - vertical-align: middle; - margin: 0 0 10px 0; - padding: 0 6px; - width: 74px; + background-color: #eee; + border: 1px solid #ccc; + border-radius: 4px; + color: #555; + display: block; + font-size: 11px; + height: 30px; + line-height: 30px; + vertical-align: middle; + margin: 0 0 10px 0; + padding: 0 6px; + width: 74px; } .daterangepicker .ranges ul { - list-style: none; - margin: 0; - padding: 0; + list-style: none; + margin: 0; + padding: 0; } .daterangepicker .ranges li { - font-size: 13px; - background: #f5f5f5; - border: 1px solid #f5f5f5; - color: #08c; - padding: 3px 12px; - margin-bottom: 8px; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; - cursor: pointer; + font-size: 13px; + background: #f5f5f5; + border: 1px solid #f5f5f5; + color: #08c; + padding: 3px 12px; + margin-bottom: 8px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; + cursor: pointer; } .daterangepicker .ranges li.active, .daterangepicker .ranges li:hover { - background: #08c; - border: 1px solid #08c; - color: #fff; + background: #08c; + border: 1px solid #08c; + color: #fff; } .daterangepicker .calendar-date { - border: 1px solid #ddd; - padding: 4px; - border-radius: 4px; - background: #fff; + border: 1px solid #ddd; + padding: 4px; + border-radius: 4px; + background: #fff; } .daterangepicker .calendar-time { - text-align: center; - margin: 8px auto 0 auto; - line-height: 30px; + text-align: center; + margin: 8px auto 0 auto; + line-height: 30px; } .daterangepicker { - position: absolute; - background: #fff; - top: 100px; - left: 20px; - padding: 4px; - margin-top: 1px; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; + position: absolute; + background: #fff; + top: 100px; + left: 20px; + padding: 4px; + margin-top: 1px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; } .daterangepicker.opensleft:before { - position: absolute; - top: -7px; - right: 9px; - display: inline-block; - border-right: 7px solid transparent; - border-bottom: 7px solid #ccc; - border-left: 7px solid transparent; - border-bottom-color: rgba(0, 0, 0, 0.2); - content: ''; + position: absolute; + top: -7px; + right: 9px; + display: inline-block; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-left: 7px solid transparent; + border-bottom-color: rgba(0, 0, 0, 0.2); + content: ''; } .daterangepicker.opensleft:after { - position: absolute; - top: -6px; - right: 10px; - display: inline-block; - border-right: 6px solid transparent; - border-bottom: 6px solid #fff; - border-left: 6px solid transparent; - content: ''; + position: absolute; + top: -6px; + right: 10px; + display: inline-block; + border-right: 6px solid transparent; + border-bottom: 6px solid #fff; + border-left: 6px solid transparent; + content: ''; } .daterangepicker.opensright:before { - position: absolute; - top: -7px; - left: 9px; - display: inline-block; - border-right: 7px solid transparent; - border-bottom: 7px solid #ccc; - border-left: 7px solid transparent; - border-bottom-color: rgba(0, 0, 0, 0.2); - content: ''; + position: absolute; + top: -7px; + left: 9px; + display: inline-block; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-left: 7px solid transparent; + border-bottom-color: rgba(0, 0, 0, 0.2); + content: ''; } .daterangepicker.opensright:after { - position: absolute; - top: -6px; - left: 10px; - display: inline-block; - border-right: 6px solid transparent; - border-bottom: 6px solid #fff; - border-left: 6px solid transparent; - content: ''; + position: absolute; + top: -6px; + left: 10px; + display: inline-block; + border-right: 6px solid transparent; + border-bottom: 6px solid #fff; + border-left: 6px solid transparent; + content: ''; } .daterangepicker table { - width: 100%; - margin: 0; + width: 100%; + margin: 0; } .daterangepicker td, .daterangepicker th { - text-align: center; - width: 20px; - height: 20px; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - cursor: pointer; - white-space: nowrap; + text-align: center; + width: 20px; + height: 20px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + cursor: pointer; + white-space: nowrap; } .daterangepicker td.off { - color: #999; + color: #999; } .daterangepicker td.disabled { - color: #999; + color: #999; } .daterangepicker td.available:hover, .daterangepicker th.available:hover { - background: #eee; + background: #eee; } .daterangepicker td.in-range { - background: #ebf4f8; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; + background: #ebf4f8; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; } .daterangepicker td.active, .daterangepicker td.active:hover { - background-color: #357ebd; - border-color: #3071a9; - color: #fff; + background-color: #357ebd; + border-color: #3071a9; + color: #fff; } .daterangepicker td.week, .daterangepicker th.week { - font-size: 80%; - color: #ccc; + font-size: 80%; + color: #ccc; } .daterangepicker select.monthselect, .daterangepicker select.yearselect { - font-size: 12px; - padding: 1px; - height: auto; - margin: 0; - cursor: default; + font-size: 12px; + padding: 1px; + height: auto; + margin: 0; + cursor: default; } .daterangepicker select.monthselect { - margin-right: 2%; - width: 56%; + margin-right: 2%; + width: 56%; } .daterangepicker select.yearselect { - width: 40%; + width: 40%; } .daterangepicker select.hourselect, .daterangepicker select.minuteselect, .daterangepicker select.ampmselect { - width: 50px; - margin-bottom: 0; + width: 50px; + margin-bottom: 0; } .daterangepicker_start_input { - float: left; + float: left; } .daterangepicker_end_input { - float: left; - padding-left: 11px + float: left; + padding-left: 11px } .daterangepicker th.month { - width: auto; -} \ No newline at end of file + width: auto; +} diff --git a/len-activiti/src/main/resources/static/editor-app/libs/bootstrap-daterangepicker_1.3.7/daterangepicker.js b/len-activiti/src/main/resources/static/editor-app/libs/bootstrap-daterangepicker_1.3.7/daterangepicker.js index 579e875..1b7c735 100644 --- a/len-activiti/src/main/resources/static/editor-app/libs/bootstrap-daterangepicker_1.3.7/daterangepicker.js +++ b/len-activiti/src/main/resources/static/editor-app/libs/bootstrap-daterangepicker_1.3.7/daterangepicker.js @@ -8,1019 +8,1026 @@ */ !function ($, moment) { - var DateRangePicker = function (element, options, cb) { - - // by default, the daterangepicker element is placed at the bottom of HTML body - this.parentEl = 'body'; - - //element that triggered the date range picker - this.element = $(element); - - //create the picker HTML object - var DRPTemplate = ''; - - //custom options - if (typeof options !== 'object' || options === null) - options = {}; - - this.parentEl = (typeof options === 'object' && options.parentEl && $(options.parentEl).length) ? $(options.parentEl) : $(this.parentEl); - this.container = $(DRPTemplate).appendTo(this.parentEl); - - this.setOptions(options, cb); - - //apply CSS classes and labels to buttons - var c = this.container; - $.each(this.buttonClasses, function (idx, val) { - c.find('button').addClass(val); - }); - this.container.find('.daterangepicker_start_input label').html(this.locale.fromLabel); - this.container.find('.daterangepicker_end_input label').html(this.locale.toLabel); - if (this.applyClass.length) - this.container.find('.applyBtn').addClass(this.applyClass); - if (this.cancelClass.length) - this.container.find('.cancelBtn').addClass(this.cancelClass); - this.container.find('.applyBtn').html(this.locale.applyLabel); - this.container.find('.cancelBtn').html(this.locale.cancelLabel); - - //event listeners - - this.container.find('.calendar') - .on('click.daterangepicker', '.prev', $.proxy(this.clickPrev, this)) - .on('click.daterangepicker', '.next', $.proxy(this.clickNext, this)) - .on('click.daterangepicker', 'td.available', $.proxy(this.clickDate, this)) - .on('mouseenter.daterangepicker', 'td.available', $.proxy(this.enterDate, this)) - .on('mouseleave.daterangepicker', 'td.available', $.proxy(this.updateFormInputs, this)) - .on('change.daterangepicker', 'select.yearselect', $.proxy(this.updateMonthYear, this)) - .on('change.daterangepicker', 'select.monthselect', $.proxy(this.updateMonthYear, this)) - .on('change.daterangepicker', 'select.hourselect,select.minuteselect,select.ampmselect', $.proxy(this.updateTime, this)); - - this.container.find('.ranges') - .on('click.daterangepicker', 'button.applyBtn', $.proxy(this.clickApply, this)) - .on('click.daterangepicker', 'button.cancelBtn', $.proxy(this.clickCancel, this)) - .on('click.daterangepicker', '.daterangepicker_start_input,.daterangepicker_end_input', $.proxy(this.showCalendars, this)) - .on('click.daterangepicker', 'li', $.proxy(this.clickRange, this)) - .on('mouseenter.daterangepicker', 'li', $.proxy(this.enterRange, this)) - .on('mouseleave.daterangepicker', 'li', $.proxy(this.updateFormInputs, this)); - - if (this.element.is('input')) { - this.element.on({ - 'click.daterangepicker': $.proxy(this.show, this), - 'focus.daterangepicker': $.proxy(this.show, this), - 'keyup.daterangepicker': $.proxy(this.updateFromControl, this) - }); - } else { - this.element.on('click.daterangepicker', $.proxy(this.toggle, this)); - } - - }; - - DateRangePicker.prototype = { - - constructor: DateRangePicker, - - setOptions: function(options, callback) { - - this.startDate = moment().startOf('day'); - this.endDate = moment().endOf('day'); - this.minDate = false; - this.maxDate = false; - this.dateLimit = false; - - this.showDropdowns = false; - this.showWeekNumbers = false; - this.timePicker = false; - this.timePickerIncrement = 30; - this.timePicker12Hour = true; - this.singleDatePicker = false; - this.ranges = {}; - - this.opens = 'right'; - if (this.element.hasClass('pull-right')) - this.opens = 'left'; - - this.buttonClasses = ['btn', 'btn-small']; - this.applyClass = 'btn-success'; - this.cancelClass = 'btn-default'; - - this.format = 'MM/DD/YYYY'; - this.separator = ' - '; - - this.locale = { - applyLabel: 'Apply', - cancelLabel: 'Cancel', - fromLabel: 'From', - toLabel: 'To', - weekLabel: 'W', - customRangeLabel: 'Custom Range', - daysOfWeek: moment()._lang._weekdaysMin.slice(), - monthNames: moment()._lang._monthsShort.slice(), - firstDay: 0 - }; - - this.cb = function () { }; - - if (typeof options.format === 'string') - this.format = options.format; - - if (typeof options.separator === 'string') - this.separator = options.separator; - - if (typeof options.startDate === 'string') - this.startDate = moment(options.startDate, this.format); - - if (typeof options.endDate === 'string') - this.endDate = moment(options.endDate, this.format); - - if (typeof options.minDate === 'string') - this.minDate = moment(options.minDate, this.format); - - if (typeof options.maxDate === 'string') - this.maxDate = moment(options.maxDate, this.format); - - if (typeof options.startDate === 'object') - this.startDate = moment(options.startDate); - - if (typeof options.endDate === 'object') - this.endDate = moment(options.endDate); - - if (typeof options.minDate === 'object') - this.minDate = moment(options.minDate); - - if (typeof options.maxDate === 'object') - this.maxDate = moment(options.maxDate); - - if (typeof options.applyClass === 'string') - this.applyClass = options.applyClass; - - if (typeof options.cancelClass === 'string') - this.cancelClass = options.cancelClass; - - if (typeof options.dateLimit === 'object') - this.dateLimit = options.dateLimit; - - // update day names order to firstDay - if (typeof options.locale === 'object') { - - if (typeof options.locale.daysOfWeek === 'object') { - // Create a copy of daysOfWeek to avoid modification of original - // options object for reusability in multiple daterangepicker instances - this.locale.daysOfWeek = options.locale.daysOfWeek.slice(); - } - - if (typeof options.locale.monthNames === 'object') { - this.locale.monthNames = options.locale.monthNames.slice(); - } - - if (typeof options.locale.firstDay === 'number') { - this.locale.firstDay = options.locale.firstDay; - var iterator = options.locale.firstDay; - while (iterator > 0) { - this.locale.daysOfWeek.push(this.locale.daysOfWeek.shift()); - iterator--; - } - } - - if (typeof options.locale.applyLabel === 'string') { - this.locale.applyLabel = options.locale.applyLabel; - } - - if (typeof options.locale.cancelLabel === 'string') { - this.locale.cancelLabel = options.locale.cancelLabel; - } - - if (typeof options.locale.fromLabel === 'string') { - this.locale.fromLabel = options.locale.fromLabel; - } - - if (typeof options.locale.toLabel === 'string') { - this.locale.toLabel = options.locale.toLabel; - } - - if (typeof options.locale.weekLabel === 'string') { - this.locale.weekLabel = options.locale.weekLabel; - } - - if (typeof options.locale.customRangeLabel === 'string') { - this.locale.customRangeLabel = options.locale.customRangeLabel; - } - } - - if (typeof options.opens === 'string') - this.opens = options.opens; - - if (typeof options.showWeekNumbers === 'boolean') { - this.showWeekNumbers = options.showWeekNumbers; - } - - if (typeof options.buttonClasses === 'string') { - this.buttonClasses = [options.buttonClasses]; - } - - if (typeof options.buttonClasses === 'object') { - this.buttonClasses = options.buttonClasses; - } - - if (typeof options.showDropdowns === 'boolean') { - this.showDropdowns = options.showDropdowns; - } - - if (typeof options.singleDatePicker === 'boolean') { - this.singleDatePicker = options.singleDatePicker; - } - - if (typeof options.timePicker === 'boolean') { - this.timePicker = options.timePicker; - } - - if (typeof options.timePickerIncrement === 'number') { - this.timePickerIncrement = options.timePickerIncrement; - } - - if (typeof options.timePicker12Hour === 'boolean') { - this.timePicker12Hour = options.timePicker12Hour; - } - - var start, end, range; - - //if no start/end dates set, check if an input element contains initial values - if (typeof options.startDate === 'undefined' && typeof options.endDate === 'undefined') { - if ($(this.element).is('input[type=text]')) { - var val = $(this.element).val(); - var split = val.split(this.separator); - start = end = null; - if (split.length == 2) { - start = moment(split[0], this.format); - end = moment(split[1], this.format); - } else if (this.singleDatePicker) { - start = moment(val, this.format); - end = moment(val, this.format); - } - if (start !== null && end !== null) { - this.startDate = start; - this.endDate = end; - } - } - } - - if (typeof options.ranges === 'object') { - for (range in options.ranges) { - - start = moment(options.ranges[range][0]); - end = moment(options.ranges[range][1]); - - // If we have a min/max date set, bound this range - // to it, but only if it would otherwise fall - // outside of the min/max. - if (this.minDate && start.isBefore(this.minDate)) - start = moment(this.minDate); - - if (this.maxDate && end.isAfter(this.maxDate)) - end = moment(this.maxDate); - - // If the end of the range is before the minimum (if min is set) OR - // the start of the range is after the max (also if set) don't display this - // range option. - if ((this.minDate && end.isBefore(this.minDate)) || (this.maxDate && start.isAfter(this.maxDate))) { - continue; - } - - this.ranges[range] = [start, end]; - } - - var list = '
      '; - for (range in this.ranges) { - list += '
    • ' + range + '
    • '; - } - list += '
    • ' + this.locale.customRangeLabel + '
    • '; - list += '
    '; - this.container.find('.ranges ul').remove(); - this.container.find('.ranges').prepend(list); - } - - if (typeof callback === 'function') { - this.cb = callback; - } - - if (!this.timePicker) { - this.startDate = this.startDate.startOf('day'); - this.endDate = this.endDate.endOf('day'); - } - - if (this.singleDatePicker) { - this.opens = 'right'; - this.container.find('.calendar.right').show(); - this.container.find('.calendar.left').hide(); - this.container.find('.ranges').hide(); - if (!this.container.find('.calendar.right').hasClass('single')) - this.container.find('.calendar.right').addClass('single'); - } else { - this.container.find('.calendar.right').removeClass('single'); - this.container.find('.ranges').show(); - } - - this.oldStartDate = this.startDate.clone(); - this.oldEndDate = this.endDate.clone(); - this.oldChosenLabel = this.chosenLabel; - - this.leftCalendar = { - month: moment([this.startDate.year(), this.startDate.month(), 1, this.startDate.hour(), this.startDate.minute()]), - calendar: [] - }; - - this.rightCalendar = { - month: moment([this.endDate.year(), this.endDate.month(), 1, this.endDate.hour(), this.endDate.minute()]), - calendar: [] - }; - - if (this.opens == 'right') { - //swap calendar positions - var left = this.container.find('.calendar.left'); - var right = this.container.find('.calendar.right'); - left.removeClass('left').addClass('right'); - right.removeClass('right').addClass('left'); - } - - if (typeof options.ranges === 'undefined' && !this.singleDatePicker) { - this.container.addClass('show-calendar'); - } - - this.container.addClass('opens' + this.opens); - - this.updateView(); - this.updateCalendars(); - - }, - - setStartDate: function(startDate) { - if (typeof startDate === 'string') - this.startDate = moment(startDate, this.format); - - if (typeof startDate === 'object') - this.startDate = moment(startDate); - - if (!this.timePicker) - this.startDate = this.startDate.startOf('day'); - - this.oldStartDate = this.startDate.clone(); - - this.updateView(); - this.updateCalendars(); - }, - - setEndDate: function(endDate) { - if (typeof endDate === 'string') - this.endDate = moment(endDate, this.format); - - if (typeof endDate === 'object') - this.endDate = moment(endDate); - - if (!this.timePicker) - this.endDate = this.endDate.endOf('day'); - - this.oldEndDate = this.endDate.clone(); - - this.updateView(); - this.updateCalendars(); - }, - - updateView: function () { - this.leftCalendar.month.month(this.startDate.month()).year(this.startDate.year()); - this.rightCalendar.month.month(this.endDate.month()).year(this.endDate.year()); - this.updateFormInputs(); - }, - - updateFormInputs: function () { - this.container.find('input[name=daterangepicker_start]').val(this.startDate.format(this.format)); - this.container.find('input[name=daterangepicker_end]').val(this.endDate.format(this.format)); - - if (this.startDate.isSame(this.endDate) || this.startDate.isBefore(this.endDate)) { - this.container.find('button.applyBtn').removeAttr('disabled'); - } else { - this.container.find('button.applyBtn').attr('disabled', 'disabled'); - } - }, - - updateFromControl: function () { - if (!this.element.is('input')) return; - if (!this.element.val().length) return; - - var dateString = this.element.val().split(this.separator), - start = null, - end = null; - - if(dateString.length === 2) { - start = moment(dateString[0], this.format); - end = moment(dateString[1], this.format); - } - - if (this.singleDatePicker || start === null || end === null) { - start = moment(this.element.val(), this.format); - end = start; - } - - if (end.isBefore(start)) return; - - this.oldStartDate = this.startDate.clone(); - this.oldEndDate = this.endDate.clone(); - - this.startDate = start; - this.endDate = end; - - if (!this.startDate.isSame(this.oldStartDate) || !this.endDate.isSame(this.oldEndDate)) - this.notify(); - - this.updateCalendars(); - }, - - notify: function () { - this.updateView(); - this.cb(this.startDate, this.endDate, this.chosenLabel); - }, - - move: function () { - var parentOffset = { top: 0, left: 0 }; - if (!this.parentEl.is('body')) { - parentOffset = { - top: this.parentEl.offset().top - this.parentEl.scrollTop(), - left: this.parentEl.offset().left - this.parentEl.scrollLeft() - }; - } - - if (this.opens == 'left') { - this.container.css({ - top: this.element.offset().top + this.element.outerHeight() - parentOffset.top, - right: $(window).width() - this.element.offset().left - this.element.outerWidth() - parentOffset.left, - left: 'auto' - }); - if (this.container.offset().left < 0) { - this.container.css({ - right: 'auto', - left: 9 - }); - } - } else { - this.container.css({ - top: this.element.offset().top + this.element.outerHeight() - parentOffset.top, - left: this.element.offset().left - parentOffset.left, - right: 'auto' - }); - if (this.container.offset().left + this.container.outerWidth() > $(window).width()) { - this.container.css({ - left: 'auto', - right: 0 - }); - } - } - }, - - toggle: function (e) { - if (this.element.hasClass('active')) { - this.hide(); - } else { - this.show(); - } - }, - - show: function (e) { - this.element.addClass('active'); - this.container.show(); - this.move(); - - // Create a click proxy that is private to this instance of datepicker, for unbinding - this._outsideClickProxy = $.proxy(function (e) { this.outsideClick(e); }, this); - // Bind global datepicker mousedown for hiding and - $(document) - .on('mousedown.daterangepicker', this._outsideClickProxy) - // also explicitly play nice with Bootstrap dropdowns, which stopPropagation when clicking them - .on('click.daterangepicker', '[data-toggle=dropdown]', this._outsideClickProxy) - // and also close when focus changes to outside the picker (eg. tabbing between controls) - .on('focusin.daterangepicker', this._outsideClickProxy); - - this.element.trigger('show.daterangepicker', this); - }, - - outsideClick: function (e) { - var target = $(e.target); - // if the page is clicked anywhere except within the daterangerpicker/button - // itself then call this.hide() - if ( - target.closest(this.element).length || - target.closest(this.container).length || - target.closest('.calendar-date').length - ) return; - this.hide(); - }, - - hide: function (e) { - $(document) - .off('mousedown.daterangepicker', this._outsideClickProxy) - .off('click.daterangepicker', this._outsideClickProxy) - .off('focusin.daterangepicker', this._outsideClickProxy); - - this.element.removeClass('active'); - this.container.hide(); - - if (!this.startDate.isSame(this.oldStartDate) || !this.endDate.isSame(this.oldEndDate)) - this.notify(); - - this.oldStartDate = this.startDate.clone(); - this.oldEndDate = this.endDate.clone(); - - this.element.trigger('hide.daterangepicker', this); - }, - - enterRange: function (e) { - // mouse pointer has entered a range label - var label = e.target.innerHTML; - if (label == this.locale.customRangeLabel) { - this.updateView(); - } else { - var dates = this.ranges[label]; - this.container.find('input[name=daterangepicker_start]').val(dates[0].format(this.format)); - this.container.find('input[name=daterangepicker_end]').val(dates[1].format(this.format)); - } - }, - - showCalendars: function() { - this.container.addClass('show-calendar'); - this.move(); - }, - - hideCalendars: function() { - this.container.removeClass('show-calendar'); - }, - - updateInputText: function() { - if (this.element.is('input') && !this.singleDatePicker) { - this.element.val(this.startDate.format(this.format) + this.separator + this.endDate.format(this.format)); - } else if (this.element.is('input')) { - this.element.val(this.startDate.format(this.format)); - } - }, - - clickRange: function (e) { - var label = e.target.innerHTML; - this.chosenLabel = label; - if (label == this.locale.customRangeLabel) { - this.showCalendars(); - } else { - var dates = this.ranges[label]; - - this.startDate = dates[0]; - this.endDate = dates[1]; - - if (!this.timePicker) { - this.startDate.startOf('day'); - this.endDate.endOf('day'); - } - - this.leftCalendar.month.month(this.startDate.month()).year(this.startDate.year()).hour(this.startDate.hour()).minute(this.startDate.minute()); - this.rightCalendar.month.month(this.endDate.month()).year(this.endDate.year()).hour(this.endDate.hour()).minute(this.endDate.minute()); - this.updateCalendars(); - - this.updateInputText(); - - this.hideCalendars(); - this.hide(); - this.element.trigger('apply.daterangepicker', this); - } - }, - - clickPrev: function (e) { - var cal = $(e.target).parents('.calendar'); - if (cal.hasClass('left')) { - this.leftCalendar.month.subtract('month', 1); - } else { - this.rightCalendar.month.subtract('month', 1); - } - this.updateCalendars(); - }, - - clickNext: function (e) { - var cal = $(e.target).parents('.calendar'); - if (cal.hasClass('left')) { - this.leftCalendar.month.add('month', 1); - } else { - this.rightCalendar.month.add('month', 1); - } - this.updateCalendars(); - }, - - enterDate: function (e) { - - var title = $(e.target).attr('data-title'); - var row = title.substr(1, 1); - var col = title.substr(3, 1); - var cal = $(e.target).parents('.calendar'); - - if (cal.hasClass('left')) { - this.container.find('input[name=daterangepicker_start]').val(this.leftCalendar.calendar[row][col].format(this.format)); - } else { - this.container.find('input[name=daterangepicker_end]').val(this.rightCalendar.calendar[row][col].format(this.format)); - } - - }, - - clickDate: function (e) { - var title = $(e.target).attr('data-title'); - var row = title.substr(1, 1); - var col = title.substr(3, 1); - var cal = $(e.target).parents('.calendar'); - - var startDate, endDate; - if (cal.hasClass('left')) { - startDate = this.leftCalendar.calendar[row][col]; - endDate = this.endDate; - if (typeof this.dateLimit === 'object') { - var maxDate = moment(startDate).add(this.dateLimit).startOf('day'); - if (endDate.isAfter(maxDate)) { - endDate = maxDate; - } - } - } else { - startDate = this.startDate; - endDate = this.rightCalendar.calendar[row][col]; - if (typeof this.dateLimit === 'object') { - var minDate = moment(endDate).subtract(this.dateLimit).startOf('day'); - if (startDate.isBefore(minDate)) { - startDate = minDate; - } - } - } - - if (this.singleDatePicker && cal.hasClass('left')) { - endDate = startDate.clone(); - } else if (this.singleDatePicker && cal.hasClass('right')) { - startDate = endDate.clone(); - } - - cal.find('td').removeClass('active'); - - if (startDate.isSame(endDate) || startDate.isBefore(endDate)) { - $(e.target).addClass('active'); - this.startDate = startDate; - this.endDate = endDate; - this.chosenLabel = this.locale.customRangeLabel; - } else if (startDate.isAfter(endDate)) { - $(e.target).addClass('active'); - var difference = this.endDate.diff(this.startDate); - this.startDate = startDate; - this.endDate = moment(startDate).add('ms', difference); - this.chosenLabel = this.locale.customRangeLabel; - } - - this.leftCalendar.month.month(this.startDate.month()).year(this.startDate.year()); - this.rightCalendar.month.month(this.endDate.month()).year(this.endDate.year()); - this.updateCalendars(); - - if (!this.timePicker) - endDate.endOf('day'); - - if (this.singleDatePicker) - this.clickApply(); - }, - - clickApply: function (e) { - this.updateInputText(); - this.hide(); - this.element.trigger('apply.daterangepicker', this); - }, - - clickCancel: function (e) { - this.startDate = this.oldStartDate; - this.endDate = this.oldEndDate; - this.chosenLabel = this.oldChosenLabel; - this.updateView(); - this.updateCalendars(); - this.hide(); - this.element.trigger('cancel.daterangepicker', this); - }, - - updateMonthYear: function (e) { - var isLeft = $(e.target).closest('.calendar').hasClass('left'), - leftOrRight = isLeft ? 'left' : 'right', - cal = this.container.find('.calendar.'+leftOrRight); - - // Month must be Number for new moment versions - var month = parseInt(cal.find('.monthselect').val(), 10); - var year = cal.find('.yearselect').val(); - - this[leftOrRight+'Calendar'].month.month(month).year(year); - this.updateCalendars(); - }, - - updateTime: function(e) { - - var cal = $(e.target).closest('.calendar'), - isLeft = cal.hasClass('left'); - - var hour = parseInt(cal.find('.hourselect').val(), 10); - var minute = parseInt(cal.find('.minuteselect').val(), 10); - - if (this.timePicker12Hour) { - var ampm = cal.find('.ampmselect').val(); - if (ampm === 'PM' && hour < 12) - hour += 12; - if (ampm === 'AM' && hour === 12) - hour = 0; - } - - if (isLeft) { - var start = this.startDate.clone(); - start.hour(hour); - start.minute(minute); - this.startDate = start; - this.leftCalendar.month.hour(hour).minute(minute); - } else { - var end = this.endDate.clone(); - end.hour(hour); - end.minute(minute); - this.endDate = end; - this.rightCalendar.month.hour(hour).minute(minute); - } - - this.updateCalendars(); - }, - - updateCalendars: function () { - this.leftCalendar.calendar = this.buildCalendar(this.leftCalendar.month.month(), this.leftCalendar.month.year(), this.leftCalendar.month.hour(), this.leftCalendar.month.minute(), 'left'); - this.rightCalendar.calendar = this.buildCalendar(this.rightCalendar.month.month(), this.rightCalendar.month.year(), this.rightCalendar.month.hour(), this.rightCalendar.month.minute(), 'right'); - this.container.find('.calendar.left').empty().html(this.renderCalendar(this.leftCalendar.calendar, this.startDate, this.minDate, this.maxDate)); - this.container.find('.calendar.right').empty().html(this.renderCalendar(this.rightCalendar.calendar, this.endDate, this.startDate, this.maxDate)); - - this.container.find('.ranges li').removeClass('active'); - var customRange = true; - var i = 0; - for (var range in this.ranges) { - if (this.timePicker) { - if (this.startDate.isSame(this.ranges[range][0]) && this.endDate.isSame(this.ranges[range][1])) { - customRange = false; - this.chosenLabel = this.container.find('.ranges li:eq(' + i + ')') - .addClass('active').html(); - } - } else { - //ignore times when comparing dates if time picker is not enabled - if (this.startDate.format('YYYY-MM-DD') == this.ranges[range][0].format('YYYY-MM-DD') && this.endDate.format('YYYY-MM-DD') == this.ranges[range][1].format('YYYY-MM-DD')) { - customRange = false; - this.chosenLabel = this.container.find('.ranges li:eq(' + i + ')') - .addClass('active').html(); - } - } - i++; - } - if (customRange) { - this.chosenLabel = this.container.find('.ranges li:last') - .addClass('active').html(); - } - }, - - buildCalendar: function (month, year, hour, minute, side) { - var firstDay = moment([year, month, 1]); - var lastMonth = moment(firstDay).subtract('month', 1).month(); - var lastYear = moment(firstDay).subtract('month', 1).year(); - - var daysInLastMonth = moment([lastYear, lastMonth]).daysInMonth(); - - var dayOfWeek = firstDay.day(); - - var i; - - //initialize a 6 rows x 7 columns array for the calendar - var calendar = []; - for (i = 0; i < 6; i++) { - calendar[i] = []; - } - - //populate the calendar with date objects - var startDay = daysInLastMonth - dayOfWeek + this.locale.firstDay + 1; - if (startDay > daysInLastMonth) - startDay -= 7; - - if (dayOfWeek == this.locale.firstDay) - startDay = daysInLastMonth - 6; - - var curDate = moment([lastYear, lastMonth, startDay, 12, minute]); - var col, row; - for (i = 0, col = 0, row = 0; i < 42; i++, col++, curDate = moment(curDate).add('hour', 24)) { - if (i > 0 && col % 7 === 0) { - col = 0; - row++; - } - calendar[row][col] = curDate.clone().hour(hour); - curDate.hour(12); - } - - return calendar; - }, - - renderDropdowns: function (selected, minDate, maxDate) { - var currentMonth = selected.month(); - var monthHtml = '"; - - var currentYear = selected.year(); - var maxYear = (maxDate && maxDate.year()) || (currentYear + 5); - var minYear = (minDate && minDate.year()) || (currentYear - 50); - var yearHtml = ''; - - return monthHtml + yearHtml; - }, - - renderCalendar: function (calendar, selected, minDate, maxDate) { - - var html = '
    '; - html += ''; - html += ''; - html += ''; - - // add empty cell for week number - if (this.showWeekNumbers) - html += ''; - - if (!minDate || minDate.isBefore(calendar[1][1])) { - html += ''; - } else { - html += ''; - } - - var dateHtml = this.locale.monthNames[calendar[1][1].month()] + calendar[1][1].format(" YYYY"); - - if (this.showDropdowns) { - dateHtml = this.renderDropdowns(calendar[1][1], minDate, maxDate); - } - - html += ''; - if (!maxDate || maxDate.isAfter(calendar[1][1])) { - html += ''; - } else { - html += ''; - } - - html += ''; - html += ''; - - // add week number label - if (this.showWeekNumbers) - html += ''; - - $.each(this.locale.daysOfWeek, function (index, dayOfWeek) { - html += ''; - }); - - html += ''; - html += ''; - html += ''; - - for (var row = 0; row < 6; row++) { - html += ''; - - // add week number - if (this.showWeekNumbers) - html += ''; - - for (var col = 0; col < 7; col++) { - var cname = 'available '; - cname += (calendar[row][col].month() == calendar[1][1].month()) ? '' : 'off'; - - if ((minDate && calendar[row][col].isBefore(minDate, 'day')) || (maxDate && calendar[row][col].isAfter(maxDate, 'day'))) { - cname = ' off disabled '; - } else if (calendar[row][col].format('YYYY-MM-DD') == selected.format('YYYY-MM-DD')) { - cname += ' active '; - if (calendar[row][col].format('YYYY-MM-DD') == this.startDate.format('YYYY-MM-DD')) { - cname += ' start-date '; - } - if (calendar[row][col].format('YYYY-MM-DD') == this.endDate.format('YYYY-MM-DD')) { - cname += ' end-date '; - } - } else if (calendar[row][col] >= this.startDate && calendar[row][col] <= this.endDate) { - cname += ' in-range '; - if (calendar[row][col].isSame(this.startDate)) { cname += ' start-date '; } - if (calendar[row][col].isSame(this.endDate)) { cname += ' end-date '; } - } - - var title = 'r' + row + 'c' + col; - html += ''; - } - html += ''; - } - - html += ''; - html += '
    ' + dateHtml + '
    ' + this.locale.weekLabel + '' + dayOfWeek + '
    ' + calendar[row][0].week() + '' + calendar[row][col].date() + '
    '; - html += '
    '; - - var i; - if (this.timePicker) { - - html += '
    '; - html += ' : '; - - html += ' '; - - if (this.timePicker12Hour) { - html += ''; - } - - html += '
    '; - - } - - return html; - - }, - - remove: function() { - - this.container.remove(); - this.element.off('.daterangepicker'); - this.element.removeData('daterangepicker'); - - } - - }; - - $.fn.daterangepicker = function (options, cb) { - this.each(function () { - var el = $(this); - if (el.data('daterangepicker')) - el.data('daterangepicker').remove(); - el.data('daterangepicker', new DateRangePicker(el, options, cb)); - }); - return this; - }; - -}(window.jQuery, window.moment); \ No newline at end of file + var DateRangePicker = function (element, options, cb) { + + // by default, the daterangepicker element is placed at the bottom of HTML body + this.parentEl = 'body'; + + //element that triggered the date range picker + this.element = $(element); + + //create the picker HTML object + var DRPTemplate = ''; + + //custom options + if (typeof options !== 'object' || options === null) + options = {}; + + this.parentEl = (typeof options === 'object' && options.parentEl && $(options.parentEl).length) ? $(options.parentEl) : $(this.parentEl); + this.container = $(DRPTemplate).appendTo(this.parentEl); + + this.setOptions(options, cb); + + //apply CSS classes and labels to buttons + var c = this.container; + $.each(this.buttonClasses, function (idx, val) { + c.find('button').addClass(val); + }); + this.container.find('.daterangepicker_start_input label').html(this.locale.fromLabel); + this.container.find('.daterangepicker_end_input label').html(this.locale.toLabel); + if (this.applyClass.length) + this.container.find('.applyBtn').addClass(this.applyClass); + if (this.cancelClass.length) + this.container.find('.cancelBtn').addClass(this.cancelClass); + this.container.find('.applyBtn').html(this.locale.applyLabel); + this.container.find('.cancelBtn').html(this.locale.cancelLabel); + + //event listeners + + this.container.find('.calendar') + .on('click.daterangepicker', '.prev', $.proxy(this.clickPrev, this)) + .on('click.daterangepicker', '.next', $.proxy(this.clickNext, this)) + .on('click.daterangepicker', 'td.available', $.proxy(this.clickDate, this)) + .on('mouseenter.daterangepicker', 'td.available', $.proxy(this.enterDate, this)) + .on('mouseleave.daterangepicker', 'td.available', $.proxy(this.updateFormInputs, this)) + .on('change.daterangepicker', 'select.yearselect', $.proxy(this.updateMonthYear, this)) + .on('change.daterangepicker', 'select.monthselect', $.proxy(this.updateMonthYear, this)) + .on('change.daterangepicker', 'select.hourselect,select.minuteselect,select.ampmselect', $.proxy(this.updateTime, this)); + + this.container.find('.ranges') + .on('click.daterangepicker', 'button.applyBtn', $.proxy(this.clickApply, this)) + .on('click.daterangepicker', 'button.cancelBtn', $.proxy(this.clickCancel, this)) + .on('click.daterangepicker', '.daterangepicker_start_input,.daterangepicker_end_input', $.proxy(this.showCalendars, this)) + .on('click.daterangepicker', 'li', $.proxy(this.clickRange, this)) + .on('mouseenter.daterangepicker', 'li', $.proxy(this.enterRange, this)) + .on('mouseleave.daterangepicker', 'li', $.proxy(this.updateFormInputs, this)); + + if (this.element.is('input')) { + this.element.on({ + 'click.daterangepicker': $.proxy(this.show, this), + 'focus.daterangepicker': $.proxy(this.show, this), + 'keyup.daterangepicker': $.proxy(this.updateFromControl, this) + }); + } else { + this.element.on('click.daterangepicker', $.proxy(this.toggle, this)); + } + + }; + + DateRangePicker.prototype = { + + constructor: DateRangePicker, + + setOptions: function (options, callback) { + + this.startDate = moment().startOf('day'); + this.endDate = moment().endOf('day'); + this.minDate = false; + this.maxDate = false; + this.dateLimit = false; + + this.showDropdowns = false; + this.showWeekNumbers = false; + this.timePicker = false; + this.timePickerIncrement = 30; + this.timePicker12Hour = true; + this.singleDatePicker = false; + this.ranges = {}; + + this.opens = 'right'; + if (this.element.hasClass('pull-right')) + this.opens = 'left'; + + this.buttonClasses = ['btn', 'btn-small']; + this.applyClass = 'btn-success'; + this.cancelClass = 'btn-default'; + + this.format = 'MM/DD/YYYY'; + this.separator = ' - '; + + this.locale = { + applyLabel: 'Apply', + cancelLabel: 'Cancel', + fromLabel: 'From', + toLabel: 'To', + weekLabel: 'W', + customRangeLabel: 'Custom Range', + daysOfWeek: moment()._lang._weekdaysMin.slice(), + monthNames: moment()._lang._monthsShort.slice(), + firstDay: 0 + }; + + this.cb = function () { + }; + + if (typeof options.format === 'string') + this.format = options.format; + + if (typeof options.separator === 'string') + this.separator = options.separator; + + if (typeof options.startDate === 'string') + this.startDate = moment(options.startDate, this.format); + + if (typeof options.endDate === 'string') + this.endDate = moment(options.endDate, this.format); + + if (typeof options.minDate === 'string') + this.minDate = moment(options.minDate, this.format); + + if (typeof options.maxDate === 'string') + this.maxDate = moment(options.maxDate, this.format); + + if (typeof options.startDate === 'object') + this.startDate = moment(options.startDate); + + if (typeof options.endDate === 'object') + this.endDate = moment(options.endDate); + + if (typeof options.minDate === 'object') + this.minDate = moment(options.minDate); + + if (typeof options.maxDate === 'object') + this.maxDate = moment(options.maxDate); + + if (typeof options.applyClass === 'string') + this.applyClass = options.applyClass; + + if (typeof options.cancelClass === 'string') + this.cancelClass = options.cancelClass; + + if (typeof options.dateLimit === 'object') + this.dateLimit = options.dateLimit; + + // update day names order to firstDay + if (typeof options.locale === 'object') { + + if (typeof options.locale.daysOfWeek === 'object') { + // Create a copy of daysOfWeek to avoid modification of original + // options object for reusability in multiple daterangepicker instances + this.locale.daysOfWeek = options.locale.daysOfWeek.slice(); + } + + if (typeof options.locale.monthNames === 'object') { + this.locale.monthNames = options.locale.monthNames.slice(); + } + + if (typeof options.locale.firstDay === 'number') { + this.locale.firstDay = options.locale.firstDay; + var iterator = options.locale.firstDay; + while (iterator > 0) { + this.locale.daysOfWeek.push(this.locale.daysOfWeek.shift()); + iterator--; + } + } + + if (typeof options.locale.applyLabel === 'string') { + this.locale.applyLabel = options.locale.applyLabel; + } + + if (typeof options.locale.cancelLabel === 'string') { + this.locale.cancelLabel = options.locale.cancelLabel; + } + + if (typeof options.locale.fromLabel === 'string') { + this.locale.fromLabel = options.locale.fromLabel; + } + + if (typeof options.locale.toLabel === 'string') { + this.locale.toLabel = options.locale.toLabel; + } + + if (typeof options.locale.weekLabel === 'string') { + this.locale.weekLabel = options.locale.weekLabel; + } + + if (typeof options.locale.customRangeLabel === 'string') { + this.locale.customRangeLabel = options.locale.customRangeLabel; + } + } + + if (typeof options.opens === 'string') + this.opens = options.opens; + + if (typeof options.showWeekNumbers === 'boolean') { + this.showWeekNumbers = options.showWeekNumbers; + } + + if (typeof options.buttonClasses === 'string') { + this.buttonClasses = [options.buttonClasses]; + } + + if (typeof options.buttonClasses === 'object') { + this.buttonClasses = options.buttonClasses; + } + + if (typeof options.showDropdowns === 'boolean') { + this.showDropdowns = options.showDropdowns; + } + + if (typeof options.singleDatePicker === 'boolean') { + this.singleDatePicker = options.singleDatePicker; + } + + if (typeof options.timePicker === 'boolean') { + this.timePicker = options.timePicker; + } + + if (typeof options.timePickerIncrement === 'number') { + this.timePickerIncrement = options.timePickerIncrement; + } + + if (typeof options.timePicker12Hour === 'boolean') { + this.timePicker12Hour = options.timePicker12Hour; + } + + var start, end, range; + + //if no start/end dates set, check if an input element contains initial values + if (typeof options.startDate === 'undefined' && typeof options.endDate === 'undefined') { + if ($(this.element).is('input[type=text]')) { + var val = $(this.element).val(); + var split = val.split(this.separator); + start = end = null; + if (split.length == 2) { + start = moment(split[0], this.format); + end = moment(split[1], this.format); + } else if (this.singleDatePicker) { + start = moment(val, this.format); + end = moment(val, this.format); + } + if (start !== null && end !== null) { + this.startDate = start; + this.endDate = end; + } + } + } + + if (typeof options.ranges === 'object') { + for (range in options.ranges) { + + start = moment(options.ranges[range][0]); + end = moment(options.ranges[range][1]); + + // If we have a min/max date set, bound this range + // to it, but only if it would otherwise fall + // outside of the min/max. + if (this.minDate && start.isBefore(this.minDate)) + start = moment(this.minDate); + + if (this.maxDate && end.isAfter(this.maxDate)) + end = moment(this.maxDate); + + // If the end of the range is before the minimum (if min is set) OR + // the start of the range is after the max (also if set) don't display this + // range option. + if ((this.minDate && end.isBefore(this.minDate)) || (this.maxDate && start.isAfter(this.maxDate))) { + continue; + } + + this.ranges[range] = [start, end]; + } + + var list = '
      '; + for (range in this.ranges) { + list += '
    • ' + range + '
    • '; + } + list += '
    • ' + this.locale.customRangeLabel + '
    • '; + list += '
    '; + this.container.find('.ranges ul').remove(); + this.container.find('.ranges').prepend(list); + } + + if (typeof callback === 'function') { + this.cb = callback; + } + + if (!this.timePicker) { + this.startDate = this.startDate.startOf('day'); + this.endDate = this.endDate.endOf('day'); + } + + if (this.singleDatePicker) { + this.opens = 'right'; + this.container.find('.calendar.right').show(); + this.container.find('.calendar.left').hide(); + this.container.find('.ranges').hide(); + if (!this.container.find('.calendar.right').hasClass('single')) + this.container.find('.calendar.right').addClass('single'); + } else { + this.container.find('.calendar.right').removeClass('single'); + this.container.find('.ranges').show(); + } + + this.oldStartDate = this.startDate.clone(); + this.oldEndDate = this.endDate.clone(); + this.oldChosenLabel = this.chosenLabel; + + this.leftCalendar = { + month: moment([this.startDate.year(), this.startDate.month(), 1, this.startDate.hour(), this.startDate.minute()]), + calendar: [] + }; + + this.rightCalendar = { + month: moment([this.endDate.year(), this.endDate.month(), 1, this.endDate.hour(), this.endDate.minute()]), + calendar: [] + }; + + if (this.opens == 'right') { + //swap calendar positions + var left = this.container.find('.calendar.left'); + var right = this.container.find('.calendar.right'); + left.removeClass('left').addClass('right'); + right.removeClass('right').addClass('left'); + } + + if (typeof options.ranges === 'undefined' && !this.singleDatePicker) { + this.container.addClass('show-calendar'); + } + + this.container.addClass('opens' + this.opens); + + this.updateView(); + this.updateCalendars(); + + }, + + setStartDate: function (startDate) { + if (typeof startDate === 'string') + this.startDate = moment(startDate, this.format); + + if (typeof startDate === 'object') + this.startDate = moment(startDate); + + if (!this.timePicker) + this.startDate = this.startDate.startOf('day'); + + this.oldStartDate = this.startDate.clone(); + + this.updateView(); + this.updateCalendars(); + }, + + setEndDate: function (endDate) { + if (typeof endDate === 'string') + this.endDate = moment(endDate, this.format); + + if (typeof endDate === 'object') + this.endDate = moment(endDate); + + if (!this.timePicker) + this.endDate = this.endDate.endOf('day'); + + this.oldEndDate = this.endDate.clone(); + + this.updateView(); + this.updateCalendars(); + }, + + updateView: function () { + this.leftCalendar.month.month(this.startDate.month()).year(this.startDate.year()); + this.rightCalendar.month.month(this.endDate.month()).year(this.endDate.year()); + this.updateFormInputs(); + }, + + updateFormInputs: function () { + this.container.find('input[name=daterangepicker_start]').val(this.startDate.format(this.format)); + this.container.find('input[name=daterangepicker_end]').val(this.endDate.format(this.format)); + + if (this.startDate.isSame(this.endDate) || this.startDate.isBefore(this.endDate)) { + this.container.find('button.applyBtn').removeAttr('disabled'); + } else { + this.container.find('button.applyBtn').attr('disabled', 'disabled'); + } + }, + + updateFromControl: function () { + if (!this.element.is('input')) return; + if (!this.element.val().length) return; + + var dateString = this.element.val().split(this.separator), + start = null, + end = null; + + if (dateString.length === 2) { + start = moment(dateString[0], this.format); + end = moment(dateString[1], this.format); + } + + if (this.singleDatePicker || start === null || end === null) { + start = moment(this.element.val(), this.format); + end = start; + } + + if (end.isBefore(start)) return; + + this.oldStartDate = this.startDate.clone(); + this.oldEndDate = this.endDate.clone(); + + this.startDate = start; + this.endDate = end; + + if (!this.startDate.isSame(this.oldStartDate) || !this.endDate.isSame(this.oldEndDate)) + this.notify(); + + this.updateCalendars(); + }, + + notify: function () { + this.updateView(); + this.cb(this.startDate, this.endDate, this.chosenLabel); + }, + + move: function () { + var parentOffset = {top: 0, left: 0}; + if (!this.parentEl.is('body')) { + parentOffset = { + top: this.parentEl.offset().top - this.parentEl.scrollTop(), + left: this.parentEl.offset().left - this.parentEl.scrollLeft() + }; + } + + if (this.opens == 'left') { + this.container.css({ + top: this.element.offset().top + this.element.outerHeight() - parentOffset.top, + right: $(window).width() - this.element.offset().left - this.element.outerWidth() - parentOffset.left, + left: 'auto' + }); + if (this.container.offset().left < 0) { + this.container.css({ + right: 'auto', + left: 9 + }); + } + } else { + this.container.css({ + top: this.element.offset().top + this.element.outerHeight() - parentOffset.top, + left: this.element.offset().left - parentOffset.left, + right: 'auto' + }); + if (this.container.offset().left + this.container.outerWidth() > $(window).width()) { + this.container.css({ + left: 'auto', + right: 0 + }); + } + } + }, + + toggle: function (e) { + if (this.element.hasClass('active')) { + this.hide(); + } else { + this.show(); + } + }, + + show: function (e) { + this.element.addClass('active'); + this.container.show(); + this.move(); + + // Create a click proxy that is private to this instance of datepicker, for unbinding + this._outsideClickProxy = $.proxy(function (e) { + this.outsideClick(e); + }, this); + // Bind global datepicker mousedown for hiding and + $(document) + .on('mousedown.daterangepicker', this._outsideClickProxy) + // also explicitly play nice with Bootstrap dropdowns, which stopPropagation when clicking them + .on('click.daterangepicker', '[data-toggle=dropdown]', this._outsideClickProxy) + // and also close when focus changes to outside the picker (eg. tabbing between controls) + .on('focusin.daterangepicker', this._outsideClickProxy); + + this.element.trigger('show.daterangepicker', this); + }, + + outsideClick: function (e) { + var target = $(e.target); + // if the page is clicked anywhere except within the daterangerpicker/button + // itself then call this.hide() + if ( + target.closest(this.element).length || + target.closest(this.container).length || + target.closest('.calendar-date').length + ) return; + this.hide(); + }, + + hide: function (e) { + $(document) + .off('mousedown.daterangepicker', this._outsideClickProxy) + .off('click.daterangepicker', this._outsideClickProxy) + .off('focusin.daterangepicker', this._outsideClickProxy); + + this.element.removeClass('active'); + this.container.hide(); + + if (!this.startDate.isSame(this.oldStartDate) || !this.endDate.isSame(this.oldEndDate)) + this.notify(); + + this.oldStartDate = this.startDate.clone(); + this.oldEndDate = this.endDate.clone(); + + this.element.trigger('hide.daterangepicker', this); + }, + + enterRange: function (e) { + // mouse pointer has entered a range label + var label = e.target.innerHTML; + if (label == this.locale.customRangeLabel) { + this.updateView(); + } else { + var dates = this.ranges[label]; + this.container.find('input[name=daterangepicker_start]').val(dates[0].format(this.format)); + this.container.find('input[name=daterangepicker_end]').val(dates[1].format(this.format)); + } + }, + + showCalendars: function () { + this.container.addClass('show-calendar'); + this.move(); + }, + + hideCalendars: function () { + this.container.removeClass('show-calendar'); + }, + + updateInputText: function () { + if (this.element.is('input') && !this.singleDatePicker) { + this.element.val(this.startDate.format(this.format) + this.separator + this.endDate.format(this.format)); + } else if (this.element.is('input')) { + this.element.val(this.startDate.format(this.format)); + } + }, + + clickRange: function (e) { + var label = e.target.innerHTML; + this.chosenLabel = label; + if (label == this.locale.customRangeLabel) { + this.showCalendars(); + } else { + var dates = this.ranges[label]; + + this.startDate = dates[0]; + this.endDate = dates[1]; + + if (!this.timePicker) { + this.startDate.startOf('day'); + this.endDate.endOf('day'); + } + + this.leftCalendar.month.month(this.startDate.month()).year(this.startDate.year()).hour(this.startDate.hour()).minute(this.startDate.minute()); + this.rightCalendar.month.month(this.endDate.month()).year(this.endDate.year()).hour(this.endDate.hour()).minute(this.endDate.minute()); + this.updateCalendars(); + + this.updateInputText(); + + this.hideCalendars(); + this.hide(); + this.element.trigger('apply.daterangepicker', this); + } + }, + + clickPrev: function (e) { + var cal = $(e.target).parents('.calendar'); + if (cal.hasClass('left')) { + this.leftCalendar.month.subtract('month', 1); + } else { + this.rightCalendar.month.subtract('month', 1); + } + this.updateCalendars(); + }, + + clickNext: function (e) { + var cal = $(e.target).parents('.calendar'); + if (cal.hasClass('left')) { + this.leftCalendar.month.add('month', 1); + } else { + this.rightCalendar.month.add('month', 1); + } + this.updateCalendars(); + }, + + enterDate: function (e) { + + var title = $(e.target).attr('data-title'); + var row = title.substr(1, 1); + var col = title.substr(3, 1); + var cal = $(e.target).parents('.calendar'); + + if (cal.hasClass('left')) { + this.container.find('input[name=daterangepicker_start]').val(this.leftCalendar.calendar[row][col].format(this.format)); + } else { + this.container.find('input[name=daterangepicker_end]').val(this.rightCalendar.calendar[row][col].format(this.format)); + } + + }, + + clickDate: function (e) { + var title = $(e.target).attr('data-title'); + var row = title.substr(1, 1); + var col = title.substr(3, 1); + var cal = $(e.target).parents('.calendar'); + + var startDate, endDate; + if (cal.hasClass('left')) { + startDate = this.leftCalendar.calendar[row][col]; + endDate = this.endDate; + if (typeof this.dateLimit === 'object') { + var maxDate = moment(startDate).add(this.dateLimit).startOf('day'); + if (endDate.isAfter(maxDate)) { + endDate = maxDate; + } + } + } else { + startDate = this.startDate; + endDate = this.rightCalendar.calendar[row][col]; + if (typeof this.dateLimit === 'object') { + var minDate = moment(endDate).subtract(this.dateLimit).startOf('day'); + if (startDate.isBefore(minDate)) { + startDate = minDate; + } + } + } + + if (this.singleDatePicker && cal.hasClass('left')) { + endDate = startDate.clone(); + } else if (this.singleDatePicker && cal.hasClass('right')) { + startDate = endDate.clone(); + } + + cal.find('td').removeClass('active'); + + if (startDate.isSame(endDate) || startDate.isBefore(endDate)) { + $(e.target).addClass('active'); + this.startDate = startDate; + this.endDate = endDate; + this.chosenLabel = this.locale.customRangeLabel; + } else if (startDate.isAfter(endDate)) { + $(e.target).addClass('active'); + var difference = this.endDate.diff(this.startDate); + this.startDate = startDate; + this.endDate = moment(startDate).add('ms', difference); + this.chosenLabel = this.locale.customRangeLabel; + } + + this.leftCalendar.month.month(this.startDate.month()).year(this.startDate.year()); + this.rightCalendar.month.month(this.endDate.month()).year(this.endDate.year()); + this.updateCalendars(); + + if (!this.timePicker) + endDate.endOf('day'); + + if (this.singleDatePicker) + this.clickApply(); + }, + + clickApply: function (e) { + this.updateInputText(); + this.hide(); + this.element.trigger('apply.daterangepicker', this); + }, + + clickCancel: function (e) { + this.startDate = this.oldStartDate; + this.endDate = this.oldEndDate; + this.chosenLabel = this.oldChosenLabel; + this.updateView(); + this.updateCalendars(); + this.hide(); + this.element.trigger('cancel.daterangepicker', this); + }, + + updateMonthYear: function (e) { + var isLeft = $(e.target).closest('.calendar').hasClass('left'), + leftOrRight = isLeft ? 'left' : 'right', + cal = this.container.find('.calendar.' + leftOrRight); + + // Month must be Number for new moment versions + var month = parseInt(cal.find('.monthselect').val(), 10); + var year = cal.find('.yearselect').val(); + + this[leftOrRight + 'Calendar'].month.month(month).year(year); + this.updateCalendars(); + }, + + updateTime: function (e) { + + var cal = $(e.target).closest('.calendar'), + isLeft = cal.hasClass('left'); + + var hour = parseInt(cal.find('.hourselect').val(), 10); + var minute = parseInt(cal.find('.minuteselect').val(), 10); + + if (this.timePicker12Hour) { + var ampm = cal.find('.ampmselect').val(); + if (ampm === 'PM' && hour < 12) + hour += 12; + if (ampm === 'AM' && hour === 12) + hour = 0; + } + + if (isLeft) { + var start = this.startDate.clone(); + start.hour(hour); + start.minute(minute); + this.startDate = start; + this.leftCalendar.month.hour(hour).minute(minute); + } else { + var end = this.endDate.clone(); + end.hour(hour); + end.minute(minute); + this.endDate = end; + this.rightCalendar.month.hour(hour).minute(minute); + } + + this.updateCalendars(); + }, + + updateCalendars: function () { + this.leftCalendar.calendar = this.buildCalendar(this.leftCalendar.month.month(), this.leftCalendar.month.year(), this.leftCalendar.month.hour(), this.leftCalendar.month.minute(), 'left'); + this.rightCalendar.calendar = this.buildCalendar(this.rightCalendar.month.month(), this.rightCalendar.month.year(), this.rightCalendar.month.hour(), this.rightCalendar.month.minute(), 'right'); + this.container.find('.calendar.left').empty().html(this.renderCalendar(this.leftCalendar.calendar, this.startDate, this.minDate, this.maxDate)); + this.container.find('.calendar.right').empty().html(this.renderCalendar(this.rightCalendar.calendar, this.endDate, this.startDate, this.maxDate)); + + this.container.find('.ranges li').removeClass('active'); + var customRange = true; + var i = 0; + for (var range in this.ranges) { + if (this.timePicker) { + if (this.startDate.isSame(this.ranges[range][0]) && this.endDate.isSame(this.ranges[range][1])) { + customRange = false; + this.chosenLabel = this.container.find('.ranges li:eq(' + i + ')') + .addClass('active').html(); + } + } else { + //ignore times when comparing dates if time picker is not enabled + if (this.startDate.format('YYYY-MM-DD') == this.ranges[range][0].format('YYYY-MM-DD') && this.endDate.format('YYYY-MM-DD') == this.ranges[range][1].format('YYYY-MM-DD')) { + customRange = false; + this.chosenLabel = this.container.find('.ranges li:eq(' + i + ')') + .addClass('active').html(); + } + } + i++; + } + if (customRange) { + this.chosenLabel = this.container.find('.ranges li:last') + .addClass('active').html(); + } + }, + + buildCalendar: function (month, year, hour, minute, side) { + var firstDay = moment([year, month, 1]); + var lastMonth = moment(firstDay).subtract('month', 1).month(); + var lastYear = moment(firstDay).subtract('month', 1).year(); + + var daysInLastMonth = moment([lastYear, lastMonth]).daysInMonth(); + + var dayOfWeek = firstDay.day(); + + var i; + + //initialize a 6 rows x 7 columns array for the calendar + var calendar = []; + for (i = 0; i < 6; i++) { + calendar[i] = []; + } + + //populate the calendar with date objects + var startDay = daysInLastMonth - dayOfWeek + this.locale.firstDay + 1; + if (startDay > daysInLastMonth) + startDay -= 7; + + if (dayOfWeek == this.locale.firstDay) + startDay = daysInLastMonth - 6; + + var curDate = moment([lastYear, lastMonth, startDay, 12, minute]); + var col, row; + for (i = 0, col = 0, row = 0; i < 42; i++, col++, curDate = moment(curDate).add('hour', 24)) { + if (i > 0 && col % 7 === 0) { + col = 0; + row++; + } + calendar[row][col] = curDate.clone().hour(hour); + curDate.hour(12); + } + + return calendar; + }, + + renderDropdowns: function (selected, minDate, maxDate) { + var currentMonth = selected.month(); + var monthHtml = '"; + + var currentYear = selected.year(); + var maxYear = (maxDate && maxDate.year()) || (currentYear + 5); + var minYear = (minDate && minDate.year()) || (currentYear - 50); + var yearHtml = ''; + + return monthHtml + yearHtml; + }, + + renderCalendar: function (calendar, selected, minDate, maxDate) { + + var html = '
    '; + html += ''; + html += ''; + html += ''; + + // add empty cell for week number + if (this.showWeekNumbers) + html += ''; + + if (!minDate || minDate.isBefore(calendar[1][1])) { + html += ''; + } else { + html += ''; + } + + var dateHtml = this.locale.monthNames[calendar[1][1].month()] + calendar[1][1].format(" YYYY"); + + if (this.showDropdowns) { + dateHtml = this.renderDropdowns(calendar[1][1], minDate, maxDate); + } + + html += ''; + if (!maxDate || maxDate.isAfter(calendar[1][1])) { + html += ''; + } else { + html += ''; + } + + html += ''; + html += ''; + + // add week number label + if (this.showWeekNumbers) + html += ''; + + $.each(this.locale.daysOfWeek, function (index, dayOfWeek) { + html += ''; + }); + + html += ''; + html += ''; + html += ''; + + for (var row = 0; row < 6; row++) { + html += ''; + + // add week number + if (this.showWeekNumbers) + html += ''; + + for (var col = 0; col < 7; col++) { + var cname = 'available '; + cname += (calendar[row][col].month() == calendar[1][1].month()) ? '' : 'off'; + + if ((minDate && calendar[row][col].isBefore(minDate, 'day')) || (maxDate && calendar[row][col].isAfter(maxDate, 'day'))) { + cname = ' off disabled '; + } else if (calendar[row][col].format('YYYY-MM-DD') == selected.format('YYYY-MM-DD')) { + cname += ' active '; + if (calendar[row][col].format('YYYY-MM-DD') == this.startDate.format('YYYY-MM-DD')) { + cname += ' start-date '; + } + if (calendar[row][col].format('YYYY-MM-DD') == this.endDate.format('YYYY-MM-DD')) { + cname += ' end-date '; + } + } else if (calendar[row][col] >= this.startDate && calendar[row][col] <= this.endDate) { + cname += ' in-range '; + if (calendar[row][col].isSame(this.startDate)) { + cname += ' start-date '; + } + if (calendar[row][col].isSame(this.endDate)) { + cname += ' end-date '; + } + } + + var title = 'r' + row + 'c' + col; + html += ''; + } + html += ''; + } + + html += ''; + html += '
    ' + dateHtml + '
    ' + this.locale.weekLabel + '' + dayOfWeek + '
    ' + calendar[row][0].week() + '' + calendar[row][col].date() + '
    '; + html += '
    '; + + var i; + if (this.timePicker) { + + html += '
    '; + html += ' : '; + + html += ' '; + + if (this.timePicker12Hour) { + html += ''; + } + + html += '
    '; + + } + + return html; + + }, + + remove: function () { + + this.container.remove(); + this.element.off('.daterangepicker'); + this.element.removeData('daterangepicker'); + + } + + }; + + $.fn.daterangepicker = function (options, cb) { + this.each(function () { + var el = $(this); + if (el.data('daterangepicker')) + el.data('daterangepicker').remove(); + el.data('daterangepicker', new DateRangePicker(el, options, cb)); + }); + return this; + }; + +}(window.jQuery, window.moment); diff --git a/len-activiti/src/main/resources/static/editor-app/libs/bootstrap_3.1.1/css/bootstrap-theme.css b/len-activiti/src/main/resources/static/editor-app/libs/bootstrap_3.1.1/css/bootstrap-theme.css index a406992..fd7fb66 100644 --- a/len-activiti/src/main/resources/static/editor-app/libs/bootstrap_3.1.1/css/bootstrap-theme.css +++ b/len-activiti/src/main/resources/static/editor-app/libs/bootstrap_3.1.1/css/bootstrap-theme.css @@ -10,10 +10,11 @@ .btn-info, .btn-warning, .btn-danger { - text-shadow: 0 -1px 0 rgba(0, 0, 0, .2); - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); + text-shadow: 0 -1px 0 rgba(0, 0, 0, .2); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); } + .btn-default:active, .btn-primary:active, .btn-success:active, @@ -26,322 +27,373 @@ .btn-info.active, .btn-warning.active, .btn-danger.active { - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); } + .btn:active, .btn.active { - background-image: none; + background-image: none; } + .btn-default { - text-shadow: 0 1px 0 #fff; - background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%); - background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #dbdbdb; - border-color: #ccc; + text-shadow: 0 1px 0 #fff; + background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%); + background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + background-repeat: repeat-x; + border-color: #dbdbdb; + border-color: #ccc; } + .btn-default:hover, .btn-default:focus { - background-color: #e0e0e0; - background-position: 0 -15px; + background-color: #e0e0e0; + background-position: 0 -15px; } + .btn-default:active, .btn-default.active { - background-color: #e0e0e0; - border-color: #dbdbdb; + background-color: #e0e0e0; + border-color: #dbdbdb; } + .btn-primary { - background-image: -webkit-linear-gradient(top, #428bca 0%, #2d6ca2 100%); - background-image: linear-gradient(to bottom, #428bca 0%, #2d6ca2 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #2b669a; + background-image: -webkit-linear-gradient(top, #428bca 0%, #2d6ca2 100%); + background-image: linear-gradient(to bottom, #428bca 0%, #2d6ca2 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + background-repeat: repeat-x; + border-color: #2b669a; } + .btn-primary:hover, .btn-primary:focus { - background-color: #2d6ca2; - background-position: 0 -15px; + background-color: #2d6ca2; + background-position: 0 -15px; } + .btn-primary:active, .btn-primary.active { - background-color: #2d6ca2; - border-color: #2b669a; + background-color: #2d6ca2; + border-color: #2b669a; } + .btn-success { - background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%); - background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #3e8f3e; + background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%); + background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + background-repeat: repeat-x; + border-color: #3e8f3e; } + .btn-success:hover, .btn-success:focus { - background-color: #419641; - background-position: 0 -15px; + background-color: #419641; + background-position: 0 -15px; } + .btn-success:active, .btn-success.active { - background-color: #419641; - border-color: #3e8f3e; + background-color: #419641; + border-color: #3e8f3e; } + .btn-info { - background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); - background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #28a4c9; + background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); + background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + background-repeat: repeat-x; + border-color: #28a4c9; } + .btn-info:hover, .btn-info:focus { - background-color: #2aabd2; - background-position: 0 -15px; + background-color: #2aabd2; + background-position: 0 -15px; } + .btn-info:active, .btn-info.active { - background-color: #2aabd2; - border-color: #28a4c9; + background-color: #2aabd2; + border-color: #28a4c9; } + .btn-warning { - background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); - background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #e38d13; + background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); + background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + background-repeat: repeat-x; + border-color: #e38d13; } + .btn-warning:hover, .btn-warning:focus { - background-color: #eb9316; - background-position: 0 -15px; + background-color: #eb9316; + background-position: 0 -15px; } + .btn-warning:active, .btn-warning.active { - background-color: #eb9316; - border-color: #e38d13; + background-color: #eb9316; + border-color: #e38d13; } + .btn-danger { - background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%); - background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #b92c28; + background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%); + background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + background-repeat: repeat-x; + border-color: #b92c28; } + .btn-danger:hover, .btn-danger:focus { - background-color: #c12e2a; - background-position: 0 -15px; + background-color: #c12e2a; + background-position: 0 -15px; } + .btn-danger:active, .btn-danger.active { - background-color: #c12e2a; - border-color: #b92c28; + background-color: #c12e2a; + border-color: #b92c28; } + .thumbnail, .img-thumbnail { - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); - box-shadow: 0 1px 2px rgba(0, 0, 0, .075); + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); + box-shadow: 0 1px 2px rgba(0, 0, 0, .075); } + .dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus { - background-color: #e8e8e8; - background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); - background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); - background-repeat: repeat-x; + background-color: #e8e8e8; + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); + background-repeat: repeat-x; } + .dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus { - background-color: #357ebd; - background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%); - background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0); - background-repeat: repeat-x; + background-color: #357ebd; + background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%); + background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0); + background-repeat: repeat-x; } + .navbar-default { - background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%); - background-image: linear-gradient(to bottom, #fff 0%, #f8f8f8 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); + background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%); + background-image: linear-gradient(to bottom, #fff 0%, #f8f8f8 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + background-repeat: repeat-x; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); } + .navbar-default .navbar-nav > .active > a { - background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%); - background-image: linear-gradient(to bottom, #ebebeb 0%, #f3f3f3 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', GradientType=0); - background-repeat: repeat-x; - -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); - box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); + background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%); + background-image: linear-gradient(to bottom, #ebebeb 0%, #f3f3f3 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', GradientType=0); + background-repeat: repeat-x; + -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); + box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); } + .navbar-brand, .navbar-nav > li > a { - text-shadow: 0 1px 0 rgba(255, 255, 255, .25); + text-shadow: 0 1px 0 rgba(255, 255, 255, .25); } + .navbar-inverse { - background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%); - background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; + background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%); + background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + background-repeat: repeat-x; } + .navbar-inverse .navbar-nav > .active > a { - background-image: -webkit-linear-gradient(top, #222 0%, #282828 100%); - background-image: linear-gradient(to bottom, #222 0%, #282828 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff282828', GradientType=0); - background-repeat: repeat-x; - -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); - box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); + background-image: -webkit-linear-gradient(top, #222 0%, #282828 100%); + background-image: linear-gradient(to bottom, #222 0%, #282828 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff282828', GradientType=0); + background-repeat: repeat-x; + -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); + box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); } + .navbar-inverse .navbar-brand, .navbar-inverse .navbar-nav > li > a { - text-shadow: 0 -1px 0 rgba(0, 0, 0, .25); + text-shadow: 0 -1px 0 rgba(0, 0, 0, .25); } + .navbar-static-top, .navbar-fixed-top, .navbar-fixed-bottom { - border-radius: 0; + border-radius: 0; } + .alert { - text-shadow: 0 1px 0 rgba(255, 255, 255, .2); - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); + text-shadow: 0 1px 0 rgba(255, 255, 255, .2); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); } + .alert-success { - background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); - background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); - background-repeat: repeat-x; - border-color: #b2dba1; + background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); + background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); + background-repeat: repeat-x; + border-color: #b2dba1; } + .alert-info { - background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%); - background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); - background-repeat: repeat-x; - border-color: #9acfea; + background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%); + background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); + background-repeat: repeat-x; + border-color: #9acfea; } + .alert-warning { - background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); - background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); - background-repeat: repeat-x; - border-color: #f5e79e; + background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); + background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); + background-repeat: repeat-x; + border-color: #f5e79e; } + .alert-danger { - background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); - background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); - background-repeat: repeat-x; - border-color: #dca7a7; + background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); + background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); + background-repeat: repeat-x; + border-color: #dca7a7; } + .progress { - background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); - background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); - background-repeat: repeat-x; + background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); + background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); + background-repeat: repeat-x; } + .progress-bar { - background-image: -webkit-linear-gradient(top, #428bca 0%, #3071a9 100%); - background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0); - background-repeat: repeat-x; + background-image: -webkit-linear-gradient(top, #428bca 0%, #3071a9 100%); + background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0); + background-repeat: repeat-x; } + .progress-bar-success { - background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%); - background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); - background-repeat: repeat-x; + background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%); + background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); + background-repeat: repeat-x; } + .progress-bar-info { - background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); - background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); - background-repeat: repeat-x; + background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); + background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); + background-repeat: repeat-x; } + .progress-bar-warning { - background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); - background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); - background-repeat: repeat-x; + background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); + background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); + background-repeat: repeat-x; } + .progress-bar-danger { - background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%); - background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); - background-repeat: repeat-x; + background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%); + background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); + background-repeat: repeat-x; } + .list-group { - border-radius: 4px; - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); - box-shadow: 0 1px 2px rgba(0, 0, 0, .075); + border-radius: 4px; + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); + box-shadow: 0 1px 2px rgba(0, 0, 0, .075); } + .list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus { - text-shadow: 0 -1px 0 #3071a9; - background-image: -webkit-linear-gradient(top, #428bca 0%, #3278b3 100%); - background-image: linear-gradient(to bottom, #428bca 0%, #3278b3 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0); - background-repeat: repeat-x; - border-color: #3278b3; + text-shadow: 0 -1px 0 #3071a9; + background-image: -webkit-linear-gradient(top, #428bca 0%, #3278b3 100%); + background-image: linear-gradient(to bottom, #428bca 0%, #3278b3 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0); + background-repeat: repeat-x; + border-color: #3278b3; } + .panel { - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05); - box-shadow: 0 1px 2px rgba(0, 0, 0, .05); + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05); + box-shadow: 0 1px 2px rgba(0, 0, 0, .05); } + .panel-default > .panel-heading { - background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); - background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); - background-repeat: repeat-x; + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); + background-repeat: repeat-x; } + .panel-primary > .panel-heading { - background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%); - background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0); - background-repeat: repeat-x; + background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%); + background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0); + background-repeat: repeat-x; } + .panel-success > .panel-heading { - background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); - background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); - background-repeat: repeat-x; + background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); + background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); + background-repeat: repeat-x; } + .panel-info > .panel-heading { - background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); - background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); - background-repeat: repeat-x; + background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); + background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); + background-repeat: repeat-x; } + .panel-warning > .panel-heading { - background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); - background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); - background-repeat: repeat-x; + background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); + background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); + background-repeat: repeat-x; } + .panel-danger > .panel-heading { - background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%); - background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); - background-repeat: repeat-x; + background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%); + background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); + background-repeat: repeat-x; } + .well { - background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); - background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); - background-repeat: repeat-x; - border-color: #dcdcdc; - -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); - box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); + background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); + background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); + background-repeat: repeat-x; + border-color: #dcdcdc; + -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); } + /*# sourceMappingURL=bootstrap-theme.css.map */ diff --git a/len-activiti/src/main/resources/static/editor-app/libs/bootstrap_3.1.1/css/bootstrap.css b/len-activiti/src/main/resources/static/editor-app/libs/bootstrap_3.1.1/css/bootstrap.css index 4e3da79..f45ce91 100644 --- a/len-activiti/src/main/resources/static/editor-app/libs/bootstrap_3.1.1/css/bootstrap.css +++ b/len-activiti/src/main/resources/static/editor-app/libs/bootstrap_3.1.1/css/bootstrap.css @@ -6,13 +6,15 @@ /*! normalize.css v3.0.0 | MIT License | git.io/normalize */ html { - font-family: sans-serif; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; + font-family: sans-serif; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; } + body { - margin: 0; + margin: 0; } + article, aside, details, @@ -25,331 +27,403 @@ main, nav, section, summary { - display: block; + display: block; } + audio, canvas, progress, video { - display: inline-block; - vertical-align: baseline; + display: inline-block; + vertical-align: baseline; } + audio:not([controls]) { - display: none; - height: 0; + display: none; + height: 0; } + [hidden], template { - display: none; + display: none; } + a { - background: transparent; + background: transparent; } + a:active, a:hover { - outline: 0; + outline: 0; } + abbr[title] { - border-bottom: 1px dotted; + border-bottom: 1px dotted; } + b, strong { - font-weight: bold; + font-weight: bold; } + dfn { - font-style: italic; + font-style: italic; } + h1 { - margin: .67em 0; - font-size: 2em; + margin: .67em 0; + font-size: 2em; } + mark { - color: #000; - background: #ff0; + color: #000; + background: #ff0; } + small { - font-size: 80%; + font-size: 80%; } + sub, sup { - position: relative; - font-size: 75%; - line-height: 0; - vertical-align: baseline; + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; } + sup { - top: -.5em; + top: -.5em; } + sub { - bottom: -.25em; + bottom: -.25em; } + img { - border: 0; + border: 0; } + svg:not(:root) { - overflow: hidden; + overflow: hidden; } + figure { - margin: 1em 40px; + margin: 1em 40px; } + hr { - height: 0; - -moz-box-sizing: content-box; - box-sizing: content-box; + height: 0; + -moz-box-sizing: content-box; + box-sizing: content-box; } + pre { - overflow: auto; + overflow: auto; } + code, kbd, pre, samp { - font-family: monospace, monospace; - font-size: 1em; + font-family: monospace, monospace; + font-size: 1em; } + button, input, optgroup, select, textarea { - margin: 0; - font: inherit; - color: inherit; + margin: 0; + font: inherit; + color: inherit; } + button { - overflow: visible; + overflow: visible; } + button, select { - text-transform: none; + text-transform: none; } + button, html input[type="button"], input[type="reset"], input[type="submit"] { - -webkit-appearance: button; - cursor: pointer; + -webkit-appearance: button; + cursor: pointer; } + button[disabled], html input[disabled] { - cursor: default; + cursor: default; } + button::-moz-focus-inner, input::-moz-focus-inner { - padding: 0; - border: 0; + padding: 0; + border: 0; } + input { - line-height: normal; + line-height: normal; } + input[type="checkbox"], input[type="radio"] { - box-sizing: border-box; - padding: 0; + box-sizing: border-box; + padding: 0; } + input[type="number"]::-webkit-inner-spin-button, input[type="number"]::-webkit-outer-spin-button { - height: auto; + height: auto; } + input[type="search"] { - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; - -webkit-appearance: textfield; + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; } + input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; + -webkit-appearance: none; } + fieldset { - padding: .35em .625em .75em; - margin: 0 2px; - border: 1px solid #c0c0c0; + padding: .35em .625em .75em; + margin: 0 2px; + border: 1px solid #c0c0c0; } + legend { - padding: 0; - border: 0; + padding: 0; + border: 0; } + textarea { - overflow: auto; + overflow: auto; } + optgroup { - font-weight: bold; + font-weight: bold; } + table { - border-spacing: 0; - border-collapse: collapse; + border-spacing: 0; + border-collapse: collapse; } + td, th { - padding: 0; + padding: 0; } + @media print { - * { - color: #000 !important; - text-shadow: none !important; - background: transparent !important; - box-shadow: none !important; - } - a, - a:visited { - text-decoration: underline; - } - a[href]:after { - content: " (" attr(href) ")"; - } - abbr[title]:after { - content: " (" attr(title) ")"; - } - a[href^="javascript:"]:after, - a[href^="#"]:after { - content: ""; - } - pre, - blockquote { - border: 1px solid #999; - - page-break-inside: avoid; - } - thead { - display: table-header-group; - } - tr, - img { - page-break-inside: avoid; - } - img { - max-width: 100% !important; - } - p, - h2, - h3 { - orphans: 3; - widows: 3; - } - h2, - h3 { - page-break-after: avoid; - } - select { - background: #fff !important; - } - .navbar { - display: none; - } - .table td, - .table th { - background-color: #fff !important; - } - .btn > .caret, - .dropup > .btn > .caret { - border-top-color: #000 !important; - } - .label { - border: 1px solid #000; - } - .table { - border-collapse: collapse !important; - } - .table-bordered th, - .table-bordered td { - border: 1px solid #ddd !important; - } + * { + color: #000 !important; + text-shadow: none !important; + background: transparent !important; + box-shadow: none !important; + } + + a, + a:visited { + text-decoration: underline; + } + + a[href]:after { + content: " (" attr(href) ")"; + } + + abbr[title]:after { + content: " (" attr(title) ")"; + } + + a[href^="javascript:"]:after, + a[href^="#"]:after { + content: ""; + } + + pre, + blockquote { + border: 1px solid #999; + + page-break-inside: avoid; + } + + thead { + display: table-header-group; + } + + tr, + img { + page-break-inside: avoid; + } + + img { + max-width: 100% !important; + } + + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + + h2, + h3 { + page-break-after: avoid; + } + + select { + background: #fff !important; + } + + .navbar { + display: none; + } + + .table td, + .table th { + background-color: #fff !important; + } + + .btn > .caret, + .dropup > .btn > .caret { + border-top-color: #000 !important; + } + + .label { + border: 1px solid #000; + } + + .table { + border-collapse: collapse !important; + } + + .table-bordered th, + .table-bordered td { + border: 1px solid #ddd !important; + } } + * { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; } + *:before, *:after { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; } + html { - font-size: 62.5%; + font-size: 62.5%; - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } + body { - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 14px; - line-height: 1.42857143; - color: #333; - background-color: #fff; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 1.42857143; + color: #333; + background-color: #fff; } + input, button, select, textarea { - font-family: inherit; - font-size: inherit; - line-height: inherit; + font-family: inherit; + font-size: inherit; + line-height: inherit; } + a { - color: #428bca; - text-decoration: none; + color: #428bca; + text-decoration: none; } + a:hover, a:focus { - color: #2a6496; - text-decoration: underline; + color: #2a6496; + text-decoration: underline; } + a:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; } + figure { - margin: 0; + margin: 0; } + img { - vertical-align: middle; + vertical-align: middle; } + .img-responsive, .thumbnail > img, .thumbnail a > img, .carousel-inner > .item > img, .carousel-inner > .item > a > img { - display: block; - max-width: 100%; - height: auto; + display: block; + max-width: 100%; + height: auto; } + .img-rounded { - border-radius: 6px; + border-radius: 6px; } + .img-thumbnail { - display: inline-block; - max-width: 100%; - height: auto; - padding: 4px; - line-height: 1.42857143; - background-color: #fff; - border: 1px solid #ddd; - border-radius: 4px; - -webkit-transition: all .2s ease-in-out; - transition: all .2s ease-in-out; + display: inline-block; + max-width: 100%; + height: auto; + padding: 4px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: all .2s ease-in-out; + transition: all .2s ease-in-out; } + .img-circle { - border-radius: 50%; + border-radius: 50%; } + hr { - margin-top: 20px; - margin-bottom: 20px; - border: 0; - border-top: 1px solid #eee; + margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eee; } + .sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - border: 0; + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; } + h1, h2, h3, @@ -362,11 +436,12 @@ h6, .h4, .h5, .h6 { - font-family: inherit; - font-weight: 500; - line-height: 1.1; - color: inherit; + font-family: inherit; + font-weight: 500; + line-height: 1.1; + color: inherit; } + h1 small, h2 small, h3 small, @@ -391,19 +466,21 @@ h6 .small, .h4 .small, .h5 .small, .h6 .small { - font-weight: normal; - line-height: 1; - color: #999; + font-weight: normal; + line-height: 1; + color: #999; } + h1, .h1, h2, .h2, h3, .h3 { - margin-top: 20px; - margin-bottom: 10px; + margin-top: 20px; + margin-bottom: 10px; } + h1 small, .h1 small, h2 small, @@ -416,17 +493,19 @@ h2 .small, .h2 .small, h3 .small, .h3 .small { - font-size: 65%; + font-size: 65%; } + h4, .h4, h5, .h5, h6, .h6 { - margin-top: 10px; - margin-bottom: 10px; + margin-top: 10px; + margin-bottom: 10px; } + h4 small, .h4 small, h5 small, @@ -439,1049 +518,1346 @@ h5 .small, .h5 .small, h6 .small, .h6 .small { - font-size: 75%; + font-size: 75%; } + h1, .h1 { - font-size: 36px; + font-size: 36px; } + h2, .h2 { - font-size: 30px; + font-size: 30px; } + h3, .h3 { - font-size: 24px; + font-size: 24px; } + h4, .h4 { - font-size: 18px; + font-size: 18px; } + h5, .h5 { - font-size: 14px; + font-size: 14px; } + h6, .h6 { - font-size: 12px; + font-size: 12px; } + p { - margin: 0 0 10px; + margin: 0 0 10px; } + .lead { - margin-bottom: 20px; - font-size: 16px; - font-weight: 200; - line-height: 1.4; + margin-bottom: 20px; + font-size: 16px; + font-weight: 200; + line-height: 1.4; } + @media (min-width: 768px) { - .lead { - font-size: 21px; - } + .lead { + font-size: 21px; + } } + small, .small { - font-size: 85%; + font-size: 85%; } + cite { - font-style: normal; + font-style: normal; } + .text-left { - text-align: left; + text-align: left; } + .text-right { - text-align: right; + text-align: right; } + .text-center { - text-align: center; + text-align: center; } + .text-justify { - text-align: justify; + text-align: justify; } + .text-muted { - color: #999; + color: #999; } + .text-primary { - color: #428bca; + color: #428bca; } + a.text-primary:hover { - color: #3071a9; + color: #3071a9; } + .text-success { - color: #3c763d; + color: #3c763d; } + a.text-success:hover { - color: #2b542c; + color: #2b542c; } + .text-info { - color: #31708f; + color: #31708f; } + a.text-info:hover { - color: #245269; + color: #245269; } + .text-warning { - color: #8a6d3b; + color: #8a6d3b; } + a.text-warning:hover { - color: #66512c; + color: #66512c; } + .text-danger { - color: #a94442; + color: #a94442; } + a.text-danger:hover { - color: #843534; + color: #843534; } + .bg-primary { - color: #fff; - background-color: #428bca; + color: #fff; + background-color: #428bca; } + a.bg-primary:hover { - background-color: #3071a9; + background-color: #3071a9; } + .bg-success { - background-color: #dff0d8; + background-color: #dff0d8; } + a.bg-success:hover { - background-color: #c1e2b3; + background-color: #c1e2b3; } + .bg-info { - background-color: #d9edf7; + background-color: #d9edf7; } + a.bg-info:hover { - background-color: #afd9ee; + background-color: #afd9ee; } + .bg-warning { - background-color: #fcf8e3; + background-color: #fcf8e3; } + a.bg-warning:hover { - background-color: #f7ecb5; + background-color: #f7ecb5; } + .bg-danger { - background-color: #f2dede; + background-color: #f2dede; } + a.bg-danger:hover { - background-color: #e4b9b9; + background-color: #e4b9b9; } + .page-header { - padding-bottom: 9px; - margin: 40px 0 20px; - border-bottom: 1px solid #eee; + padding-bottom: 9px; + margin: 40px 0 20px; + border-bottom: 1px solid #eee; } + ul, ol { - margin-top: 0; - margin-bottom: 10px; + margin-top: 0; + margin-bottom: 10px; } + ul ul, ol ul, ul ol, ol ol { - margin-bottom: 0; + margin-bottom: 0; } + .list-unstyled { - padding-left: 0; - list-style: none; + padding-left: 0; + list-style: none; } + .list-inline { - padding-left: 0; - margin-left: -5px; - list-style: none; + padding-left: 0; + margin-left: -5px; + list-style: none; } + .list-inline > li { - display: inline-block; - padding-right: 5px; - padding-left: 5px; + display: inline-block; + padding-right: 5px; + padding-left: 5px; } + dl { - margin-top: 0; - margin-bottom: 20px; + margin-top: 0; + margin-bottom: 20px; } + dt, dd { - line-height: 1.42857143; + line-height: 1.42857143; } + dt { - font-weight: bold; + font-weight: bold; } + dd { - margin-left: 0; + margin-left: 0; } + @media (min-width: 768px) { - .dl-horizontal dt { - float: left; - width: 160px; - overflow: hidden; - clear: left; - text-align: right; - text-overflow: ellipsis; - white-space: nowrap; - } - .dl-horizontal dd { - margin-left: 180px; - } + .dl-horizontal dt { + float: left; + width: 160px; + overflow: hidden; + clear: left; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap; + } + + .dl-horizontal dd { + margin-left: 180px; + } } + abbr[title], abbr[data-original-title] { - cursor: help; - border-bottom: 1px dotted #999; + cursor: help; + border-bottom: 1px dotted #999; } + .initialism { - font-size: 90%; - text-transform: uppercase; + font-size: 90%; + text-transform: uppercase; } + blockquote { - padding: 10px 20px; - margin: 0 0 20px; - font-size: 17.5px; - border-left: 5px solid #eee; + padding: 10px 20px; + margin: 0 0 20px; + font-size: 17.5px; + border-left: 5px solid #eee; } + blockquote p:last-child, blockquote ul:last-child, blockquote ol:last-child { - margin-bottom: 0; + margin-bottom: 0; } + blockquote footer, blockquote small, blockquote .small { - display: block; - font-size: 80%; - line-height: 1.42857143; - color: #999; + display: block; + font-size: 80%; + line-height: 1.42857143; + color: #999; } + blockquote footer:before, blockquote small:before, blockquote .small:before { - content: '\2014 \00A0'; + content: '\2014 \00A0'; } + .blockquote-reverse, blockquote.pull-right { - padding-right: 15px; - padding-left: 0; - text-align: right; - border-right: 5px solid #eee; - border-left: 0; + padding-right: 15px; + padding-left: 0; + text-align: right; + border-right: 5px solid #eee; + border-left: 0; } + .blockquote-reverse footer:before, blockquote.pull-right footer:before, .blockquote-reverse small:before, blockquote.pull-right small:before, .blockquote-reverse .small:before, blockquote.pull-right .small:before { - content: ''; + content: ''; } + .blockquote-reverse footer:after, blockquote.pull-right footer:after, .blockquote-reverse small:after, blockquote.pull-right small:after, .blockquote-reverse .small:after, blockquote.pull-right .small:after { - content: '\00A0 \2014'; + content: '\00A0 \2014'; } + blockquote:before, blockquote:after { - content: ""; + content: ""; } + address { - margin-bottom: 20px; - font-style: normal; - line-height: 1.42857143; + margin-bottom: 20px; + font-style: normal; + line-height: 1.42857143; } + code, kbd, pre, samp { - font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; } + code { - padding: 2px 4px; - font-size: 90%; - color: #c7254e; - white-space: nowrap; - background-color: #f9f2f4; - border-radius: 4px; + padding: 2px 4px; + font-size: 90%; + color: #c7254e; + white-space: nowrap; + background-color: #f9f2f4; + border-radius: 4px; } + kbd { - padding: 2px 4px; - font-size: 90%; - color: #fff; - background-color: #333; - border-radius: 3px; - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); + padding: 2px 4px; + font-size: 90%; + color: #fff; + background-color: #333; + border-radius: 3px; + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); } + pre { - display: block; - padding: 9.5px; - margin: 0 0 10px; - font-size: 13px; - line-height: 1.42857143; - color: #333; - word-break: break-all; - word-wrap: break-word; - background-color: #f5f5f5; - border: 1px solid #ccc; - border-radius: 4px; + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 1.42857143; + color: #333; + word-break: break-all; + word-wrap: break-word; + background-color: #f5f5f5; + border: 1px solid #ccc; + border-radius: 4px; } + pre code { - padding: 0; - font-size: inherit; - color: inherit; - white-space: pre-wrap; - background-color: transparent; - border-radius: 0; + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border-radius: 0; } + .pre-scrollable { - max-height: 340px; - overflow-y: scroll; + max-height: 340px; + overflow-y: scroll; } + .container { - padding-right: 15px; - padding-left: 15px; - margin-right: auto; - margin-left: auto; + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; } + @media (min-width: 768px) { - .container { - width: 750px; - } + .container { + width: 750px; + } } + @media (min-width: 992px) { - .container { - width: 970px; - } + .container { + width: 970px; + } } + @media (min-width: 1200px) { - .container { - width: 1170px; - } + .container { + width: 1170px; + } } + .container-fluid { - padding-right: 15px; - padding-left: 15px; - margin-right: auto; - margin-left: auto; + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; } + .row { - margin-right: -15px; - margin-left: -15px; + margin-right: -15px; + margin-left: -15px; } + .col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; } + .col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { - float: left; + float: left; } + .col-xs-12 { - width: 100%; + width: 100%; } + .col-xs-11 { - width: 91.66666667%; + width: 91.66666667%; } + .col-xs-10 { - width: 83.33333333%; + width: 83.33333333%; } + .col-xs-9 { - width: 75%; + width: 75%; } + .col-xs-8 { - width: 66.66666667%; + width: 66.66666667%; } + .col-xs-7 { - width: 58.33333333%; + width: 58.33333333%; } + .col-xs-6 { - width: 50%; + width: 50%; } + .col-xs-5 { - width: 41.66666667%; + width: 41.66666667%; } + .col-xs-4 { - width: 33.33333333%; + width: 33.33333333%; } + .col-xs-3 { - width: 25%; + width: 25%; } + .col-xs-2 { - width: 16.66666667%; + width: 16.66666667%; } + .col-xs-1 { - width: 8.33333333%; + width: 8.33333333%; } + .col-xs-pull-12 { - right: 100%; + right: 100%; } + .col-xs-pull-11 { - right: 91.66666667%; + right: 91.66666667%; } + .col-xs-pull-10 { - right: 83.33333333%; + right: 83.33333333%; } + .col-xs-pull-9 { - right: 75%; + right: 75%; } + .col-xs-pull-8 { - right: 66.66666667%; + right: 66.66666667%; } + .col-xs-pull-7 { - right: 58.33333333%; + right: 58.33333333%; } + .col-xs-pull-6 { - right: 50%; + right: 50%; } + .col-xs-pull-5 { - right: 41.66666667%; + right: 41.66666667%; } + .col-xs-pull-4 { - right: 33.33333333%; + right: 33.33333333%; } + .col-xs-pull-3 { - right: 25%; + right: 25%; } + .col-xs-pull-2 { - right: 16.66666667%; + right: 16.66666667%; } + .col-xs-pull-1 { - right: 8.33333333%; + right: 8.33333333%; } + .col-xs-pull-0 { - right: 0; + right: 0; } + .col-xs-push-12 { - left: 100%; + left: 100%; } + .col-xs-push-11 { - left: 91.66666667%; + left: 91.66666667%; } + .col-xs-push-10 { - left: 83.33333333%; + left: 83.33333333%; } + .col-xs-push-9 { - left: 75%; + left: 75%; } + .col-xs-push-8 { - left: 66.66666667%; + left: 66.66666667%; } + .col-xs-push-7 { - left: 58.33333333%; + left: 58.33333333%; } + .col-xs-push-6 { - left: 50%; + left: 50%; } + .col-xs-push-5 { - left: 41.66666667%; + left: 41.66666667%; } + .col-xs-push-4 { - left: 33.33333333%; + left: 33.33333333%; } + .col-xs-push-3 { - left: 25%; + left: 25%; } + .col-xs-push-2 { - left: 16.66666667%; + left: 16.66666667%; } + .col-xs-push-1 { - left: 8.33333333%; + left: 8.33333333%; } + .col-xs-push-0 { - left: 0; + left: 0; } + .col-xs-offset-12 { - margin-left: 100%; + margin-left: 100%; } + .col-xs-offset-11 { - margin-left: 91.66666667%; + margin-left: 91.66666667%; } + .col-xs-offset-10 { - margin-left: 83.33333333%; + margin-left: 83.33333333%; } + .col-xs-offset-9 { - margin-left: 75%; + margin-left: 75%; } + .col-xs-offset-8 { - margin-left: 66.66666667%; + margin-left: 66.66666667%; } + .col-xs-offset-7 { - margin-left: 58.33333333%; + margin-left: 58.33333333%; } + .col-xs-offset-6 { - margin-left: 50%; + margin-left: 50%; } + .col-xs-offset-5 { - margin-left: 41.66666667%; + margin-left: 41.66666667%; } + .col-xs-offset-4 { - margin-left: 33.33333333%; + margin-left: 33.33333333%; } + .col-xs-offset-3 { - margin-left: 25%; + margin-left: 25%; } + .col-xs-offset-2 { - margin-left: 16.66666667%; + margin-left: 16.66666667%; } + .col-xs-offset-1 { - margin-left: 8.33333333%; + margin-left: 8.33333333%; } + .col-xs-offset-0 { - margin-left: 0; + margin-left: 0; } + @media (min-width: 768px) { - .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { - float: left; - } - .col-sm-12 { - width: 100%; - } - .col-sm-11 { - width: 91.66666667%; - } - .col-sm-10 { - width: 83.33333333%; - } - .col-sm-9 { - width: 75%; - } - .col-sm-8 { - width: 66.66666667%; - } - .col-sm-7 { - width: 58.33333333%; - } - .col-sm-6 { - width: 50%; - } - .col-sm-5 { - width: 41.66666667%; - } - .col-sm-4 { - width: 33.33333333%; - } - .col-sm-3 { - width: 25%; - } - .col-sm-2 { - width: 16.66666667%; - } - .col-sm-1 { - width: 8.33333333%; - } - .col-sm-pull-12 { - right: 100%; - } - .col-sm-pull-11 { - right: 91.66666667%; - } - .col-sm-pull-10 { - right: 83.33333333%; - } - .col-sm-pull-9 { - right: 75%; - } - .col-sm-pull-8 { - right: 66.66666667%; - } - .col-sm-pull-7 { - right: 58.33333333%; - } - .col-sm-pull-6 { - right: 50%; - } - .col-sm-pull-5 { - right: 41.66666667%; - } - .col-sm-pull-4 { - right: 33.33333333%; - } - .col-sm-pull-3 { - right: 25%; - } - .col-sm-pull-2 { - right: 16.66666667%; - } - .col-sm-pull-1 { - right: 8.33333333%; - } - .col-sm-pull-0 { - right: 0; - } - .col-sm-push-12 { - left: 100%; - } - .col-sm-push-11 { - left: 91.66666667%; - } - .col-sm-push-10 { - left: 83.33333333%; - } - .col-sm-push-9 { - left: 75%; - } - .col-sm-push-8 { - left: 66.66666667%; - } - .col-sm-push-7 { - left: 58.33333333%; - } - .col-sm-push-6 { - left: 50%; - } - .col-sm-push-5 { - left: 41.66666667%; - } - .col-sm-push-4 { - left: 33.33333333%; - } - .col-sm-push-3 { - left: 25%; - } - .col-sm-push-2 { - left: 16.66666667%; - } - .col-sm-push-1 { - left: 8.33333333%; - } - .col-sm-push-0 { - left: 0; - } - .col-sm-offset-12 { - margin-left: 100%; - } - .col-sm-offset-11 { - margin-left: 91.66666667%; - } - .col-sm-offset-10 { - margin-left: 83.33333333%; - } - .col-sm-offset-9 { - margin-left: 75%; - } - .col-sm-offset-8 { - margin-left: 66.66666667%; - } - .col-sm-offset-7 { - margin-left: 58.33333333%; - } - .col-sm-offset-6 { - margin-left: 50%; - } - .col-sm-offset-5 { - margin-left: 41.66666667%; - } - .col-sm-offset-4 { - margin-left: 33.33333333%; - } - .col-sm-offset-3 { - margin-left: 25%; - } - .col-sm-offset-2 { - margin-left: 16.66666667%; - } - .col-sm-offset-1 { - margin-left: 8.33333333%; - } - .col-sm-offset-0 { - margin-left: 0; - } + .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { + float: left; + } + + .col-sm-12 { + width: 100%; + } + + .col-sm-11 { + width: 91.66666667%; + } + + .col-sm-10 { + width: 83.33333333%; + } + + .col-sm-9 { + width: 75%; + } + + .col-sm-8 { + width: 66.66666667%; + } + + .col-sm-7 { + width: 58.33333333%; + } + + .col-sm-6 { + width: 50%; + } + + .col-sm-5 { + width: 41.66666667%; + } + + .col-sm-4 { + width: 33.33333333%; + } + + .col-sm-3 { + width: 25%; + } + + .col-sm-2 { + width: 16.66666667%; + } + + .col-sm-1 { + width: 8.33333333%; + } + + .col-sm-pull-12 { + right: 100%; + } + + .col-sm-pull-11 { + right: 91.66666667%; + } + + .col-sm-pull-10 { + right: 83.33333333%; + } + + .col-sm-pull-9 { + right: 75%; + } + + .col-sm-pull-8 { + right: 66.66666667%; + } + + .col-sm-pull-7 { + right: 58.33333333%; + } + + .col-sm-pull-6 { + right: 50%; + } + + .col-sm-pull-5 { + right: 41.66666667%; + } + + .col-sm-pull-4 { + right: 33.33333333%; + } + + .col-sm-pull-3 { + right: 25%; + } + + .col-sm-pull-2 { + right: 16.66666667%; + } + + .col-sm-pull-1 { + right: 8.33333333%; + } + + .col-sm-pull-0 { + right: 0; + } + + .col-sm-push-12 { + left: 100%; + } + + .col-sm-push-11 { + left: 91.66666667%; + } + + .col-sm-push-10 { + left: 83.33333333%; + } + + .col-sm-push-9 { + left: 75%; + } + + .col-sm-push-8 { + left: 66.66666667%; + } + + .col-sm-push-7 { + left: 58.33333333%; + } + + .col-sm-push-6 { + left: 50%; + } + + .col-sm-push-5 { + left: 41.66666667%; + } + + .col-sm-push-4 { + left: 33.33333333%; + } + + .col-sm-push-3 { + left: 25%; + } + + .col-sm-push-2 { + left: 16.66666667%; + } + + .col-sm-push-1 { + left: 8.33333333%; + } + + .col-sm-push-0 { + left: 0; + } + + .col-sm-offset-12 { + margin-left: 100%; + } + + .col-sm-offset-11 { + margin-left: 91.66666667%; + } + + .col-sm-offset-10 { + margin-left: 83.33333333%; + } + + .col-sm-offset-9 { + margin-left: 75%; + } + + .col-sm-offset-8 { + margin-left: 66.66666667%; + } + + .col-sm-offset-7 { + margin-left: 58.33333333%; + } + + .col-sm-offset-6 { + margin-left: 50%; + } + + .col-sm-offset-5 { + margin-left: 41.66666667%; + } + + .col-sm-offset-4 { + margin-left: 33.33333333%; + } + + .col-sm-offset-3 { + margin-left: 25%; + } + + .col-sm-offset-2 { + margin-left: 16.66666667%; + } + + .col-sm-offset-1 { + margin-left: 8.33333333%; + } + + .col-sm-offset-0 { + margin-left: 0; + } } + @media (min-width: 992px) { - .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { - float: left; - } - .col-md-12 { - width: 100%; - } - .col-md-11 { - width: 91.66666667%; - } - .col-md-10 { - width: 83.33333333%; - } - .col-md-9 { - width: 75%; - } - .col-md-8 { - width: 66.66666667%; - } - .col-md-7 { - width: 58.33333333%; - } - .col-md-6 { - width: 50%; - } - .col-md-5 { - width: 41.66666667%; - } - .col-md-4 { - width: 33.33333333%; - } - .col-md-3 { - width: 25%; - } - .col-md-2 { - width: 16.66666667%; - } - .col-md-1 { - width: 8.33333333%; - } - .col-md-pull-12 { - right: 100%; - } - .col-md-pull-11 { - right: 91.66666667%; - } - .col-md-pull-10 { - right: 83.33333333%; - } - .col-md-pull-9 { - right: 75%; - } - .col-md-pull-8 { - right: 66.66666667%; - } - .col-md-pull-7 { - right: 58.33333333%; - } - .col-md-pull-6 { - right: 50%; - } - .col-md-pull-5 { - right: 41.66666667%; - } - .col-md-pull-4 { - right: 33.33333333%; - } - .col-md-pull-3 { - right: 25%; - } - .col-md-pull-2 { - right: 16.66666667%; - } - .col-md-pull-1 { - right: 8.33333333%; - } - .col-md-pull-0 { - right: 0; - } - .col-md-push-12 { - left: 100%; - } - .col-md-push-11 { - left: 91.66666667%; - } - .col-md-push-10 { - left: 83.33333333%; - } - .col-md-push-9 { - left: 75%; - } - .col-md-push-8 { - left: 66.66666667%; - } - .col-md-push-7 { - left: 58.33333333%; - } - .col-md-push-6 { - left: 50%; - } - .col-md-push-5 { - left: 41.66666667%; - } - .col-md-push-4 { - left: 33.33333333%; - } - .col-md-push-3 { - left: 25%; - } - .col-md-push-2 { - left: 16.66666667%; - } - .col-md-push-1 { - left: 8.33333333%; - } - .col-md-push-0 { - left: 0; - } - .col-md-offset-12 { - margin-left: 100%; - } - .col-md-offset-11 { - margin-left: 91.66666667%; - } - .col-md-offset-10 { - margin-left: 83.33333333%; - } - .col-md-offset-9 { - margin-left: 75%; - } - .col-md-offset-8 { - margin-left: 66.66666667%; - } - .col-md-offset-7 { - margin-left: 58.33333333%; - } - .col-md-offset-6 { - margin-left: 50%; - } - .col-md-offset-5 { - margin-left: 41.66666667%; - } - .col-md-offset-4 { - margin-left: 33.33333333%; - } - .col-md-offset-3 { - margin-left: 25%; - } - .col-md-offset-2 { - margin-left: 16.66666667%; - } - .col-md-offset-1 { - margin-left: 8.33333333%; - } - .col-md-offset-0 { - margin-left: 0; - } + .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { + float: left; + } + + .col-md-12 { + width: 100%; + } + + .col-md-11 { + width: 91.66666667%; + } + + .col-md-10 { + width: 83.33333333%; + } + + .col-md-9 { + width: 75%; + } + + .col-md-8 { + width: 66.66666667%; + } + + .col-md-7 { + width: 58.33333333%; + } + + .col-md-6 { + width: 50%; + } + + .col-md-5 { + width: 41.66666667%; + } + + .col-md-4 { + width: 33.33333333%; + } + + .col-md-3 { + width: 25%; + } + + .col-md-2 { + width: 16.66666667%; + } + + .col-md-1 { + width: 8.33333333%; + } + + .col-md-pull-12 { + right: 100%; + } + + .col-md-pull-11 { + right: 91.66666667%; + } + + .col-md-pull-10 { + right: 83.33333333%; + } + + .col-md-pull-9 { + right: 75%; + } + + .col-md-pull-8 { + right: 66.66666667%; + } + + .col-md-pull-7 { + right: 58.33333333%; + } + + .col-md-pull-6 { + right: 50%; + } + + .col-md-pull-5 { + right: 41.66666667%; + } + + .col-md-pull-4 { + right: 33.33333333%; + } + + .col-md-pull-3 { + right: 25%; + } + + .col-md-pull-2 { + right: 16.66666667%; + } + + .col-md-pull-1 { + right: 8.33333333%; + } + + .col-md-pull-0 { + right: 0; + } + + .col-md-push-12 { + left: 100%; + } + + .col-md-push-11 { + left: 91.66666667%; + } + + .col-md-push-10 { + left: 83.33333333%; + } + + .col-md-push-9 { + left: 75%; + } + + .col-md-push-8 { + left: 66.66666667%; + } + + .col-md-push-7 { + left: 58.33333333%; + } + + .col-md-push-6 { + left: 50%; + } + + .col-md-push-5 { + left: 41.66666667%; + } + + .col-md-push-4 { + left: 33.33333333%; + } + + .col-md-push-3 { + left: 25%; + } + + .col-md-push-2 { + left: 16.66666667%; + } + + .col-md-push-1 { + left: 8.33333333%; + } + + .col-md-push-0 { + left: 0; + } + + .col-md-offset-12 { + margin-left: 100%; + } + + .col-md-offset-11 { + margin-left: 91.66666667%; + } + + .col-md-offset-10 { + margin-left: 83.33333333%; + } + + .col-md-offset-9 { + margin-left: 75%; + } + + .col-md-offset-8 { + margin-left: 66.66666667%; + } + + .col-md-offset-7 { + margin-left: 58.33333333%; + } + + .col-md-offset-6 { + margin-left: 50%; + } + + .col-md-offset-5 { + margin-left: 41.66666667%; + } + + .col-md-offset-4 { + margin-left: 33.33333333%; + } + + .col-md-offset-3 { + margin-left: 25%; + } + + .col-md-offset-2 { + margin-left: 16.66666667%; + } + + .col-md-offset-1 { + margin-left: 8.33333333%; + } + + .col-md-offset-0 { + margin-left: 0; + } } + @media (min-width: 1200px) { - .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { - float: left; - } - .col-lg-12 { - width: 100%; - } - .col-lg-11 { - width: 91.66666667%; - } - .col-lg-10 { - width: 83.33333333%; - } - .col-lg-9 { - width: 75%; - } - .col-lg-8 { - width: 66.66666667%; - } - .col-lg-7 { - width: 58.33333333%; - } - .col-lg-6 { - width: 50%; - } - .col-lg-5 { - width: 41.66666667%; - } - .col-lg-4 { - width: 33.33333333%; - } - .col-lg-3 { - width: 25%; - } - .col-lg-2 { - width: 16.66666667%; - } - .col-lg-1 { - width: 8.33333333%; - } - .col-lg-pull-12 { - right: 100%; - } - .col-lg-pull-11 { - right: 91.66666667%; - } - .col-lg-pull-10 { - right: 83.33333333%; - } - .col-lg-pull-9 { - right: 75%; - } - .col-lg-pull-8 { - right: 66.66666667%; - } - .col-lg-pull-7 { - right: 58.33333333%; - } - .col-lg-pull-6 { - right: 50%; - } - .col-lg-pull-5 { - right: 41.66666667%; - } - .col-lg-pull-4 { - right: 33.33333333%; - } - .col-lg-pull-3 { - right: 25%; - } - .col-lg-pull-2 { - right: 16.66666667%; - } - .col-lg-pull-1 { - right: 8.33333333%; - } - .col-lg-pull-0 { - right: 0; - } - .col-lg-push-12 { - left: 100%; - } - .col-lg-push-11 { - left: 91.66666667%; - } - .col-lg-push-10 { - left: 83.33333333%; - } - .col-lg-push-9 { - left: 75%; - } - .col-lg-push-8 { - left: 66.66666667%; - } - .col-lg-push-7 { - left: 58.33333333%; - } - .col-lg-push-6 { - left: 50%; - } - .col-lg-push-5 { - left: 41.66666667%; - } - .col-lg-push-4 { - left: 33.33333333%; - } - .col-lg-push-3 { - left: 25%; - } - .col-lg-push-2 { - left: 16.66666667%; - } - .col-lg-push-1 { - left: 8.33333333%; - } - .col-lg-push-0 { - left: 0; - } - .col-lg-offset-12 { - margin-left: 100%; - } - .col-lg-offset-11 { - margin-left: 91.66666667%; - } - .col-lg-offset-10 { - margin-left: 83.33333333%; - } - .col-lg-offset-9 { - margin-left: 75%; - } - .col-lg-offset-8 { - margin-left: 66.66666667%; - } - .col-lg-offset-7 { - margin-left: 58.33333333%; - } - .col-lg-offset-6 { - margin-left: 50%; - } - .col-lg-offset-5 { - margin-left: 41.66666667%; - } - .col-lg-offset-4 { - margin-left: 33.33333333%; - } - .col-lg-offset-3 { - margin-left: 25%; - } - .col-lg-offset-2 { - margin-left: 16.66666667%; - } - .col-lg-offset-1 { - margin-left: 8.33333333%; - } - .col-lg-offset-0 { - margin-left: 0; - } + .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { + float: left; + } + + .col-lg-12 { + width: 100%; + } + + .col-lg-11 { + width: 91.66666667%; + } + + .col-lg-10 { + width: 83.33333333%; + } + + .col-lg-9 { + width: 75%; + } + + .col-lg-8 { + width: 66.66666667%; + } + + .col-lg-7 { + width: 58.33333333%; + } + + .col-lg-6 { + width: 50%; + } + + .col-lg-5 { + width: 41.66666667%; + } + + .col-lg-4 { + width: 33.33333333%; + } + + .col-lg-3 { + width: 25%; + } + + .col-lg-2 { + width: 16.66666667%; + } + + .col-lg-1 { + width: 8.33333333%; + } + + .col-lg-pull-12 { + right: 100%; + } + + .col-lg-pull-11 { + right: 91.66666667%; + } + + .col-lg-pull-10 { + right: 83.33333333%; + } + + .col-lg-pull-9 { + right: 75%; + } + + .col-lg-pull-8 { + right: 66.66666667%; + } + + .col-lg-pull-7 { + right: 58.33333333%; + } + + .col-lg-pull-6 { + right: 50%; + } + + .col-lg-pull-5 { + right: 41.66666667%; + } + + .col-lg-pull-4 { + right: 33.33333333%; + } + + .col-lg-pull-3 { + right: 25%; + } + + .col-lg-pull-2 { + right: 16.66666667%; + } + + .col-lg-pull-1 { + right: 8.33333333%; + } + + .col-lg-pull-0 { + right: 0; + } + + .col-lg-push-12 { + left: 100%; + } + + .col-lg-push-11 { + left: 91.66666667%; + } + + .col-lg-push-10 { + left: 83.33333333%; + } + + .col-lg-push-9 { + left: 75%; + } + + .col-lg-push-8 { + left: 66.66666667%; + } + + .col-lg-push-7 { + left: 58.33333333%; + } + + .col-lg-push-6 { + left: 50%; + } + + .col-lg-push-5 { + left: 41.66666667%; + } + + .col-lg-push-4 { + left: 33.33333333%; + } + + .col-lg-push-3 { + left: 25%; + } + + .col-lg-push-2 { + left: 16.66666667%; + } + + .col-lg-push-1 { + left: 8.33333333%; + } + + .col-lg-push-0 { + left: 0; + } + + .col-lg-offset-12 { + margin-left: 100%; + } + + .col-lg-offset-11 { + margin-left: 91.66666667%; + } + + .col-lg-offset-10 { + margin-left: 83.33333333%; + } + + .col-lg-offset-9 { + margin-left: 75%; + } + + .col-lg-offset-8 { + margin-left: 66.66666667%; + } + + .col-lg-offset-7 { + margin-left: 58.33333333%; + } + + .col-lg-offset-6 { + margin-left: 50%; + } + + .col-lg-offset-5 { + margin-left: 41.66666667%; + } + + .col-lg-offset-4 { + margin-left: 33.33333333%; + } + + .col-lg-offset-3 { + margin-left: 25%; + } + + .col-lg-offset-2 { + margin-left: 16.66666667%; + } + + .col-lg-offset-1 { + margin-left: 8.33333333%; + } + + .col-lg-offset-0 { + margin-left: 0; + } } + table { - max-width: 100%; - background-color: transparent; + max-width: 100%; + background-color: transparent; } + th { - text-align: left; + text-align: left; } + .table { - width: 100%; - margin-bottom: 20px; + width: 100%; + margin-bottom: 20px; } + .table > thead > tr > th, .table > tbody > tr > th, .table > tfoot > tr > th, .table > thead > tr > td, .table > tbody > tr > td, .table > tfoot > tr > td { - padding: 8px; - line-height: 1.42857143; - vertical-align: top; - border-top: 1px solid #ddd; + padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border-top: 1px solid #ddd; } + .table > thead > tr > th { - vertical-align: bottom; - border-bottom: 2px solid #ddd; + vertical-align: bottom; + border-bottom: 2px solid #ddd; } + .table > caption + thead > tr:first-child > th, .table > colgroup + thead > tr:first-child > th, .table > thead:first-child > tr:first-child > th, .table > caption + thead > tr:first-child > td, .table > colgroup + thead > tr:first-child > td, .table > thead:first-child > tr:first-child > td { - border-top: 0; + border-top: 0; } + .table > tbody + tbody { - border-top: 2px solid #ddd; + border-top: 2px solid #ddd; } + .table .table { - background-color: #fff; + background-color: #fff; } + .table-condensed > thead > tr > th, .table-condensed > tbody > tr > th, .table-condensed > tfoot > tr > th, .table-condensed > thead > tr > td, .table-condensed > tbody > tr > td, .table-condensed > tfoot > tr > td { - padding: 5px; + padding: 5px; } + .table-bordered { - border: 1px solid #ddd; + border: 1px solid #ddd; } + .table-bordered > thead > tr > th, .table-bordered > tbody > tr > th, .table-bordered > tfoot > tr > th, .table-bordered > thead > tr > td, .table-bordered > tbody > tr > td, .table-bordered > tfoot > tr > td { - border: 1px solid #ddd; + border: 1px solid #ddd; } + .table-bordered > thead > tr > th, .table-bordered > thead > tr > td { - border-bottom-width: 2px; + border-bottom-width: 2px; } + .table-striped > tbody > tr:nth-child(odd) > td, .table-striped > tbody > tr:nth-child(odd) > th { - background-color: #f9f9f9; + background-color: #f9f9f9; } + .table-hover > tbody > tr:hover > td, .table-hover > tbody > tr:hover > th { - background-color: #f5f5f5; + background-color: #f5f5f5; } + table col[class*="col-"] { - position: static; - display: table-column; - float: none; + position: static; + display: table-column; + float: none; } + table td[class*="col-"], table th[class*="col-"] { - position: static; - display: table-cell; - float: none; + position: static; + display: table-cell; + float: none; } + .table > thead > tr > td.active, .table > tbody > tr > td.active, .table > tfoot > tr > td.active, @@ -1494,14 +1870,16 @@ table th[class*="col-"] { .table > thead > tr.active > th, .table > tbody > tr.active > th, .table > tfoot > tr.active > th { - background-color: #f5f5f5; + background-color: #f5f5f5; } + .table-hover > tbody > tr > td.active:hover, .table-hover > tbody > tr > th.active:hover, .table-hover > tbody > tr.active:hover > td, .table-hover > tbody > tr.active:hover > th { - background-color: #e8e8e8; + background-color: #e8e8e8; } + .table > thead > tr > td.success, .table > tbody > tr > td.success, .table > tfoot > tr > td.success, @@ -1514,14 +1892,16 @@ table th[class*="col-"] { .table > thead > tr.success > th, .table > tbody > tr.success > th, .table > tfoot > tr.success > th { - background-color: #dff0d8; + background-color: #dff0d8; } + .table-hover > tbody > tr > td.success:hover, .table-hover > tbody > tr > th.success:hover, .table-hover > tbody > tr.success:hover > td, .table-hover > tbody > tr.success:hover > th { - background-color: #d0e9c6; + background-color: #d0e9c6; } + .table > thead > tr > td.info, .table > tbody > tr > td.info, .table > tfoot > tr > td.info, @@ -1534,14 +1914,16 @@ table th[class*="col-"] { .table > thead > tr.info > th, .table > tbody > tr.info > th, .table > tfoot > tr.info > th { - background-color: #d9edf7; + background-color: #d9edf7; } + .table-hover > tbody > tr > td.info:hover, .table-hover > tbody > tr > th.info:hover, .table-hover > tbody > tr.info:hover > td, .table-hover > tbody > tr.info:hover > th { - background-color: #c4e3f3; + background-color: #c4e3f3; } + .table > thead > tr > td.warning, .table > tbody > tr > td.warning, .table > tfoot > tr > td.warning, @@ -1554,14 +1936,16 @@ table th[class*="col-"] { .table > thead > tr.warning > th, .table > tbody > tr.warning > th, .table > tfoot > tr.warning > th { - background-color: #fcf8e3; + background-color: #fcf8e3; } + .table-hover > tbody > tr > td.warning:hover, .table-hover > tbody > tr > th.warning:hover, .table-hover > tbody > tr.warning:hover > td, .table-hover > tbody > tr.warning:hover > th { - background-color: #faf2cc; + background-color: #faf2cc; } + .table > thead > tr > td.danger, .table > tbody > tr > td.danger, .table > tfoot > tr > td.danger, @@ -1574,211 +1958,246 @@ table th[class*="col-"] { .table > thead > tr.danger > th, .table > tbody > tr.danger > th, .table > tfoot > tr.danger > th { - background-color: #f2dede; + background-color: #f2dede; } + .table-hover > tbody > tr > td.danger:hover, .table-hover > tbody > tr > th.danger:hover, .table-hover > tbody > tr.danger:hover > td, .table-hover > tbody > tr.danger:hover > th { - background-color: #ebcccc; + background-color: #ebcccc; } + @media (max-width: 767px) { - .table-responsive { - width: 100%; - margin-bottom: 15px; - overflow-x: scroll; - overflow-y: hidden; - -webkit-overflow-scrolling: touch; - -ms-overflow-style: -ms-autohiding-scrollbar; - border: 1px solid #ddd; - } - .table-responsive > .table { - margin-bottom: 0; - } - .table-responsive > .table > thead > tr > th, - .table-responsive > .table > tbody > tr > th, - .table-responsive > .table > tfoot > tr > th, - .table-responsive > .table > thead > tr > td, - .table-responsive > .table > tbody > tr > td, - .table-responsive > .table > tfoot > tr > td { - white-space: nowrap; - } - .table-responsive > .table-bordered { - border: 0; - } - .table-responsive > .table-bordered > thead > tr > th:first-child, - .table-responsive > .table-bordered > tbody > tr > th:first-child, - .table-responsive > .table-bordered > tfoot > tr > th:first-child, - .table-responsive > .table-bordered > thead > tr > td:first-child, - .table-responsive > .table-bordered > tbody > tr > td:first-child, - .table-responsive > .table-bordered > tfoot > tr > td:first-child { - border-left: 0; - } - .table-responsive > .table-bordered > thead > tr > th:last-child, - .table-responsive > .table-bordered > tbody > tr > th:last-child, - .table-responsive > .table-bordered > tfoot > tr > th:last-child, - .table-responsive > .table-bordered > thead > tr > td:last-child, - .table-responsive > .table-bordered > tbody > tr > td:last-child, - .table-responsive > .table-bordered > tfoot > tr > td:last-child { - border-right: 0; - } - .table-responsive > .table-bordered > tbody > tr:last-child > th, - .table-responsive > .table-bordered > tfoot > tr:last-child > th, - .table-responsive > .table-bordered > tbody > tr:last-child > td, - .table-responsive > .table-bordered > tfoot > tr:last-child > td { - border-bottom: 0; - } + .table-responsive { + width: 100%; + margin-bottom: 15px; + overflow-x: scroll; + overflow-y: hidden; + -webkit-overflow-scrolling: touch; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 1px solid #ddd; + } + + .table-responsive > .table { + margin-bottom: 0; + } + + .table-responsive > .table > thead > tr > th, + .table-responsive > .table > tbody > tr > th, + .table-responsive > .table > tfoot > tr > th, + .table-responsive > .table > thead > tr > td, + .table-responsive > .table > tbody > tr > td, + .table-responsive > .table > tfoot > tr > td { + white-space: nowrap; + } + + .table-responsive > .table-bordered { + border: 0; + } + + .table-responsive > .table-bordered > thead > tr > th:first-child, + .table-responsive > .table-bordered > tbody > tr > th:first-child, + .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .table-responsive > .table-bordered > thead > tr > td:first-child, + .table-responsive > .table-bordered > tbody > tr > td:first-child, + .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; + } + + .table-responsive > .table-bordered > thead > tr > th:last-child, + .table-responsive > .table-bordered > tbody > tr > th:last-child, + .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .table-responsive > .table-bordered > thead > tr > td:last-child, + .table-responsive > .table-bordered > tbody > tr > td:last-child, + .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; + } + + .table-responsive > .table-bordered > tbody > tr:last-child > th, + .table-responsive > .table-bordered > tfoot > tr:last-child > th, + .table-responsive > .table-bordered > tbody > tr:last-child > td, + .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; + } } + fieldset { - min-width: 0; - padding: 0; - margin: 0; - border: 0; + min-width: 0; + padding: 0; + margin: 0; + border: 0; } + legend { - display: block; - width: 100%; - padding: 0; - margin-bottom: 20px; - font-size: 21px; - line-height: inherit; - color: #333; - border: 0; - border-bottom: 1px solid #e5e5e5; + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: inherit; + color: #333; + border: 0; + border-bottom: 1px solid #e5e5e5; } + label { - display: inline-block; - margin-bottom: 5px; - font-weight: bold; + display: inline-block; + margin-bottom: 5px; + font-weight: bold; } + input[type="search"] { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; } + input[type="radio"], input[type="checkbox"] { - margin: 4px 0 0; - margin-top: 1px \9; - /* IE8-9 */ - line-height: normal; + margin: 4px 0 0; + margin-top: 1px \9; + /* IE8-9 */ + line-height: normal; } + input[type="file"] { - display: block; + display: block; } + input[type="range"] { - display: block; - width: 100%; + display: block; + width: 100%; } + select[multiple], select[size] { - height: auto; + height: auto; } + input[type="file"]:focus, input[type="radio"]:focus, input[type="checkbox"]:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; } + output { - display: block; - padding-top: 7px; - font-size: 14px; - line-height: 1.42857143; - color: #555; + display: block; + padding-top: 7px; + font-size: 14px; + line-height: 1.42857143; + color: #555; } + .form-control { - display: block; - width: 100%; - height: 34px; - padding: 6px 12px; - font-size: 14px; - line-height: 1.42857143; - color: #555; - background-color: #fff; - background-image: none; - border: 1px solid #ccc; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; - transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + display: block; + width: 100%; + height: 34px; + padding: 6px 12px; + font-size: 14px; + line-height: 1.42857143; + color: #555; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; } + .form-control:focus { - border-color: #66afe9; - outline: 0; - -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); - box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6); } + .form-control::-moz-placeholder { - color: #999; - opacity: 1; + color: #999; + opacity: 1; } + .form-control:-ms-input-placeholder { - color: #999; + color: #999; } + .form-control::-webkit-input-placeholder { - color: #999; + color: #999; } + .form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control { - cursor: not-allowed; - background-color: #eee; - opacity: 1; + cursor: not-allowed; + background-color: #eee; + opacity: 1; } + textarea.form-control { - height: auto; + height: auto; } + input[type="search"] { - -webkit-appearance: none; + -webkit-appearance: none; } + input[type="date"] { - line-height: 34px; + line-height: 34px; } + .form-group { - margin-bottom: 15px; + margin-bottom: 15px; } + .radio, .checkbox { - display: block; - min-height: 20px; - padding-left: 20px; - margin-top: 10px; - margin-bottom: 10px; + display: block; + min-height: 20px; + padding-left: 20px; + margin-top: 10px; + margin-bottom: 10px; } + .radio label, .checkbox label { - display: inline; - font-weight: normal; - cursor: pointer; + display: inline; + font-weight: normal; + cursor: pointer; } + .radio input[type="radio"], .radio-inline input[type="radio"], .checkbox input[type="checkbox"], .checkbox-inline input[type="checkbox"] { - float: left; - margin-left: -20px; + float: left; + margin-left: -20px; } + .radio + .radio, .checkbox + .checkbox { - margin-top: -5px; + margin-top: -5px; } + .radio-inline, .checkbox-inline { - display: inline-block; - padding-left: 20px; - margin-bottom: 0; - font-weight: normal; - vertical-align: middle; - cursor: pointer; + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + vertical-align: middle; + cursor: pointer; } + .radio-inline + .radio-inline, .checkbox-inline + .checkbox-inline { - margin-top: 0; - margin-left: 10px; + margin-top: 0; + margin-left: 10px; } + input[type="radio"][disabled], input[type="checkbox"][disabled], .radio[disabled], @@ -1791,272 +2210,320 @@ fieldset[disabled] .radio, fieldset[disabled] .radio-inline, fieldset[disabled] .checkbox, fieldset[disabled] .checkbox-inline { - cursor: not-allowed; + cursor: not-allowed; } + .input-sm { - height: 30px; - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; } + select.input-sm { - height: 30px; - line-height: 30px; + height: 30px; + line-height: 30px; } + textarea.input-sm, select[multiple].input-sm { - height: auto; + height: auto; } + .input-lg { - height: 46px; - padding: 10px 16px; - font-size: 18px; - line-height: 1.33; - border-radius: 6px; + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.33; + border-radius: 6px; } + select.input-lg { - height: 46px; - line-height: 46px; + height: 46px; + line-height: 46px; } + textarea.input-lg, select[multiple].input-lg { - height: auto; + height: auto; } + .has-feedback { - position: relative; + position: relative; } + .has-feedback .form-control { - padding-right: 42.5px; + padding-right: 42.5px; } + .has-feedback .form-control-feedback { - position: absolute; - top: 25px; - right: 0; - display: block; - width: 34px; - height: 34px; - line-height: 34px; - text-align: center; + position: absolute; + top: 25px; + right: 0; + display: block; + width: 34px; + height: 34px; + line-height: 34px; + text-align: center; } + .has-success .help-block, .has-success .control-label, .has-success .radio, .has-success .checkbox, .has-success .radio-inline, .has-success .checkbox-inline { - color: #3c763d; + color: #3c763d; } + .has-success .form-control { - border-color: #3c763d; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + border-color: #3c763d; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); } + .has-success .form-control:focus { - border-color: #2b542c; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; + border-color: #2b542c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; } + .has-success .input-group-addon { - color: #3c763d; - background-color: #dff0d8; - border-color: #3c763d; + color: #3c763d; + background-color: #dff0d8; + border-color: #3c763d; } + .has-success .form-control-feedback { - color: #3c763d; + color: #3c763d; } + .has-warning .help-block, .has-warning .control-label, .has-warning .radio, .has-warning .checkbox, .has-warning .radio-inline, .has-warning .checkbox-inline { - color: #8a6d3b; + color: #8a6d3b; } + .has-warning .form-control { - border-color: #8a6d3b; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + border-color: #8a6d3b; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); } + .has-warning .form-control:focus { - border-color: #66512c; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; + border-color: #66512c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; } + .has-warning .input-group-addon { - color: #8a6d3b; - background-color: #fcf8e3; - border-color: #8a6d3b; + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #8a6d3b; } + .has-warning .form-control-feedback { - color: #8a6d3b; + color: #8a6d3b; } + .has-error .help-block, .has-error .control-label, .has-error .radio, .has-error .checkbox, .has-error .radio-inline, .has-error .checkbox-inline { - color: #a94442; + color: #a94442; } + .has-error .form-control { - border-color: #a94442; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + border-color: #a94442; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); } + .has-error .form-control:focus { - border-color: #843534; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; + border-color: #843534; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; } + .has-error .input-group-addon { - color: #a94442; - background-color: #f2dede; - border-color: #a94442; + color: #a94442; + background-color: #f2dede; + border-color: #a94442; } + .has-error .form-control-feedback { - color: #a94442; + color: #a94442; } + .form-control-static { - margin-bottom: 0; + margin-bottom: 0; } + .help-block { - display: block; - margin-top: 5px; - margin-bottom: 10px; - color: #737373; + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: #737373; } + @media (min-width: 768px) { - .form-inline .form-group { - display: inline-block; - margin-bottom: 0; - vertical-align: middle; - } - .form-inline .form-control { - display: inline-block; - width: auto; - vertical-align: middle; - } - .form-inline .input-group > .form-control { - width: 100%; - } - .form-inline .control-label { - margin-bottom: 0; - vertical-align: middle; - } - .form-inline .radio, - .form-inline .checkbox { - display: inline-block; - padding-left: 0; - margin-top: 0; - margin-bottom: 0; - vertical-align: middle; - } - .form-inline .radio input[type="radio"], - .form-inline .checkbox input[type="checkbox"] { - float: none; - margin-left: 0; - } - .form-inline .has-feedback .form-control-feedback { - top: 0; - } + .form-inline .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + + .form-inline .input-group > .form-control { + width: 100%; + } + + .form-inline .control-label { + margin-bottom: 0; + vertical-align: middle; + } + + .form-inline .radio, + .form-inline .checkbox { + display: inline-block; + padding-left: 0; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + + .form-inline .radio input[type="radio"], + .form-inline .checkbox input[type="checkbox"] { + float: none; + margin-left: 0; + } + + .form-inline .has-feedback .form-control-feedback { + top: 0; + } } + .form-horizontal .control-label, .form-horizontal .radio, .form-horizontal .checkbox, .form-horizontal .radio-inline, .form-horizontal .checkbox-inline { - padding-top: 7px; - margin-top: 0; - margin-bottom: 0; + padding-top: 7px; + margin-top: 0; + margin-bottom: 0; } + .form-horizontal .radio, .form-horizontal .checkbox { - min-height: 27px; + min-height: 27px; } + .form-horizontal .form-group { - margin-right: -15px; - margin-left: -15px; + margin-right: -15px; + margin-left: -15px; } + .form-horizontal .form-control-static { - padding-top: 7px; + padding-top: 7px; } + @media (min-width: 768px) { - .form-horizontal .control-label { - text-align: right; - } + .form-horizontal .control-label { + text-align: right; + } } + .form-horizontal .has-feedback .form-control-feedback { - top: 0; - right: 15px; + top: 0; + right: 15px; } + .btn { - display: inline-block; - padding: 6px 12px; - margin-bottom: 0; - font-size: 14px; - font-weight: normal; - line-height: 1.42857143; - text-align: center; - white-space: nowrap; - vertical-align: middle; - cursor: pointer; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - background-image: none; - border: 1px solid transparent; - border-radius: 4px; + display: inline-block; + padding: 6px 12px; + margin-bottom: 0; + font-size: 14px; + font-weight: normal; + line-height: 1.42857143; + text-align: center; + white-space: nowrap; + vertical-align: middle; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; } + .btn:focus, .btn:active:focus, .btn.active:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; } + .btn:hover, .btn:focus { - color: #333; - text-decoration: none; + color: #333; + text-decoration: none; } + .btn:active, .btn.active { - background-image: none; - outline: 0; - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); } + .btn.disabled, .btn[disabled], fieldset[disabled] .btn { - pointer-events: none; - cursor: not-allowed; - filter: alpha(opacity=65); - -webkit-box-shadow: none; - box-shadow: none; - opacity: .65; + pointer-events: none; + cursor: not-allowed; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; + opacity: .65; } + .btn-default { - color: #333; - background-color: #fff; - border-color: #ccc; + color: #333; + background-color: #fff; + border-color: #ccc; } + .btn-default:hover, .btn-default:focus, .btn-default:active, .btn-default.active, .open .dropdown-toggle.btn-default { - color: #333; - background-color: #ebebeb; - border-color: #adadad; + color: #333; + background-color: #ebebeb; + border-color: #adadad; } + .btn-default:active, .btn-default.active, .open .dropdown-toggle.btn-default { - background-image: none; + background-image: none; } + .btn-default.disabled, .btn-default[disabled], fieldset[disabled] .btn-default, @@ -2072,32 +2539,37 @@ fieldset[disabled] .btn-default:active, .btn-default.disabled.active, .btn-default[disabled].active, fieldset[disabled] .btn-default.active { - background-color: #fff; - border-color: #ccc; + background-color: #fff; + border-color: #ccc; } + .btn-default .badge { - color: #fff; - background-color: #333; + color: #fff; + background-color: #333; } + .btn-primary { - color: #fff; - background-color: #428bca; - border-color: #357ebd; + color: #fff; + background-color: #428bca; + border-color: #357ebd; } + .btn-primary:hover, .btn-primary:focus, .btn-primary:active, .btn-primary.active, .open .dropdown-toggle.btn-primary { - color: #fff; - background-color: #3276b1; - border-color: #285e8e; + color: #fff; + background-color: #3276b1; + border-color: #285e8e; } + .btn-primary:active, .btn-primary.active, .open .dropdown-toggle.btn-primary { - background-image: none; + background-image: none; } + .btn-primary.disabled, .btn-primary[disabled], fieldset[disabled] .btn-primary, @@ -2113,32 +2585,37 @@ fieldset[disabled] .btn-primary:active, .btn-primary.disabled.active, .btn-primary[disabled].active, fieldset[disabled] .btn-primary.active { - background-color: #428bca; - border-color: #357ebd; + background-color: #428bca; + border-color: #357ebd; } + .btn-primary .badge { - color: #428bca; - background-color: #fff; + color: #428bca; + background-color: #fff; } + .btn-success { - color: #fff; - background-color: #5cb85c; - border-color: #4cae4c; + color: #fff; + background-color: #5cb85c; + border-color: #4cae4c; } + .btn-success:hover, .btn-success:focus, .btn-success:active, .btn-success.active, .open .dropdown-toggle.btn-success { - color: #fff; - background-color: #47a447; - border-color: #398439; + color: #fff; + background-color: #47a447; + border-color: #398439; } + .btn-success:active, .btn-success.active, .open .dropdown-toggle.btn-success { - background-image: none; + background-image: none; } + .btn-success.disabled, .btn-success[disabled], fieldset[disabled] .btn-success, @@ -2154,32 +2631,37 @@ fieldset[disabled] .btn-success:active, .btn-success.disabled.active, .btn-success[disabled].active, fieldset[disabled] .btn-success.active { - background-color: #5cb85c; - border-color: #4cae4c; + background-color: #5cb85c; + border-color: #4cae4c; } + .btn-success .badge { - color: #5cb85c; - background-color: #fff; + color: #5cb85c; + background-color: #fff; } + .btn-info { - color: #fff; - background-color: #5bc0de; - border-color: #46b8da; + color: #fff; + background-color: #5bc0de; + border-color: #46b8da; } + .btn-info:hover, .btn-info:focus, .btn-info:active, .btn-info.active, .open .dropdown-toggle.btn-info { - color: #fff; - background-color: #39b3d7; - border-color: #269abc; + color: #fff; + background-color: #39b3d7; + border-color: #269abc; } + .btn-info:active, .btn-info.active, .open .dropdown-toggle.btn-info { - background-image: none; + background-image: none; } + .btn-info.disabled, .btn-info[disabled], fieldset[disabled] .btn-info, @@ -2195,32 +2677,37 @@ fieldset[disabled] .btn-info:active, .btn-info.disabled.active, .btn-info[disabled].active, fieldset[disabled] .btn-info.active { - background-color: #5bc0de; - border-color: #46b8da; + background-color: #5bc0de; + border-color: #46b8da; } + .btn-info .badge { - color: #5bc0de; - background-color: #fff; + color: #5bc0de; + background-color: #fff; } + .btn-warning { - color: #fff; - background-color: #f0ad4e; - border-color: #eea236; + color: #fff; + background-color: #f0ad4e; + border-color: #eea236; } + .btn-warning:hover, .btn-warning:focus, .btn-warning:active, .btn-warning.active, .open .dropdown-toggle.btn-warning { - color: #fff; - background-color: #ed9c28; - border-color: #d58512; + color: #fff; + background-color: #ed9c28; + border-color: #d58512; } + .btn-warning:active, .btn-warning.active, .open .dropdown-toggle.btn-warning { - background-image: none; + background-image: none; } + .btn-warning.disabled, .btn-warning[disabled], fieldset[disabled] .btn-warning, @@ -2236,32 +2723,37 @@ fieldset[disabled] .btn-warning:active, .btn-warning.disabled.active, .btn-warning[disabled].active, fieldset[disabled] .btn-warning.active { - background-color: #f0ad4e; - border-color: #eea236; + background-color: #f0ad4e; + border-color: #eea236; } + .btn-warning .badge { - color: #f0ad4e; - background-color: #fff; + color: #f0ad4e; + background-color: #fff; } + .btn-danger { - color: #fff; - background-color: #d9534f; - border-color: #d43f3a; + color: #fff; + background-color: #d9534f; + border-color: #d43f3a; } + .btn-danger:hover, .btn-danger:focus, .btn-danger:active, .btn-danger.active, .open .dropdown-toggle.btn-danger { - color: #fff; - background-color: #d2322d; - border-color: #ac2925; + color: #fff; + background-color: #d2322d; + border-color: #ac2925; } + .btn-danger:active, .btn-danger.active, .open .dropdown-toggle.btn-danger { - background-image: none; + background-image: none; } + .btn-danger.disabled, .btn-danger[disabled], fieldset[disabled] .btn-danger, @@ -2277,868 +2769,1112 @@ fieldset[disabled] .btn-danger:active, .btn-danger.disabled.active, .btn-danger[disabled].active, fieldset[disabled] .btn-danger.active { - background-color: #d9534f; - border-color: #d43f3a; + background-color: #d9534f; + border-color: #d43f3a; } + .btn-danger .badge { - color: #d9534f; - background-color: #fff; + color: #d9534f; + background-color: #fff; } + .btn-link { - font-weight: normal; - color: #428bca; - cursor: pointer; - border-radius: 0; + font-weight: normal; + color: #428bca; + cursor: pointer; + border-radius: 0; } + .btn-link, .btn-link:active, .btn-link[disabled], fieldset[disabled] .btn-link { - background-color: transparent; - -webkit-box-shadow: none; - box-shadow: none; + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; } + .btn-link, .btn-link:hover, .btn-link:focus, .btn-link:active { - border-color: transparent; + border-color: transparent; } + .btn-link:hover, .btn-link:focus { - color: #2a6496; - text-decoration: underline; - background-color: transparent; + color: #2a6496; + text-decoration: underline; + background-color: transparent; } + .btn-link[disabled]:hover, fieldset[disabled] .btn-link:hover, .btn-link[disabled]:focus, fieldset[disabled] .btn-link:focus { - color: #999; - text-decoration: none; + color: #999; + text-decoration: none; } + .btn-lg, .btn-group-lg > .btn { - padding: 10px 16px; - font-size: 18px; - line-height: 1.33; - border-radius: 6px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.33; + border-radius: 6px; } + .btn-sm, .btn-group-sm > .btn { - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; } + .btn-xs, .btn-group-xs > .btn { - padding: 1px 5px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; } + .btn-block { - display: block; - width: 100%; - padding-right: 0; - padding-left: 0; + display: block; + width: 100%; + padding-right: 0; + padding-left: 0; } + .btn-block + .btn-block { - margin-top: 5px; + margin-top: 5px; } + input[type="submit"].btn-block, input[type="reset"].btn-block, input[type="button"].btn-block { - width: 100%; + width: 100%; } + .fade { - opacity: 0; - -webkit-transition: opacity .15s linear; - transition: opacity .15s linear; + opacity: 0; + -webkit-transition: opacity .15s linear; + transition: opacity .15s linear; } + .fade.in { - opacity: 1; + opacity: 1; } + .collapse { - display: none; + display: none; } + .collapse.in { - display: block; + display: block; } + .collapsing { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition: height .35s ease; - transition: height .35s ease; + position: relative; + height: 0; + overflow: hidden; + -webkit-transition: height .35s ease; + transition: height .35s ease; } + @font-face { - font-family: 'Glyphicons Halflings'; + font-family: 'Glyphicons Halflings'; - src: url('../fonts/glyphicons-halflings-regular.eot'); - src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); + src: url('../fonts/glyphicons-halflings-regular.eot'); + src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); } + .glyphicon { - position: relative; - top: 1px; - display: inline-block; - font-family: 'Glyphicons Halflings'; - font-style: normal; - font-weight: normal; - line-height: 1; + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + font-style: normal; + font-weight: normal; + line-height: 1; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } + .glyphicon-asterisk:before { - content: "\2a"; + content: "\2a"; } + .glyphicon-plus:before { - content: "\2b"; + content: "\2b"; } + .glyphicon-euro:before { - content: "\20ac"; + content: "\20ac"; } + .glyphicon-minus:before { - content: "\2212"; + content: "\2212"; } + .glyphicon-cloud:before { - content: "\2601"; + content: "\2601"; } + .glyphicon-envelope:before { - content: "\2709"; + content: "\2709"; } + .glyphicon-pencil:before { - content: "\270f"; + content: "\270f"; } + .glyphicon-glass:before { - content: "\e001"; + content: "\e001"; } + .glyphicon-music:before { - content: "\e002"; + content: "\e002"; } + .glyphicon-search:before { - content: "\e003"; + content: "\e003"; } + .glyphicon-heart:before { - content: "\e005"; + content: "\e005"; } + .glyphicon-star:before { - content: "\e006"; + content: "\e006"; } + .glyphicon-star-empty:before { - content: "\e007"; + content: "\e007"; } + .glyphicon-user:before { - content: "\e008"; + content: "\e008"; } + .glyphicon-film:before { - content: "\e009"; + content: "\e009"; } + .glyphicon-th-large:before { - content: "\e010"; + content: "\e010"; } + .glyphicon-th:before { - content: "\e011"; + content: "\e011"; } + .glyphicon-th-list:before { - content: "\e012"; + content: "\e012"; } + .glyphicon-ok:before { - content: "\e013"; + content: "\e013"; } + .glyphicon-remove:before { - content: "\e014"; + content: "\e014"; } + .glyphicon-zoom-in:before { - content: "\e015"; + content: "\e015"; } + .glyphicon-zoom-out:before { - content: "\e016"; + content: "\e016"; } + .glyphicon-off:before { - content: "\e017"; + content: "\e017"; } + .glyphicon-signal:before { - content: "\e018"; + content: "\e018"; } + .glyphicon-cog:before { - content: "\e019"; + content: "\e019"; } + .glyphicon-trash:before { - content: "\e020"; + content: "\e020"; } + .glyphicon-home:before { - content: "\e021"; + content: "\e021"; } + .glyphicon-file:before { - content: "\e022"; + content: "\e022"; } + .glyphicon-time:before { - content: "\e023"; + content: "\e023"; } + .glyphicon-road:before { - content: "\e024"; + content: "\e024"; } + .glyphicon-download-alt:before { - content: "\e025"; + content: "\e025"; } + .glyphicon-download:before { - content: "\e026"; + content: "\e026"; } + .glyphicon-upload:before { - content: "\e027"; + content: "\e027"; } + .glyphicon-inbox:before { - content: "\e028"; + content: "\e028"; } + .glyphicon-play-circle:before { - content: "\e029"; + content: "\e029"; } + .glyphicon-repeat:before { - content: "\e030"; + content: "\e030"; } + .glyphicon-refresh:before { - content: "\e031"; + content: "\e031"; } + .glyphicon-list-alt:before { - content: "\e032"; + content: "\e032"; } + .glyphicon-lock:before { - content: "\e033"; + content: "\e033"; } + .glyphicon-flag:before { - content: "\e034"; + content: "\e034"; } + .glyphicon-headphones:before { - content: "\e035"; + content: "\e035"; } + .glyphicon-volume-off:before { - content: "\e036"; + content: "\e036"; } + .glyphicon-volume-down:before { - content: "\e037"; + content: "\e037"; } + .glyphicon-volume-up:before { - content: "\e038"; + content: "\e038"; } + .glyphicon-qrcode:before { - content: "\e039"; + content: "\e039"; } + .glyphicon-barcode:before { - content: "\e040"; + content: "\e040"; } + .glyphicon-tag:before { - content: "\e041"; + content: "\e041"; } + .glyphicon-tags:before { - content: "\e042"; + content: "\e042"; } + .glyphicon-book:before { - content: "\e043"; + content: "\e043"; } + .glyphicon-bookmark:before { - content: "\e044"; + content: "\e044"; } + .glyphicon-print:before { - content: "\e045"; + content: "\e045"; } + .glyphicon-camera:before { - content: "\e046"; + content: "\e046"; } + .glyphicon-font:before { - content: "\e047"; + content: "\e047"; } + .glyphicon-bold:before { - content: "\e048"; + content: "\e048"; } + .glyphicon-italic:before { - content: "\e049"; + content: "\e049"; } + .glyphicon-text-height:before { - content: "\e050"; + content: "\e050"; } + .glyphicon-text-width:before { - content: "\e051"; + content: "\e051"; } + .glyphicon-align-left:before { - content: "\e052"; + content: "\e052"; } + .glyphicon-align-center:before { - content: "\e053"; + content: "\e053"; } + .glyphicon-align-right:before { - content: "\e054"; + content: "\e054"; } + .glyphicon-align-justify:before { - content: "\e055"; + content: "\e055"; } + .glyphicon-list:before { - content: "\e056"; + content: "\e056"; } + .glyphicon-indent-left:before { - content: "\e057"; + content: "\e057"; } + .glyphicon-indent-right:before { - content: "\e058"; + content: "\e058"; } + .glyphicon-facetime-video:before { - content: "\e059"; + content: "\e059"; } + .glyphicon-picture:before { - content: "\e060"; + content: "\e060"; } + .glyphicon-map-marker:before { - content: "\e062"; + content: "\e062"; } + .glyphicon-adjust:before { - content: "\e063"; + content: "\e063"; } + .glyphicon-tint:before { - content: "\e064"; + content: "\e064"; } + .glyphicon-edit:before { - content: "\e065"; + content: "\e065"; } + .glyphicon-share:before { - content: "\e066"; + content: "\e066"; } + .glyphicon-check:before { - content: "\e067"; + content: "\e067"; } + .glyphicon-move:before { - content: "\e068"; + content: "\e068"; } + .glyphicon-step-backward:before { - content: "\e069"; + content: "\e069"; } + .glyphicon-fast-backward:before { - content: "\e070"; + content: "\e070"; } + .glyphicon-backward:before { - content: "\e071"; + content: "\e071"; } + .glyphicon-play:before { - content: "\e072"; + content: "\e072"; } + .glyphicon-pause:before { - content: "\e073"; + content: "\e073"; } + .glyphicon-stop:before { - content: "\e074"; + content: "\e074"; } + .glyphicon-forward:before { - content: "\e075"; + content: "\e075"; } + .glyphicon-fast-forward:before { - content: "\e076"; + content: "\e076"; } + .glyphicon-step-forward:before { - content: "\e077"; + content: "\e077"; } + .glyphicon-eject:before { - content: "\e078"; + content: "\e078"; } + .glyphicon-chevron-left:before { - content: "\e079"; + content: "\e079"; } + .glyphicon-chevron-right:before { - content: "\e080"; + content: "\e080"; } + .glyphicon-plus-sign:before { - content: "\e081"; + content: "\e081"; } + .glyphicon-minus-sign:before { - content: "\e082"; + content: "\e082"; } + .glyphicon-remove-sign:before { - content: "\e083"; + content: "\e083"; } + .glyphicon-ok-sign:before { - content: "\e084"; + content: "\e084"; } + .glyphicon-question-sign:before { - content: "\e085"; + content: "\e085"; } + .glyphicon-info-sign:before { - content: "\e086"; + content: "\e086"; } + .glyphicon-screenshot:before { - content: "\e087"; + content: "\e087"; } + .glyphicon-remove-circle:before { - content: "\e088"; + content: "\e088"; } + .glyphicon-ok-circle:before { - content: "\e089"; + content: "\e089"; } + .glyphicon-ban-circle:before { - content: "\e090"; + content: "\e090"; } + .glyphicon-arrow-left:before { - content: "\e091"; + content: "\e091"; } + .glyphicon-arrow-right:before { - content: "\e092"; + content: "\e092"; } + .glyphicon-arrow-up:before { - content: "\e093"; + content: "\e093"; } + .glyphicon-arrow-down:before { - content: "\e094"; + content: "\e094"; } + .glyphicon-share-alt:before { - content: "\e095"; + content: "\e095"; } + .glyphicon-resize-full:before { - content: "\e096"; + content: "\e096"; } + .glyphicon-resize-small:before { - content: "\e097"; + content: "\e097"; } + .glyphicon-exclamation-sign:before { - content: "\e101"; + content: "\e101"; } + .glyphicon-gift:before { - content: "\e102"; + content: "\e102"; } + .glyphicon-leaf:before { - content: "\e103"; + content: "\e103"; } + .glyphicon-fire:before { - content: "\e104"; + content: "\e104"; } + .glyphicon-eye-open:before { - content: "\e105"; + content: "\e105"; } + .glyphicon-eye-close:before { - content: "\e106"; + content: "\e106"; } + .glyphicon-warning-sign:before { - content: "\e107"; + content: "\e107"; } + .glyphicon-plane:before { - content: "\e108"; + content: "\e108"; } + .glyphicon-calendar:before { - content: "\e109"; + content: "\e109"; } + .glyphicon-random:before { - content: "\e110"; + content: "\e110"; } + .glyphicon-comment:before { - content: "\e111"; + content: "\e111"; } + .glyphicon-magnet:before { - content: "\e112"; + content: "\e112"; } + .glyphicon-chevron-up:before { - content: "\e113"; + content: "\e113"; } + .glyphicon-chevron-down:before { - content: "\e114"; + content: "\e114"; } + .glyphicon-retweet:before { - content: "\e115"; + content: "\e115"; } + .glyphicon-shopping-cart:before { - content: "\e116"; + content: "\e116"; } + .glyphicon-folder-close:before { - content: "\e117"; + content: "\e117"; } + .glyphicon-folder-open:before { - content: "\e118"; + content: "\e118"; } + .glyphicon-resize-vertical:before { - content: "\e119"; + content: "\e119"; } + .glyphicon-resize-horizontal:before { - content: "\e120"; + content: "\e120"; } + .glyphicon-hdd:before { - content: "\e121"; + content: "\e121"; } + .glyphicon-bullhorn:before { - content: "\e122"; + content: "\e122"; } + .glyphicon-bell:before { - content: "\e123"; + content: "\e123"; } + .glyphicon-certificate:before { - content: "\e124"; + content: "\e124"; } + .glyphicon-thumbs-up:before { - content: "\e125"; + content: "\e125"; } + .glyphicon-thumbs-down:before { - content: "\e126"; + content: "\e126"; } + .glyphicon-hand-right:before { - content: "\e127"; + content: "\e127"; } + .glyphicon-hand-left:before { - content: "\e128"; + content: "\e128"; } + .glyphicon-hand-up:before { - content: "\e129"; + content: "\e129"; } + .glyphicon-hand-down:before { - content: "\e130"; + content: "\e130"; } + .glyphicon-circle-arrow-right:before { - content: "\e131"; + content: "\e131"; } + .glyphicon-circle-arrow-left:before { - content: "\e132"; + content: "\e132"; } + .glyphicon-circle-arrow-up:before { - content: "\e133"; + content: "\e133"; } + .glyphicon-circle-arrow-down:before { - content: "\e134"; + content: "\e134"; } + .glyphicon-globe:before { - content: "\e135"; + content: "\e135"; } + .glyphicon-wrench:before { - content: "\e136"; + content: "\e136"; } + .glyphicon-tasks:before { - content: "\e137"; + content: "\e137"; } + .glyphicon-filter:before { - content: "\e138"; + content: "\e138"; } + .glyphicon-briefcase:before { - content: "\e139"; + content: "\e139"; } + .glyphicon-fullscreen:before { - content: "\e140"; + content: "\e140"; } + .glyphicon-dashboard:before { - content: "\e141"; + content: "\e141"; } + .glyphicon-paperclip:before { - content: "\e142"; + content: "\e142"; } + .glyphicon-heart-empty:before { - content: "\e143"; + content: "\e143"; } + .glyphicon-link:before { - content: "\e144"; + content: "\e144"; } + .glyphicon-phone:before { - content: "\e145"; + content: "\e145"; } + .glyphicon-pushpin:before { - content: "\e146"; + content: "\e146"; } + .glyphicon-usd:before { - content: "\e148"; + content: "\e148"; } + .glyphicon-gbp:before { - content: "\e149"; + content: "\e149"; } + .glyphicon-sort:before { - content: "\e150"; + content: "\e150"; } + .glyphicon-sort-by-alphabet:before { - content: "\e151"; + content: "\e151"; } + .glyphicon-sort-by-alphabet-alt:before { - content: "\e152"; + content: "\e152"; } + .glyphicon-sort-by-order:before { - content: "\e153"; + content: "\e153"; } + .glyphicon-sort-by-order-alt:before { - content: "\e154"; + content: "\e154"; } + .glyphicon-sort-by-attributes:before { - content: "\e155"; + content: "\e155"; } + .glyphicon-sort-by-attributes-alt:before { - content: "\e156"; + content: "\e156"; } + .glyphicon-unchecked:before { - content: "\e157"; + content: "\e157"; } + .glyphicon-expand:before { - content: "\e158"; + content: "\e158"; } + .glyphicon-collapse-down:before { - content: "\e159"; + content: "\e159"; } + .glyphicon-collapse-up:before { - content: "\e160"; + content: "\e160"; } + .glyphicon-log-in:before { - content: "\e161"; + content: "\e161"; } + .glyphicon-flash:before { - content: "\e162"; + content: "\e162"; } + .glyphicon-log-out:before { - content: "\e163"; + content: "\e163"; } + .glyphicon-new-window:before { - content: "\e164"; + content: "\e164"; } + .glyphicon-record:before { - content: "\e165"; + content: "\e165"; } + .glyphicon-save:before { - content: "\e166"; + content: "\e166"; } + .glyphicon-open:before { - content: "\e167"; + content: "\e167"; } + .glyphicon-saved:before { - content: "\e168"; + content: "\e168"; } + .glyphicon-import:before { - content: "\e169"; + content: "\e169"; } + .glyphicon-export:before { - content: "\e170"; + content: "\e170"; } + .glyphicon-send:before { - content: "\e171"; + content: "\e171"; } + .glyphicon-floppy-disk:before { - content: "\e172"; + content: "\e172"; } + .glyphicon-floppy-saved:before { - content: "\e173"; + content: "\e173"; } + .glyphicon-floppy-remove:before { - content: "\e174"; + content: "\e174"; } + .glyphicon-floppy-save:before { - content: "\e175"; + content: "\e175"; } + .glyphicon-floppy-open:before { - content: "\e176"; + content: "\e176"; } + .glyphicon-credit-card:before { - content: "\e177"; + content: "\e177"; } + .glyphicon-transfer:before { - content: "\e178"; + content: "\e178"; } + .glyphicon-cutlery:before { - content: "\e179"; + content: "\e179"; } + .glyphicon-header:before { - content: "\e180"; + content: "\e180"; } + .glyphicon-compressed:before { - content: "\e181"; + content: "\e181"; } + .glyphicon-earphone:before { - content: "\e182"; + content: "\e182"; } + .glyphicon-phone-alt:before { - content: "\e183"; + content: "\e183"; } + .glyphicon-tower:before { - content: "\e184"; + content: "\e184"; } + .glyphicon-stats:before { - content: "\e185"; + content: "\e185"; } + .glyphicon-sd-video:before { - content: "\e186"; + content: "\e186"; } + .glyphicon-hd-video:before { - content: "\e187"; + content: "\e187"; } + .glyphicon-subtitles:before { - content: "\e188"; + content: "\e188"; } + .glyphicon-sound-stereo:before { - content: "\e189"; + content: "\e189"; } + .glyphicon-sound-dolby:before { - content: "\e190"; + content: "\e190"; } + .glyphicon-sound-5-1:before { - content: "\e191"; + content: "\e191"; } + .glyphicon-sound-6-1:before { - content: "\e192"; + content: "\e192"; } + .glyphicon-sound-7-1:before { - content: "\e193"; + content: "\e193"; } + .glyphicon-copyright-mark:before { - content: "\e194"; + content: "\e194"; } + .glyphicon-registration-mark:before { - content: "\e195"; + content: "\e195"; } + .glyphicon-cloud-download:before { - content: "\e197"; + content: "\e197"; } + .glyphicon-cloud-upload:before { - content: "\e198"; + content: "\e198"; } + .glyphicon-tree-conifer:before { - content: "\e199"; + content: "\e199"; } + .glyphicon-tree-deciduous:before { - content: "\e200"; + content: "\e200"; } + .caret { - display: inline-block; - width: 0; - height: 0; - margin-left: 2px; - vertical-align: middle; - border-top: 4px solid; - border-right: 4px solid transparent; - border-left: 4px solid transparent; + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px solid; + border-right: 4px solid transparent; + border-left: 4px solid transparent; } + .dropdown { - position: relative; + position: relative; } + .dropdown-toggle:focus { - outline: 0; + outline: 0; } + .dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - display: none; - float: left; - min-width: 160px; - padding: 5px 0; - margin: 2px 0 0; - font-size: 14px; - list-style: none; - background-color: #fff; - background-clip: padding-box; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, .15); - border-radius: 4px; - -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175); - box-shadow: 0 6px 12px rgba(0, 0, 0, .175); + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + font-size: 14px; + list-style: none; + background-color: #fff; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, .15); + border-radius: 4px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175); + box-shadow: 0 6px 12px rgba(0, 0, 0, .175); } + .dropdown-menu.pull-right { - right: 0; - left: auto; + right: 0; + left: auto; } + .dropdown-menu .divider { - height: 1px; - margin: 9px 0; - overflow: hidden; - background-color: #e5e5e5; + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; } + .dropdown-menu > li > a { - display: block; - padding: 3px 20px; - clear: both; - font-weight: normal; - line-height: 1.42857143; - color: #333; - white-space: nowrap; + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.42857143; + color: #333; + white-space: nowrap; } + .dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus { - color: #262626; - text-decoration: none; - background-color: #f5f5f5; + color: #262626; + text-decoration: none; + background-color: #f5f5f5; } + .dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus { - color: #fff; - text-decoration: none; - background-color: #428bca; - outline: 0; + color: #fff; + text-decoration: none; + background-color: #428bca; + outline: 0; } + .dropdown-menu > .disabled > a, .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { - color: #999; + color: #999; } + .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { - text-decoration: none; - cursor: not-allowed; - background-color: transparent; - background-image: none; - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + text-decoration: none; + cursor: not-allowed; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); } + .open > .dropdown-menu { - display: block; + display: block; } + .open > a { - outline: 0; + outline: 0; } + .dropdown-menu-right { - right: 0; - left: auto; + right: 0; + left: auto; } + .dropdown-menu-left { - right: auto; - left: 0; + right: auto; + left: 0; } + .dropdown-header { - display: block; - padding: 3px 20px; - font-size: 12px; - line-height: 1.42857143; - color: #999; + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.42857143; + color: #999; } + .dropdown-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 990; + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 990; } + .pull-right > .dropdown-menu { - right: 0; - left: auto; + right: 0; + left: auto; } + .dropup .caret, .navbar-fixed-bottom .dropdown .caret { - content: ""; - border-top: 0; - border-bottom: 4px solid; + content: ""; + border-top: 0; + border-bottom: 4px solid; } + .dropup .dropdown-menu, .navbar-fixed-bottom .dropdown .dropdown-menu { - top: auto; - bottom: 100%; - margin-bottom: 1px; + top: auto; + bottom: 100%; + margin-bottom: 1px; } + @media (min-width: 768px) { - .navbar-right .dropdown-menu { - right: 0; - left: auto; - } - .navbar-right .dropdown-menu-left { - right: auto; - left: 0; - } + .navbar-right .dropdown-menu { + right: 0; + left: auto; + } + + .navbar-right .dropdown-menu-left { + right: auto; + left: 0; + } } + .btn-group, .btn-group-vertical { - position: relative; - display: inline-block; - vertical-align: middle; + position: relative; + display: inline-block; + vertical-align: middle; } + .btn-group > .btn, .btn-group-vertical > .btn { - position: relative; - float: left; + position: relative; + float: left; } + .btn-group > .btn:hover, .btn-group-vertical > .btn:hover, .btn-group > .btn:focus, @@ -3147,256 +3883,307 @@ input[type="button"].btn-block { .btn-group-vertical > .btn:active, .btn-group > .btn.active, .btn-group-vertical > .btn.active { - z-index: 2; + z-index: 2; } + .btn-group > .btn:focus, .btn-group-vertical > .btn:focus { - outline: none; + outline: none; } + .btn-group .btn + .btn, .btn-group .btn + .btn-group, .btn-group .btn-group + .btn, .btn-group .btn-group + .btn-group { - margin-left: -1px; + margin-left: -1px; } + .btn-toolbar { - margin-left: -5px; + margin-left: -5px; } + .btn-toolbar .btn-group, .btn-toolbar .input-group { - float: left; + float: left; } + .btn-toolbar > .btn, .btn-toolbar > .btn-group, .btn-toolbar > .input-group { - margin-left: 5px; + margin-left: 5px; } + .btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { - border-radius: 0; + border-radius: 0; } + .btn-group > .btn:first-child { - margin-left: 0; + margin-left: 0; } + .btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { - border-top-right-radius: 0; - border-bottom-right-radius: 0; + border-top-right-radius: 0; + border-bottom-right-radius: 0; } + .btn-group > .btn:last-child:not(:first-child), .btn-group > .dropdown-toggle:not(:first-child) { - border-top-left-radius: 0; - border-bottom-left-radius: 0; + border-top-left-radius: 0; + border-bottom-left-radius: 0; } + .btn-group > .btn-group { - float: left; + float: left; } + .btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { - border-radius: 0; + border-radius: 0; } + .btn-group > .btn-group:first-child > .btn:last-child, .btn-group > .btn-group:first-child > .dropdown-toggle { - border-top-right-radius: 0; - border-bottom-right-radius: 0; + border-top-right-radius: 0; + border-bottom-right-radius: 0; } + .btn-group > .btn-group:last-child > .btn:first-child { - border-top-left-radius: 0; - border-bottom-left-radius: 0; + border-top-left-radius: 0; + border-bottom-left-radius: 0; } + .btn-group .dropdown-toggle:active, .btn-group.open .dropdown-toggle { - outline: 0; + outline: 0; } + .btn-group > .btn + .dropdown-toggle { - padding-right: 8px; - padding-left: 8px; + padding-right: 8px; + padding-left: 8px; } + .btn-group > .btn-lg + .dropdown-toggle { - padding-right: 12px; - padding-left: 12px; + padding-right: 12px; + padding-left: 12px; } + .btn-group.open .dropdown-toggle { - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); } + .btn-group.open .dropdown-toggle.btn-link { - -webkit-box-shadow: none; - box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; } + .btn .caret { - margin-left: 0; + margin-left: 0; } + .btn-lg .caret { - border-width: 5px 5px 0; - border-bottom-width: 0; + border-width: 5px 5px 0; + border-bottom-width: 0; } + .dropup .btn-lg .caret { - border-width: 0 5px 5px; + border-width: 0 5px 5px; } + .btn-group-vertical > .btn, .btn-group-vertical > .btn-group, .btn-group-vertical > .btn-group > .btn { - display: block; - float: none; - width: 100%; - max-width: 100%; + display: block; + float: none; + width: 100%; + max-width: 100%; } + .btn-group-vertical > .btn-group > .btn { - float: none; + float: none; } + .btn-group-vertical > .btn + .btn, .btn-group-vertical > .btn + .btn-group, .btn-group-vertical > .btn-group + .btn, .btn-group-vertical > .btn-group + .btn-group { - margin-top: -1px; - margin-left: 0; + margin-top: -1px; + margin-left: 0; } + .btn-group-vertical > .btn:not(:first-child):not(:last-child) { - border-radius: 0; + border-radius: 0; } + .btn-group-vertical > .btn:first-child:not(:last-child) { - border-top-right-radius: 4px; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; } + .btn-group-vertical > .btn:last-child:not(:first-child) { - border-top-left-radius: 0; - border-top-right-radius: 0; - border-bottom-left-radius: 4px; + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-left-radius: 4px; } + .btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { - border-radius: 0; + border-radius: 0; } + .btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, .btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; } + .btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { - border-top-left-radius: 0; - border-top-right-radius: 0; + border-top-left-radius: 0; + border-top-right-radius: 0; } + .btn-group-justified { - display: table; - width: 100%; - table-layout: fixed; - border-collapse: separate; + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; } + .btn-group-justified > .btn, .btn-group-justified > .btn-group { - display: table-cell; - float: none; - width: 1%; + display: table-cell; + float: none; + width: 1%; } + .btn-group-justified > .btn-group .btn { - width: 100%; + width: 100%; } + [data-toggle="buttons"] > .btn > input[type="radio"], [data-toggle="buttons"] > .btn > input[type="checkbox"] { - display: none; + display: none; } + .input-group { - position: relative; - display: table; - border-collapse: separate; + position: relative; + display: table; + border-collapse: separate; } + .input-group[class*="col-"] { - float: none; - padding-right: 0; - padding-left: 0; + float: none; + padding-right: 0; + padding-left: 0; } + .input-group .form-control { - position: relative; - z-index: 2; - float: left; - width: 100%; - margin-bottom: 0; + position: relative; + z-index: 2; + float: left; + width: 100%; + margin-bottom: 0; } + .input-group-lg > .form-control, .input-group-lg > .input-group-addon, .input-group-lg > .input-group-btn > .btn { - height: 46px; - padding: 10px 16px; - font-size: 18px; - line-height: 1.33; - border-radius: 6px; + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.33; + border-radius: 6px; } + select.input-group-lg > .form-control, select.input-group-lg > .input-group-addon, select.input-group-lg > .input-group-btn > .btn { - height: 46px; - line-height: 46px; + height: 46px; + line-height: 46px; } + textarea.input-group-lg > .form-control, textarea.input-group-lg > .input-group-addon, textarea.input-group-lg > .input-group-btn > .btn, select[multiple].input-group-lg > .form-control, select[multiple].input-group-lg > .input-group-addon, select[multiple].input-group-lg > .input-group-btn > .btn { - height: auto; + height: auto; } + .input-group-sm > .form-control, .input-group-sm > .input-group-addon, .input-group-sm > .input-group-btn > .btn { - height: 30px; - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; } + select.input-group-sm > .form-control, select.input-group-sm > .input-group-addon, select.input-group-sm > .input-group-btn > .btn { - height: 30px; - line-height: 30px; + height: 30px; + line-height: 30px; } + textarea.input-group-sm > .form-control, textarea.input-group-sm > .input-group-addon, textarea.input-group-sm > .input-group-btn > .btn, select[multiple].input-group-sm > .form-control, select[multiple].input-group-sm > .input-group-addon, select[multiple].input-group-sm > .input-group-btn > .btn { - height: auto; + height: auto; } + .input-group-addon, .input-group-btn, .input-group .form-control { - display: table-cell; + display: table-cell; } + .input-group-addon:not(:first-child):not(:last-child), .input-group-btn:not(:first-child):not(:last-child), .input-group .form-control:not(:first-child):not(:last-child) { - border-radius: 0; + border-radius: 0; } + .input-group-addon, .input-group-btn { - width: 1%; - white-space: nowrap; - vertical-align: middle; + width: 1%; + white-space: nowrap; + vertical-align: middle; } + .input-group-addon { - padding: 6px 12px; - font-size: 14px; - font-weight: normal; - line-height: 1; - color: #555; - text-align: center; - background-color: #eee; - border: 1px solid #ccc; - border-radius: 4px; + padding: 6px 12px; + font-size: 14px; + font-weight: normal; + line-height: 1; + color: #555; + text-align: center; + background-color: #eee; + border: 1px solid #ccc; + border-radius: 4px; } + .input-group-addon.input-sm { - padding: 5px 10px; - font-size: 12px; - border-radius: 3px; + padding: 5px 10px; + font-size: 12px; + border-radius: 3px; } + .input-group-addon.input-lg { - padding: 10px 16px; - font-size: 18px; - border-radius: 6px; + padding: 10px 16px; + font-size: 18px; + border-radius: 6px; } + .input-group-addon input[type="radio"], .input-group-addon input[type="checkbox"] { - margin-top: 0; + margin-top: 0; } + .input-group .form-control:first-child, .input-group-addon:first-child, .input-group-btn:first-child > .btn, @@ -3404,12 +4191,14 @@ select[multiple].input-group-sm > .input-group-btn > .btn { .input-group-btn:first-child > .dropdown-toggle, .input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), .input-group-btn:last-child > .btn-group:not(:last-child) > .btn { - border-top-right-radius: 0; - border-bottom-right-radius: 0; + border-top-right-radius: 0; + border-bottom-right-radius: 0; } + .input-group-addon:first-child { - border-right: 0; + border-right: 0; } + .input-group .form-control:last-child, .input-group-addon:last-child, .input-group-btn:last-child > .btn, @@ -3417,1407 +4206,1704 @@ select[multiple].input-group-sm > .input-group-btn > .btn { .input-group-btn:last-child > .dropdown-toggle, .input-group-btn:first-child > .btn:not(:first-child), .input-group-btn:first-child > .btn-group:not(:first-child) > .btn { - border-top-left-radius: 0; - border-bottom-left-radius: 0; + border-top-left-radius: 0; + border-bottom-left-radius: 0; } + .input-group-addon:last-child { - border-left: 0; + border-left: 0; } + .input-group-btn { - position: relative; - font-size: 0; - white-space: nowrap; + position: relative; + font-size: 0; + white-space: nowrap; } + .input-group-btn > .btn { - position: relative; + position: relative; } + .input-group-btn > .btn + .btn { - margin-left: -1px; + margin-left: -1px; } + .input-group-btn > .btn:hover, .input-group-btn > .btn:focus, .input-group-btn > .btn:active { - z-index: 2; + z-index: 2; } + .input-group-btn:first-child > .btn, .input-group-btn:first-child > .btn-group { - margin-right: -1px; + margin-right: -1px; } + .input-group-btn:last-child > .btn, .input-group-btn:last-child > .btn-group { - margin-left: -1px; + margin-left: -1px; } + .nav { - padding-left: 0; - margin-bottom: 0; - list-style: none; + padding-left: 0; + margin-bottom: 0; + list-style: none; } + .nav > li { - position: relative; - display: block; + position: relative; + display: block; } + .nav > li > a { - position: relative; - display: block; - padding: 10px 15px; + position: relative; + display: block; + padding: 10px 15px; } + .nav > li > a:hover, .nav > li > a:focus { - text-decoration: none; - background-color: #eee; + text-decoration: none; + background-color: #eee; } + .nav > li.disabled > a { - color: #999; + color: #999; } + .nav > li.disabled > a:hover, .nav > li.disabled > a:focus { - color: #999; - text-decoration: none; - cursor: not-allowed; - background-color: transparent; + color: #999; + text-decoration: none; + cursor: not-allowed; + background-color: transparent; } + .nav .open > a, .nav .open > a:hover, .nav .open > a:focus { - background-color: #eee; - border-color: #428bca; + background-color: #eee; + border-color: #428bca; } + .nav .nav-divider { - height: 1px; - margin: 9px 0; - overflow: hidden; - background-color: #e5e5e5; + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; } + .nav > li > a > img { - max-width: none; + max-width: none; } + .nav-tabs { - border-bottom: 1px solid #ddd; + border-bottom: 1px solid #ddd; } + .nav-tabs > li { - float: left; - margin-bottom: -1px; + float: left; + margin-bottom: -1px; } + .nav-tabs > li > a { - margin-right: 2px; - line-height: 1.42857143; - border: 1px solid transparent; - border-radius: 4px 4px 0 0; + margin-right: 2px; + line-height: 1.42857143; + border: 1px solid transparent; + border-radius: 4px 4px 0 0; } + .nav-tabs > li > a:hover { - border-color: #eee #eee #ddd; + border-color: #eee #eee #ddd; } + .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus { - color: #555; - cursor: default; - background-color: #fff; - border: 1px solid #ddd; - border-bottom-color: transparent; + color: #555; + cursor: default; + background-color: #fff; + border: 1px solid #ddd; + border-bottom-color: transparent; } + .nav-tabs.nav-justified { - width: 100%; - border-bottom: 0; + width: 100%; + border-bottom: 0; } + .nav-tabs.nav-justified > li { - float: none; + float: none; } + .nav-tabs.nav-justified > li > a { - margin-bottom: 5px; - text-align: center; + margin-bottom: 5px; + text-align: center; } + .nav-tabs.nav-justified > .dropdown .dropdown-menu { - top: auto; - left: auto; + top: auto; + left: auto; } + @media (min-width: 768px) { - .nav-tabs.nav-justified > li { - display: table-cell; - width: 1%; - } - .nav-tabs.nav-justified > li > a { - margin-bottom: 0; - } + .nav-tabs.nav-justified > li { + display: table-cell; + width: 1%; + } + + .nav-tabs.nav-justified > li > a { + margin-bottom: 0; + } } + .nav-tabs.nav-justified > li > a { - margin-right: 0; - border-radius: 4px; + margin-right: 0; + border-radius: 4px; } + .nav-tabs.nav-justified > .active > a, .nav-tabs.nav-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:focus { - border: 1px solid #ddd; + border: 1px solid #ddd; } + @media (min-width: 768px) { - .nav-tabs.nav-justified > li > a { - border-bottom: 1px solid #ddd; - border-radius: 4px 4px 0 0; - } - .nav-tabs.nav-justified > .active > a, - .nav-tabs.nav-justified > .active > a:hover, - .nav-tabs.nav-justified > .active > a:focus { - border-bottom-color: #fff; - } + .nav-tabs.nav-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; + } + + .nav-tabs.nav-justified > .active > a, + .nav-tabs.nav-justified > .active > a:hover, + .nav-tabs.nav-justified > .active > a:focus { + border-bottom-color: #fff; + } } + .nav-pills > li { - float: left; + float: left; } + .nav-pills > li > a { - border-radius: 4px; + border-radius: 4px; } + .nav-pills > li + li { - margin-left: 2px; + margin-left: 2px; } + .nav-pills > li.active > a, .nav-pills > li.active > a:hover, .nav-pills > li.active > a:focus { - color: #fff; - background-color: #428bca; + color: #fff; + background-color: #428bca; } + .nav-stacked > li { - float: none; + float: none; } + .nav-stacked > li + li { - margin-top: 2px; - margin-left: 0; + margin-top: 2px; + margin-left: 0; } + .nav-justified { - width: 100%; + width: 100%; } + .nav-justified > li { - float: none; + float: none; } + .nav-justified > li > a { - margin-bottom: 5px; - text-align: center; + margin-bottom: 5px; + text-align: center; } + .nav-justified > .dropdown .dropdown-menu { - top: auto; - left: auto; + top: auto; + left: auto; } + @media (min-width: 768px) { - .nav-justified > li { - display: table-cell; - width: 1%; - } - .nav-justified > li > a { - margin-bottom: 0; - } + .nav-justified > li { + display: table-cell; + width: 1%; + } + + .nav-justified > li > a { + margin-bottom: 0; + } } + .nav-tabs-justified { - border-bottom: 0; + border-bottom: 0; } + .nav-tabs-justified > li > a { - margin-right: 0; - border-radius: 4px; + margin-right: 0; + border-radius: 4px; } + .nav-tabs-justified > .active > a, .nav-tabs-justified > .active > a:hover, .nav-tabs-justified > .active > a:focus { - border: 1px solid #ddd; + border: 1px solid #ddd; } + @media (min-width: 768px) { - .nav-tabs-justified > li > a { - border-bottom: 1px solid #ddd; - border-radius: 4px 4px 0 0; - } - .nav-tabs-justified > .active > a, - .nav-tabs-justified > .active > a:hover, - .nav-tabs-justified > .active > a:focus { - border-bottom-color: #fff; - } + .nav-tabs-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; + } + + .nav-tabs-justified > .active > a, + .nav-tabs-justified > .active > a:hover, + .nav-tabs-justified > .active > a:focus { + border-bottom-color: #fff; + } } + .tab-content > .tab-pane { - display: none; + display: none; } + .tab-content > .active { - display: block; + display: block; } + .nav-tabs .dropdown-menu { - margin-top: -1px; - border-top-left-radius: 0; - border-top-right-radius: 0; + margin-top: -1px; + border-top-left-radius: 0; + border-top-right-radius: 0; } + .navbar { - position: relative; - min-height: 50px; - margin-bottom: 20px; - border: 1px solid transparent; + position: relative; + min-height: 50px; + margin-bottom: 20px; + border: 1px solid transparent; } + @media (min-width: 768px) { - .navbar { - border-radius: 4px; - } + .navbar { + border-radius: 4px; + } } + @media (min-width: 768px) { - .navbar-header { - float: left; - } + .navbar-header { + float: left; + } } + .navbar-collapse { - max-height: 340px; - padding-right: 15px; - padding-left: 15px; - overflow-x: visible; - -webkit-overflow-scrolling: touch; - border-top: 1px solid transparent; - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); + max-height: 340px; + padding-right: 15px; + padding-left: 15px; + overflow-x: visible; + -webkit-overflow-scrolling: touch; + border-top: 1px solid transparent; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); } + .navbar-collapse.in { - overflow-y: auto; + overflow-y: auto; } + @media (min-width: 768px) { - .navbar-collapse { - width: auto; - border-top: 0; - box-shadow: none; - } - .navbar-collapse.collapse { - display: block !important; - height: auto !important; - padding-bottom: 0; - overflow: visible !important; - } - .navbar-collapse.in { - overflow-y: visible; - } - .navbar-fixed-top .navbar-collapse, - .navbar-static-top .navbar-collapse, - .navbar-fixed-bottom .navbar-collapse { - padding-right: 0; - padding-left: 0; - } + .navbar-collapse { + width: auto; + border-top: 0; + box-shadow: none; + } + + .navbar-collapse.collapse { + display: block !important; + height: auto !important; + padding-bottom: 0; + overflow: visible !important; + } + + .navbar-collapse.in { + overflow-y: visible; + } + + .navbar-fixed-top .navbar-collapse, + .navbar-static-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + padding-right: 0; + padding-left: 0; + } } + .container > .navbar-header, .container-fluid > .navbar-header, .container > .navbar-collapse, .container-fluid > .navbar-collapse { - margin-right: -15px; - margin-left: -15px; + margin-right: -15px; + margin-left: -15px; } + @media (min-width: 768px) { - .container > .navbar-header, - .container-fluid > .navbar-header, - .container > .navbar-collapse, - .container-fluid > .navbar-collapse { - margin-right: 0; - margin-left: 0; - } + .container > .navbar-header, + .container-fluid > .navbar-header, + .container > .navbar-collapse, + .container-fluid > .navbar-collapse { + margin-right: 0; + margin-left: 0; + } } + .navbar-static-top { - z-index: 1000; - border-width: 0 0 1px; + z-index: 1000; + border-width: 0 0 1px; } + @media (min-width: 768px) { - .navbar-static-top { - border-radius: 0; - } + .navbar-static-top { + border-radius: 0; + } } + .navbar-fixed-top, .navbar-fixed-bottom { - position: fixed; - right: 0; - left: 0; - z-index: 1030; + position: fixed; + right: 0; + left: 0; + z-index: 1030; } + @media (min-width: 768px) { - .navbar-fixed-top, - .navbar-fixed-bottom { - border-radius: 0; - } + .navbar-fixed-top, + .navbar-fixed-bottom { + border-radius: 0; + } } + .navbar-fixed-top { - top: 0; - border-width: 0 0 1px; + top: 0; + border-width: 0 0 1px; } + .navbar-fixed-bottom { - bottom: 0; - margin-bottom: 0; - border-width: 1px 0 0; + bottom: 0; + margin-bottom: 0; + border-width: 1px 0 0; } + .navbar-brand { - float: left; - height: 50px; - padding: 15px 15px; - font-size: 18px; - line-height: 20px; + float: left; + height: 50px; + padding: 15px 15px; + font-size: 18px; + line-height: 20px; } + .navbar-brand:hover, .navbar-brand:focus { - text-decoration: none; + text-decoration: none; } + @media (min-width: 768px) { - .navbar > .container .navbar-brand, - .navbar > .container-fluid .navbar-brand { - margin-left: -15px; - } + .navbar > .container .navbar-brand, + .navbar > .container-fluid .navbar-brand { + margin-left: -15px; + } } + .navbar-toggle { - position: relative; - float: right; - padding: 9px 10px; - margin-top: 8px; - margin-right: 15px; - margin-bottom: 8px; - background-color: transparent; - background-image: none; - border: 1px solid transparent; - border-radius: 4px; + position: relative; + float: right; + padding: 9px 10px; + margin-top: 8px; + margin-right: 15px; + margin-bottom: 8px; + background-color: transparent; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; } + .navbar-toggle:focus { - outline: none; + outline: none; } + .navbar-toggle .icon-bar { - display: block; - width: 22px; - height: 2px; - border-radius: 1px; + display: block; + width: 22px; + height: 2px; + border-radius: 1px; } + .navbar-toggle .icon-bar + .icon-bar { - margin-top: 4px; + margin-top: 4px; } + @media (min-width: 768px) { - .navbar-toggle { - display: none; - } + .navbar-toggle { + display: none; + } } + .navbar-nav { - margin: 7.5px -15px; + margin: 7.5px -15px; } + .navbar-nav > li > a { - padding-top: 10px; - padding-bottom: 10px; - line-height: 20px; + padding-top: 10px; + padding-bottom: 10px; + line-height: 20px; } + @media (max-width: 767px) { - .navbar-nav .open .dropdown-menu { - position: static; - float: none; - width: auto; - margin-top: 0; - background-color: transparent; - border: 0; - box-shadow: none; - } - .navbar-nav .open .dropdown-menu > li > a, - .navbar-nav .open .dropdown-menu .dropdown-header { - padding: 5px 15px 5px 25px; - } - .navbar-nav .open .dropdown-menu > li > a { - line-height: 20px; - } - .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-nav .open .dropdown-menu > li > a:focus { - background-image: none; - } + .navbar-nav .open .dropdown-menu { + position: static; + float: none; + width: auto; + margin-top: 0; + background-color: transparent; + border: 0; + box-shadow: none; + } + + .navbar-nav .open .dropdown-menu > li > a, + .navbar-nav .open .dropdown-menu .dropdown-header { + padding: 5px 15px 5px 25px; + } + + .navbar-nav .open .dropdown-menu > li > a { + line-height: 20px; + } + + .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-nav .open .dropdown-menu > li > a:focus { + background-image: none; + } } + @media (min-width: 768px) { - .navbar-nav { - float: left; - margin: 0; - } - .navbar-nav > li { - float: left; - } - .navbar-nav > li > a { - padding-top: 15px; - padding-bottom: 15px; - } - .navbar-nav.navbar-right:last-child { - margin-right: -15px; - } + .navbar-nav { + float: left; + margin: 0; + } + + .navbar-nav > li { + float: left; + } + + .navbar-nav > li > a { + padding-top: 15px; + padding-bottom: 15px; + } + + .navbar-nav.navbar-right:last-child { + margin-right: -15px; + } } + @media (min-width: 768px) { - .navbar-left { - float: left !important; - } - .navbar-right { - float: right !important; - } + .navbar-left { + float: left !important; + } + + .navbar-right { + float: right !important; + } } + .navbar-form { - padding: 10px 15px; - margin-top: 8px; - margin-right: -15px; - margin-bottom: 8px; - margin-left: -15px; - border-top: 1px solid transparent; - border-bottom: 1px solid transparent; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); + padding: 10px 15px; + margin-top: 8px; + margin-right: -15px; + margin-bottom: 8px; + margin-left: -15px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); } + @media (min-width: 768px) { - .navbar-form .form-group { - display: inline-block; - margin-bottom: 0; - vertical-align: middle; - } - .navbar-form .form-control { - display: inline-block; - width: auto; - vertical-align: middle; - } - .navbar-form .input-group > .form-control { - width: 100%; - } - .navbar-form .control-label { - margin-bottom: 0; - vertical-align: middle; - } - .navbar-form .radio, - .navbar-form .checkbox { - display: inline-block; - padding-left: 0; - margin-top: 0; - margin-bottom: 0; - vertical-align: middle; - } - .navbar-form .radio input[type="radio"], - .navbar-form .checkbox input[type="checkbox"] { - float: none; - margin-left: 0; - } - .navbar-form .has-feedback .form-control-feedback { - top: 0; - } + .navbar-form .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + + .navbar-form .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + + .navbar-form .input-group > .form-control { + width: 100%; + } + + .navbar-form .control-label { + margin-bottom: 0; + vertical-align: middle; + } + + .navbar-form .radio, + .navbar-form .checkbox { + display: inline-block; + padding-left: 0; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + + .navbar-form .radio input[type="radio"], + .navbar-form .checkbox input[type="checkbox"] { + float: none; + margin-left: 0; + } + + .navbar-form .has-feedback .form-control-feedback { + top: 0; + } } + @media (max-width: 767px) { - .navbar-form .form-group { - margin-bottom: 5px; - } + .navbar-form .form-group { + margin-bottom: 5px; + } } + @media (min-width: 768px) { - .navbar-form { - width: auto; - padding-top: 0; - padding-bottom: 0; - margin-right: 0; - margin-left: 0; - border: 0; - -webkit-box-shadow: none; - box-shadow: none; - } - .navbar-form.navbar-right:last-child { - margin-right: -15px; - } + .navbar-form { + width: auto; + padding-top: 0; + padding-bottom: 0; + margin-right: 0; + margin-left: 0; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + + .navbar-form.navbar-right:last-child { + margin-right: -15px; + } } + .navbar-nav > li > .dropdown-menu { - margin-top: 0; - border-top-left-radius: 0; - border-top-right-radius: 0; + margin-top: 0; + border-top-left-radius: 0; + border-top-right-radius: 0; } + .navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; } + .navbar-btn { - margin-top: 8px; - margin-bottom: 8px; + margin-top: 8px; + margin-bottom: 8px; } + .navbar-btn.btn-sm { - margin-top: 10px; - margin-bottom: 10px; + margin-top: 10px; + margin-bottom: 10px; } + .navbar-btn.btn-xs { - margin-top: 14px; - margin-bottom: 14px; + margin-top: 14px; + margin-bottom: 14px; } + .navbar-text { - margin-top: 15px; - margin-bottom: 15px; + margin-top: 15px; + margin-bottom: 15px; } + @media (min-width: 768px) { - .navbar-text { - float: left; - margin-right: 15px; - margin-left: 15px; - } - .navbar-text.navbar-right:last-child { - margin-right: 0; - } + .navbar-text { + float: left; + margin-right: 15px; + margin-left: 15px; + } + + .navbar-text.navbar-right:last-child { + margin-right: 0; + } } + .navbar-default { - background-color: #f8f8f8; - border-color: #e7e7e7; + background-color: #f8f8f8; + border-color: #e7e7e7; } + .navbar-default .navbar-brand { - color: #777; + color: #777; } + .navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus { - color: #5e5e5e; - background-color: transparent; + color: #5e5e5e; + background-color: transparent; } + .navbar-default .navbar-text { - color: #777; + color: #777; } + .navbar-default .navbar-nav > li > a { - color: #777; + color: #777; } + .navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus { - color: #333; - background-color: transparent; + color: #333; + background-color: transparent; } + .navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus { - color: #555; - background-color: #e7e7e7; + color: #555; + background-color: #e7e7e7; } + .navbar-default .navbar-nav > .disabled > a, .navbar-default .navbar-nav > .disabled > a:hover, .navbar-default .navbar-nav > .disabled > a:focus { - color: #ccc; - background-color: transparent; + color: #ccc; + background-color: transparent; } + .navbar-default .navbar-toggle { - border-color: #ddd; + border-color: #ddd; } + .navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus { - background-color: #ddd; + background-color: #ddd; } + .navbar-default .navbar-toggle .icon-bar { - background-color: #888; + background-color: #888; } + .navbar-default .navbar-collapse, .navbar-default .navbar-form { - border-color: #e7e7e7; + border-color: #e7e7e7; } + .navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus { - color: #555; - background-color: #e7e7e7; + color: #555; + background-color: #e7e7e7; } + @media (max-width: 767px) { - .navbar-default .navbar-nav .open .dropdown-menu > li > a { - color: #777; - } - .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { - color: #333; - background-color: transparent; - } - .navbar-default .navbar-nav .open .dropdown-menu > .active > a, - .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #555; - background-color: #e7e7e7; - } - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #ccc; - background-color: transparent; - } + .navbar-default .navbar-nav .open .dropdown-menu > li > a { + color: #777; + } + + .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { + color: #333; + background-color: transparent; + } + + .navbar-default .navbar-nav .open .dropdown-menu > .active > a, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #555; + background-color: #e7e7e7; + } + + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #ccc; + background-color: transparent; + } } + .navbar-default .navbar-link { - color: #777; + color: #777; } + .navbar-default .navbar-link:hover { - color: #333; + color: #333; } + .navbar-inverse { - background-color: #222; - border-color: #080808; + background-color: #222; + border-color: #080808; } + .navbar-inverse .navbar-brand { - color: #999; + color: #999; } + .navbar-inverse .navbar-brand:hover, .navbar-inverse .navbar-brand:focus { - color: #fff; - background-color: transparent; + color: #fff; + background-color: transparent; } + .navbar-inverse .navbar-text { - color: #999; + color: #999; } + .navbar-inverse .navbar-nav > li > a { - color: #999; + color: #999; } + .navbar-inverse .navbar-nav > li > a:hover, .navbar-inverse .navbar-nav > li > a:focus { - color: #fff; - background-color: transparent; + color: #fff; + background-color: transparent; } + .navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus { - color: #fff; - background-color: #080808; + color: #fff; + background-color: #080808; } + .navbar-inverse .navbar-nav > .disabled > a, .navbar-inverse .navbar-nav > .disabled > a:hover, .navbar-inverse .navbar-nav > .disabled > a:focus { - color: #444; - background-color: transparent; + color: #444; + background-color: transparent; } + .navbar-inverse .navbar-toggle { - border-color: #333; + border-color: #333; } + .navbar-inverse .navbar-toggle:hover, .navbar-inverse .navbar-toggle:focus { - background-color: #333; + background-color: #333; } + .navbar-inverse .navbar-toggle .icon-bar { - background-color: #fff; + background-color: #fff; } + .navbar-inverse .navbar-collapse, .navbar-inverse .navbar-form { - border-color: #101010; + border-color: #101010; } + .navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus { - color: #fff; - background-color: #080808; + color: #fff; + background-color: #080808; } + @media (max-width: 767px) { - .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { - border-color: #080808; - } - .navbar-inverse .navbar-nav .open .dropdown-menu .divider { - background-color: #080808; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { - color: #999; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { - color: #fff; - background-color: transparent; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #fff; - background-color: #080808; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #444; - background-color: transparent; - } + .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { + border-color: #080808; + } + + .navbar-inverse .navbar-nav .open .dropdown-menu .divider { + background-color: #080808; + } + + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { + color: #999; + } + + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { + color: #fff; + background-color: transparent; + } + + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #fff; + background-color: #080808; + } + + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #444; + background-color: transparent; + } } + .navbar-inverse .navbar-link { - color: #999; + color: #999; } + .navbar-inverse .navbar-link:hover { - color: #fff; + color: #fff; } + .breadcrumb { - padding: 8px 15px; - margin-bottom: 20px; - list-style: none; - background-color: #f5f5f5; - border-radius: 4px; + padding: 8px 15px; + margin-bottom: 20px; + list-style: none; + background-color: #f5f5f5; + border-radius: 4px; } + .breadcrumb > li { - display: inline-block; + display: inline-block; } + .breadcrumb > li + li:before { - padding: 0 5px; - color: #ccc; - content: "/\00a0"; + padding: 0 5px; + color: #ccc; + content: "/\00a0"; } + .breadcrumb > .active { - color: #999; + color: #999; } + .pagination { - display: inline-block; - padding-left: 0; - margin: 20px 0; - border-radius: 4px; + display: inline-block; + padding-left: 0; + margin: 20px 0; + border-radius: 4px; } + .pagination > li { - display: inline; + display: inline; } + .pagination > li > a, .pagination > li > span { - position: relative; - float: left; - padding: 6px 12px; - margin-left: -1px; - line-height: 1.42857143; - color: #428bca; - text-decoration: none; - background-color: #fff; - border: 1px solid #ddd; + position: relative; + float: left; + padding: 6px 12px; + margin-left: -1px; + line-height: 1.42857143; + color: #428bca; + text-decoration: none; + background-color: #fff; + border: 1px solid #ddd; } + .pagination > li:first-child > a, .pagination > li:first-child > span { - margin-left: 0; - border-top-left-radius: 4px; - border-bottom-left-radius: 4px; + margin-left: 0; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; } + .pagination > li:last-child > a, .pagination > li:last-child > span { - border-top-right-radius: 4px; - border-bottom-right-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; } + .pagination > li > a:hover, .pagination > li > span:hover, .pagination > li > a:focus, .pagination > li > span:focus { - color: #2a6496; - background-color: #eee; - border-color: #ddd; + color: #2a6496; + background-color: #eee; + border-color: #ddd; } + .pagination > .active > a, .pagination > .active > span, .pagination > .active > a:hover, .pagination > .active > span:hover, .pagination > .active > a:focus, .pagination > .active > span:focus { - z-index: 2; - color: #fff; - cursor: default; - background-color: #428bca; - border-color: #428bca; + z-index: 2; + color: #fff; + cursor: default; + background-color: #428bca; + border-color: #428bca; } + .pagination > .disabled > span, .pagination > .disabled > span:hover, .pagination > .disabled > span:focus, .pagination > .disabled > a, .pagination > .disabled > a:hover, .pagination > .disabled > a:focus { - color: #999; - cursor: not-allowed; - background-color: #fff; - border-color: #ddd; + color: #999; + cursor: not-allowed; + background-color: #fff; + border-color: #ddd; } + .pagination-lg > li > a, .pagination-lg > li > span { - padding: 10px 16px; - font-size: 18px; + padding: 10px 16px; + font-size: 18px; } + .pagination-lg > li:first-child > a, .pagination-lg > li:first-child > span { - border-top-left-radius: 6px; - border-bottom-left-radius: 6px; + border-top-left-radius: 6px; + border-bottom-left-radius: 6px; } + .pagination-lg > li:last-child > a, .pagination-lg > li:last-child > span { - border-top-right-radius: 6px; - border-bottom-right-radius: 6px; + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; } + .pagination-sm > li > a, .pagination-sm > li > span { - padding: 5px 10px; - font-size: 12px; + padding: 5px 10px; + font-size: 12px; } + .pagination-sm > li:first-child > a, .pagination-sm > li:first-child > span { - border-top-left-radius: 3px; - border-bottom-left-radius: 3px; + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; } + .pagination-sm > li:last-child > a, .pagination-sm > li:last-child > span { - border-top-right-radius: 3px; - border-bottom-right-radius: 3px; + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; } + .pager { - padding-left: 0; - margin: 20px 0; - text-align: center; - list-style: none; + padding-left: 0; + margin: 20px 0; + text-align: center; + list-style: none; } + .pager li { - display: inline; + display: inline; } + .pager li > a, .pager li > span { - display: inline-block; - padding: 5px 14px; - background-color: #fff; - border: 1px solid #ddd; - border-radius: 15px; + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 15px; } + .pager li > a:hover, .pager li > a:focus { - text-decoration: none; - background-color: #eee; + text-decoration: none; + background-color: #eee; } + .pager .next > a, .pager .next > span { - float: right; + float: right; } + .pager .previous > a, .pager .previous > span { - float: left; + float: left; } + .pager .disabled > a, .pager .disabled > a:hover, .pager .disabled > a:focus, .pager .disabled > span { - color: #999; - cursor: not-allowed; - background-color: #fff; + color: #999; + cursor: not-allowed; + background-color: #fff; } + .label { - display: inline; - padding: .2em .6em .3em; - font-size: 75%; - font-weight: bold; - line-height: 1; - color: #fff; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - border-radius: .25em; + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; } + .label[href]:hover, .label[href]:focus { - color: #fff; - text-decoration: none; - cursor: pointer; + color: #fff; + text-decoration: none; + cursor: pointer; } + .label:empty { - display: none; + display: none; } + .btn .label { - position: relative; - top: -1px; + position: relative; + top: -1px; } + .label-default { - background-color: #999; + background-color: #999; } + .label-default[href]:hover, .label-default[href]:focus { - background-color: #808080; + background-color: #808080; } + .label-primary { - background-color: #428bca; + background-color: #428bca; } + .label-primary[href]:hover, .label-primary[href]:focus { - background-color: #3071a9; + background-color: #3071a9; } + .label-success { - background-color: #5cb85c; + background-color: #5cb85c; } + .label-success[href]:hover, .label-success[href]:focus { - background-color: #449d44; + background-color: #449d44; } + .label-info { - background-color: #5bc0de; + background-color: #5bc0de; } + .label-info[href]:hover, .label-info[href]:focus { - background-color: #31b0d5; + background-color: #31b0d5; } + .label-warning { - background-color: #f0ad4e; + background-color: #f0ad4e; } + .label-warning[href]:hover, .label-warning[href]:focus { - background-color: #ec971f; + background-color: #ec971f; } + .label-danger { - background-color: #d9534f; + background-color: #d9534f; } + .label-danger[href]:hover, .label-danger[href]:focus { - background-color: #c9302c; + background-color: #c9302c; } + .badge { - display: inline-block; - min-width: 10px; - padding: 3px 7px; - font-size: 12px; - font-weight: bold; - line-height: 1; - color: #fff; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - background-color: #999; - border-radius: 10px; + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: 12px; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + background-color: #999; + border-radius: 10px; } + .badge:empty { - display: none; + display: none; } + .btn .badge { - position: relative; - top: -1px; + position: relative; + top: -1px; } + .btn-xs .badge { - top: 0; - padding: 1px 5px; + top: 0; + padding: 1px 5px; } + a.badge:hover, a.badge:focus { - color: #fff; - text-decoration: none; - cursor: pointer; + color: #fff; + text-decoration: none; + cursor: pointer; } + a.list-group-item.active > .badge, .nav-pills > .active > a > .badge { - color: #428bca; - background-color: #fff; + color: #428bca; + background-color: #fff; } + .nav-pills > li > a > .badge { - margin-left: 3px; + margin-left: 3px; } + .jumbotron { - padding: 30px; - margin-bottom: 30px; - color: inherit; - background-color: #eee; + padding: 30px; + margin-bottom: 30px; + color: inherit; + background-color: #eee; } + .jumbotron h1, .jumbotron .h1 { - color: inherit; + color: inherit; } + .jumbotron p { - margin-bottom: 15px; - font-size: 21px; - font-weight: 200; + margin-bottom: 15px; + font-size: 21px; + font-weight: 200; } + .container .jumbotron { - border-radius: 6px; + border-radius: 6px; } + .jumbotron .container { - max-width: 100%; + max-width: 100%; } + @media screen and (min-width: 768px) { - .jumbotron { - padding-top: 48px; - padding-bottom: 48px; - } - .container .jumbotron { - padding-right: 60px; - padding-left: 60px; - } - .jumbotron h1, - .jumbotron .h1 { - font-size: 63px; - } + .jumbotron { + padding-top: 48px; + padding-bottom: 48px; + } + + .container .jumbotron { + padding-right: 60px; + padding-left: 60px; + } + + .jumbotron h1, + .jumbotron .h1 { + font-size: 63px; + } } + .thumbnail { - display: block; - padding: 4px; - margin-bottom: 20px; - line-height: 1.42857143; - background-color: #fff; - border: 1px solid #ddd; - border-radius: 4px; - -webkit-transition: all .2s ease-in-out; - transition: all .2s ease-in-out; + display: block; + padding: 4px; + margin-bottom: 20px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: all .2s ease-in-out; + transition: all .2s ease-in-out; } + .thumbnail > img, .thumbnail a > img { - margin-right: auto; - margin-left: auto; + margin-right: auto; + margin-left: auto; } + a.thumbnail:hover, a.thumbnail:focus, a.thumbnail.active { - border-color: #428bca; + border-color: #428bca; } + .thumbnail .caption { - padding: 9px; - color: #333; + padding: 9px; + color: #333; } + .alert { - padding: 15px; - margin-bottom: 20px; - border: 1px solid transparent; - border-radius: 4px; + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 4px; } + .alert h4 { - margin-top: 0; - color: inherit; + margin-top: 0; + color: inherit; } + .alert .alert-link { - font-weight: bold; + font-weight: bold; } + .alert > p, .alert > ul { - margin-bottom: 0; + margin-bottom: 0; } + .alert > p + p { - margin-top: 5px; + margin-top: 5px; } + .alert-dismissable { - padding-right: 35px; + padding-right: 35px; } + .alert-dismissable .close { - position: relative; - top: -2px; - right: -21px; - color: inherit; + position: relative; + top: -2px; + right: -21px; + color: inherit; } + .alert-success { - color: #3c763d; - background-color: #dff0d8; - border-color: #d6e9c6; + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; } + .alert-success hr { - border-top-color: #c9e2b3; + border-top-color: #c9e2b3; } + .alert-success .alert-link { - color: #2b542c; + color: #2b542c; } + .alert-info { - color: #31708f; - background-color: #d9edf7; - border-color: #bce8f1; + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; } + .alert-info hr { - border-top-color: #a6e1ec; + border-top-color: #a6e1ec; } + .alert-info .alert-link { - color: #245269; + color: #245269; } + .alert-warning { - color: #8a6d3b; - background-color: #fcf8e3; - border-color: #faebcc; + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; } + .alert-warning hr { - border-top-color: #f7e1b5; + border-top-color: #f7e1b5; } + .alert-warning .alert-link { - color: #66512c; + color: #66512c; } + .alert-danger { - color: #a94442; - background-color: #f2dede; - border-color: #ebccd1; + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; } + .alert-danger hr { - border-top-color: #e4b9c0; + border-top-color: #e4b9c0; } + .alert-danger .alert-link { - color: #843534; + color: #843534; } + @-webkit-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } } + @keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } } + .progress { - height: 20px; - margin-bottom: 20px; - overflow: hidden; - background-color: #f5f5f5; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); + height: 20px; + margin-bottom: 20px; + overflow: hidden; + background-color: #f5f5f5; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); } + .progress-bar { - float: left; - width: 0; - height: 100%; - font-size: 12px; - line-height: 20px; - color: #fff; - text-align: center; - background-color: #428bca; - -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); - -webkit-transition: width .6s ease; - transition: width .6s ease; + float: left; + width: 0; + height: 100%; + font-size: 12px; + line-height: 20px; + color: #fff; + text-align: center; + background-color: #428bca; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); + -webkit-transition: width .6s ease; + transition: width .6s ease; } + .progress-striped .progress-bar { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-size: 40px 40px; + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-size: 40px 40px; } + .progress.active .progress-bar { - -webkit-animation: progress-bar-stripes 2s linear infinite; - animation: progress-bar-stripes 2s linear infinite; + -webkit-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; } + .progress-bar-success { - background-color: #5cb85c; + background-color: #5cb85c; } + .progress-striped .progress-bar-success { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); } + .progress-bar-info { - background-color: #5bc0de; + background-color: #5bc0de; } + .progress-striped .progress-bar-info { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); } + .progress-bar-warning { - background-color: #f0ad4e; + background-color: #f0ad4e; } + .progress-striped .progress-bar-warning { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); } + .progress-bar-danger { - background-color: #d9534f; + background-color: #d9534f; } + .progress-striped .progress-bar-danger { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); } + .media, .media-body { - overflow: hidden; - zoom: 1; + overflow: hidden; + zoom: 1; } + .media, .media .media { - margin-top: 15px; + margin-top: 15px; } + .media:first-child { - margin-top: 0; + margin-top: 0; } + .media-object { - display: block; + display: block; } + .media-heading { - margin: 0 0 5px; + margin: 0 0 5px; } + .media > .pull-left { - margin-right: 10px; + margin-right: 10px; } + .media > .pull-right { - margin-left: 10px; + margin-left: 10px; } + .media-list { - padding-left: 0; - list-style: none; + padding-left: 0; + list-style: none; } + .list-group { - padding-left: 0; - margin-bottom: 20px; + padding-left: 0; + margin-bottom: 20px; } + .list-group-item { - position: relative; - display: block; - padding: 10px 15px; - margin-bottom: -1px; - background-color: #fff; - border: 1px solid #ddd; + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: #fff; + border: 1px solid #ddd; } + .list-group-item:first-child { - border-top-left-radius: 4px; - border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; } + .list-group-item:last-child { - margin-bottom: 0; - border-bottom-right-radius: 4px; - border-bottom-left-radius: 4px; + margin-bottom: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; } + .list-group-item > .badge { - float: right; + float: right; } + .list-group-item > .badge + .badge { - margin-right: 5px; + margin-right: 5px; } + a.list-group-item { - color: #555; + color: #555; } + a.list-group-item .list-group-item-heading { - color: #333; + color: #333; } + a.list-group-item:hover, a.list-group-item:focus { - text-decoration: none; - background-color: #f5f5f5; + text-decoration: none; + background-color: #f5f5f5; } + a.list-group-item.active, a.list-group-item.active:hover, a.list-group-item.active:focus { - z-index: 2; - color: #fff; - background-color: #428bca; - border-color: #428bca; + z-index: 2; + color: #fff; + background-color: #428bca; + border-color: #428bca; } + a.list-group-item.active .list-group-item-heading, a.list-group-item.active:hover .list-group-item-heading, a.list-group-item.active:focus .list-group-item-heading { - color: inherit; + color: inherit; } + a.list-group-item.active .list-group-item-text, a.list-group-item.active:hover .list-group-item-text, a.list-group-item.active:focus .list-group-item-text { - color: #e1edf7; + color: #e1edf7; } + .list-group-item-success { - color: #3c763d; - background-color: #dff0d8; + color: #3c763d; + background-color: #dff0d8; } + a.list-group-item-success { - color: #3c763d; + color: #3c763d; } + a.list-group-item-success .list-group-item-heading { - color: inherit; + color: inherit; } + a.list-group-item-success:hover, a.list-group-item-success:focus { - color: #3c763d; - background-color: #d0e9c6; + color: #3c763d; + background-color: #d0e9c6; } + a.list-group-item-success.active, a.list-group-item-success.active:hover, a.list-group-item-success.active:focus { - color: #fff; - background-color: #3c763d; - border-color: #3c763d; + color: #fff; + background-color: #3c763d; + border-color: #3c763d; } + .list-group-item-info { - color: #31708f; - background-color: #d9edf7; + color: #31708f; + background-color: #d9edf7; } + a.list-group-item-info { - color: #31708f; + color: #31708f; } + a.list-group-item-info .list-group-item-heading { - color: inherit; + color: inherit; } + a.list-group-item-info:hover, a.list-group-item-info:focus { - color: #31708f; - background-color: #c4e3f3; + color: #31708f; + background-color: #c4e3f3; } + a.list-group-item-info.active, a.list-group-item-info.active:hover, a.list-group-item-info.active:focus { - color: #fff; - background-color: #31708f; - border-color: #31708f; + color: #fff; + background-color: #31708f; + border-color: #31708f; } + .list-group-item-warning { - color: #8a6d3b; - background-color: #fcf8e3; + color: #8a6d3b; + background-color: #fcf8e3; } + a.list-group-item-warning { - color: #8a6d3b; + color: #8a6d3b; } + a.list-group-item-warning .list-group-item-heading { - color: inherit; + color: inherit; } + a.list-group-item-warning:hover, a.list-group-item-warning:focus { - color: #8a6d3b; - background-color: #faf2cc; + color: #8a6d3b; + background-color: #faf2cc; } + a.list-group-item-warning.active, a.list-group-item-warning.active:hover, a.list-group-item-warning.active:focus { - color: #fff; - background-color: #8a6d3b; - border-color: #8a6d3b; + color: #fff; + background-color: #8a6d3b; + border-color: #8a6d3b; } + .list-group-item-danger { - color: #a94442; - background-color: #f2dede; + color: #a94442; + background-color: #f2dede; } + a.list-group-item-danger { - color: #a94442; + color: #a94442; } + a.list-group-item-danger .list-group-item-heading { - color: inherit; + color: inherit; } + a.list-group-item-danger:hover, a.list-group-item-danger:focus { - color: #a94442; - background-color: #ebcccc; + color: #a94442; + background-color: #ebcccc; } + a.list-group-item-danger.active, a.list-group-item-danger.active:hover, a.list-group-item-danger.active:focus { - color: #fff; - background-color: #a94442; - border-color: #a94442; + color: #fff; + background-color: #a94442; + border-color: #a94442; } + .list-group-item-heading { - margin-top: 0; - margin-bottom: 5px; + margin-top: 0; + margin-bottom: 5px; } + .list-group-item-text { - margin-bottom: 0; - line-height: 1.3; + margin-bottom: 0; + line-height: 1.3; } + .panel { - margin-bottom: 20px; - background-color: #fff; - border: 1px solid transparent; - border-radius: 4px; - -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05); - box-shadow: 0 1px 1px rgba(0, 0, 0, .05); + margin-bottom: 20px; + background-color: #fff; + border: 1px solid transparent; + border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05); + box-shadow: 0 1px 1px rgba(0, 0, 0, .05); } + .panel-body { - padding: 15px; + padding: 15px; } + .panel-heading { - padding: 10px 15px; - border-bottom: 1px solid transparent; - border-top-left-radius: 3px; - border-top-right-radius: 3px; + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-left-radius: 3px; + border-top-right-radius: 3px; } + .panel-heading > .dropdown .dropdown-toggle { - color: inherit; + color: inherit; } + .panel-title { - margin-top: 0; - margin-bottom: 0; - font-size: 16px; - color: inherit; + margin-top: 0; + margin-bottom: 0; + font-size: 16px; + color: inherit; } + .panel-title > a { - color: inherit; + color: inherit; } + .panel-footer { - padding: 10px 15px; - background-color: #f5f5f5; - border-top: 1px solid #ddd; - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; + padding: 10px 15px; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; } + .panel > .list-group { - margin-bottom: 0; + margin-bottom: 0; } + .panel > .list-group .list-group-item { - border-width: 1px 0; - border-radius: 0; + border-width: 1px 0; + border-radius: 0; } + .panel > .list-group:first-child .list-group-item:first-child { - border-top: 0; - border-top-left-radius: 3px; - border-top-right-radius: 3px; + border-top: 0; + border-top-left-radius: 3px; + border-top-right-radius: 3px; } + .panel > .list-group:last-child .list-group-item:last-child { - border-bottom: 0; - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; + border-bottom: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; } + .panel-heading + .list-group .list-group-item:first-child { - border-top-width: 0; + border-top-width: 0; } + .panel > .table, .panel > .table-responsive > .table { - margin-bottom: 0; + margin-bottom: 0; } + .panel > .table:first-child, .panel > .table-responsive:first-child > .table:first-child { - border-top-left-radius: 3px; - border-top-right-radius: 3px; + border-top-left-radius: 3px; + border-top-right-radius: 3px; } + .panel > .table:first-child > thead:first-child > tr:first-child td:first-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, .panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, @@ -4826,8 +5912,9 @@ a.list-group-item-danger.active:focus { .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, .panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { - border-top-left-radius: 3px; + border-top-left-radius: 3px; } + .panel > .table:first-child > thead:first-child > tr:first-child td:last-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, .panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, @@ -4836,13 +5923,15 @@ a.list-group-item-danger.active:focus { .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, .panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { - border-top-right-radius: 3px; + border-top-right-radius: 3px; } + .panel > .table:last-child, .panel > .table-responsive:last-child > .table:last-child { - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; } + .panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, .panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, @@ -4851,8 +5940,9 @@ a.list-group-item-danger.active:focus { .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, .panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { - border-bottom-left-radius: 3px; + border-bottom-left-radius: 3px; } + .panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, .panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, @@ -4861,20 +5951,24 @@ a.list-group-item-danger.active:focus { .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, .panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { - border-bottom-right-radius: 3px; + border-bottom-right-radius: 3px; } + .panel > .panel-body + .table, .panel > .panel-body + .table-responsive { - border-top: 1px solid #ddd; + border-top: 1px solid #ddd; } + .panel > .table > tbody:first-child > tr:first-child th, .panel > .table > tbody:first-child > tr:first-child td { - border-top: 0; + border-top: 0; } + .panel > .table-bordered, .panel > .table-responsive > .table-bordered { - border: 0; + border: 0; } + .panel > .table-bordered > thead > tr > th:first-child, .panel > .table-responsive > .table-bordered > thead > tr > th:first-child, .panel > .table-bordered > tbody > tr > th:first-child, @@ -4887,8 +5981,9 @@ a.list-group-item-danger.active:focus { .panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, .panel > .table-bordered > tfoot > tr > td:first-child, .panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { - border-left: 0; + border-left: 0; } + .panel > .table-bordered > thead > tr > th:last-child, .panel > .table-responsive > .table-bordered > thead > tr > th:last-child, .panel > .table-bordered > tbody > tr > th:last-child, @@ -4901,8 +5996,9 @@ a.list-group-item-danger.active:focus { .panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, .panel > .table-bordered > tfoot > tr > td:last-child, .panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { - border-right: 0; + border-right: 0; } + .panel > .table-bordered > thead > tr:first-child > td, .panel > .table-responsive > .table-bordered > thead > tr:first-child > td, .panel > .table-bordered > tbody > tr:first-child > td, @@ -4911,8 +6007,9 @@ a.list-group-item-danger.active:focus { .panel > .table-responsive > .table-bordered > thead > tr:first-child > th, .panel > .table-bordered > tbody > tr:first-child > th, .panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { - border-bottom: 0; + border-bottom: 0; } + .panel > .table-bordered > tbody > tr:last-child > td, .panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, .panel > .table-bordered > tfoot > tr:last-child > td, @@ -4921,674 +6018,799 @@ a.list-group-item-danger.active:focus { .panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, .panel > .table-bordered > tfoot > tr:last-child > th, .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { - border-bottom: 0; + border-bottom: 0; } + .panel > .table-responsive { - margin-bottom: 0; - border: 0; + margin-bottom: 0; + border: 0; } + .panel-group { - margin-bottom: 20px; + margin-bottom: 20px; } + .panel-group .panel { - margin-bottom: 0; - overflow: hidden; - border-radius: 4px; + margin-bottom: 0; + overflow: hidden; + border-radius: 4px; } + .panel-group .panel + .panel { - margin-top: 5px; + margin-top: 5px; } + .panel-group .panel-heading { - border-bottom: 0; + border-bottom: 0; } + .panel-group .panel-heading + .panel-collapse .panel-body { - border-top: 1px solid #ddd; + border-top: 1px solid #ddd; } + .panel-group .panel-footer { - border-top: 0; + border-top: 0; } + .panel-group .panel-footer + .panel-collapse .panel-body { - border-bottom: 1px solid #ddd; + border-bottom: 1px solid #ddd; } + .panel-default { - border-color: #ddd; + border-color: #ddd; } + .panel-default > .panel-heading { - color: #333; - background-color: #f5f5f5; - border-color: #ddd; + color: #333; + background-color: #f5f5f5; + border-color: #ddd; } + .panel-default > .panel-heading + .panel-collapse .panel-body { - border-top-color: #ddd; + border-top-color: #ddd; } + .panel-default > .panel-footer + .panel-collapse .panel-body { - border-bottom-color: #ddd; + border-bottom-color: #ddd; } + .panel-primary { - border-color: #428bca; + border-color: #428bca; } + .panel-primary > .panel-heading { - color: #fff; - background-color: #428bca; - border-color: #428bca; + color: #fff; + background-color: #428bca; + border-color: #428bca; } + .panel-primary > .panel-heading + .panel-collapse .panel-body { - border-top-color: #428bca; + border-top-color: #428bca; } + .panel-primary > .panel-footer + .panel-collapse .panel-body { - border-bottom-color: #428bca; + border-bottom-color: #428bca; } + .panel-success { - border-color: #d6e9c6; + border-color: #d6e9c6; } + .panel-success > .panel-heading { - color: #3c763d; - background-color: #dff0d8; - border-color: #d6e9c6; + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; } + .panel-success > .panel-heading + .panel-collapse .panel-body { - border-top-color: #d6e9c6; + border-top-color: #d6e9c6; } + .panel-success > .panel-footer + .panel-collapse .panel-body { - border-bottom-color: #d6e9c6; + border-bottom-color: #d6e9c6; } + .panel-info { - border-color: #bce8f1; + border-color: #bce8f1; } + .panel-info > .panel-heading { - color: #31708f; - background-color: #d9edf7; - border-color: #bce8f1; + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; } + .panel-info > .panel-heading + .panel-collapse .panel-body { - border-top-color: #bce8f1; + border-top-color: #bce8f1; } + .panel-info > .panel-footer + .panel-collapse .panel-body { - border-bottom-color: #bce8f1; + border-bottom-color: #bce8f1; } + .panel-warning { - border-color: #faebcc; + border-color: #faebcc; } + .panel-warning > .panel-heading { - color: #8a6d3b; - background-color: #fcf8e3; - border-color: #faebcc; + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; } + .panel-warning > .panel-heading + .panel-collapse .panel-body { - border-top-color: #faebcc; + border-top-color: #faebcc; } + .panel-warning > .panel-footer + .panel-collapse .panel-body { - border-bottom-color: #faebcc; + border-bottom-color: #faebcc; } + .panel-danger { - border-color: #ebccd1; + border-color: #ebccd1; } + .panel-danger > .panel-heading { - color: #a94442; - background-color: #f2dede; - border-color: #ebccd1; + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; } + .panel-danger > .panel-heading + .panel-collapse .panel-body { - border-top-color: #ebccd1; + border-top-color: #ebccd1; } + .panel-danger > .panel-footer + .panel-collapse .panel-body { - border-bottom-color: #ebccd1; + border-bottom-color: #ebccd1; } + .well { - min-height: 20px; - padding: 19px; - margin-bottom: 20px; - background-color: #f5f5f5; - border: 1px solid #e3e3e3; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); } + .well blockquote { - border-color: #ddd; - border-color: rgba(0, 0, 0, .15); + border-color: #ddd; + border-color: rgba(0, 0, 0, .15); } + .well-lg { - padding: 24px; - border-radius: 6px; + padding: 24px; + border-radius: 6px; } + .well-sm { - padding: 9px; - border-radius: 3px; + padding: 9px; + border-radius: 3px; } + .close { - float: right; - font-size: 21px; - font-weight: bold; - line-height: 1; - color: #000; - text-shadow: 0 1px 0 #fff; - filter: alpha(opacity=20); - opacity: .2; + float: right; + font-size: 21px; + font-weight: bold; + line-height: 1; + color: #000; + text-shadow: 0 1px 0 #fff; + filter: alpha(opacity=20); + opacity: .2; } + .close:hover, .close:focus { - color: #000; - text-decoration: none; - cursor: pointer; - filter: alpha(opacity=50); - opacity: .5; + color: #000; + text-decoration: none; + cursor: pointer; + filter: alpha(opacity=50); + opacity: .5; } + button.close { - -webkit-appearance: none; - padding: 0; - cursor: pointer; - background: transparent; - border: 0; + -webkit-appearance: none; + padding: 0; + cursor: pointer; + background: transparent; + border: 0; } + .modal-open { - overflow: hidden; + overflow: hidden; } + .modal { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1050; - display: none; - overflow: auto; - overflow-y: scroll; - -webkit-overflow-scrolling: touch; - outline: 0; + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1050; + display: none; + overflow: auto; + overflow-y: scroll; + -webkit-overflow-scrolling: touch; + outline: 0; } + .modal.fade .modal-dialog { - -webkit-transition: -webkit-transform .3s ease-out; - -moz-transition: -moz-transform .3s ease-out; - -o-transition: -o-transform .3s ease-out; - transition: transform .3s ease-out; - -webkit-transform: translate(0, -25%); - -ms-transform: translate(0, -25%); - transform: translate(0, -25%); + -webkit-transition: -webkit-transform .3s ease-out; + -moz-transition: -moz-transform .3s ease-out; + -o-transition: -o-transform .3s ease-out; + transition: transform .3s ease-out; + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + transform: translate(0, -25%); } + .modal.in .modal-dialog { - -webkit-transform: translate(0, 0); - -ms-transform: translate(0, 0); - transform: translate(0, 0); + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + transform: translate(0, 0); } + .modal-dialog { - position: relative; - width: auto; - margin: 10px; + position: relative; + width: auto; + margin: 10px; } + .modal-content { - position: relative; - background-color: #fff; - background-clip: padding-box; - border: 1px solid #999; - border: 1px solid rgba(0, 0, 0, .2); - border-radius: 6px; - outline: none; - -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5); - box-shadow: 0 3px 9px rgba(0, 0, 0, .5); + position: relative; + background-color: #fff; + background-clip: padding-box; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: 6px; + outline: none; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5); + box-shadow: 0 3px 9px rgba(0, 0, 0, .5); } + .modal-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1040; - background-color: #000; + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000; } + .modal-backdrop.fade { - filter: alpha(opacity=0); - opacity: 0; + filter: alpha(opacity=0); + opacity: 0; } + .modal-backdrop.in { - filter: alpha(opacity=50); - opacity: .5; + filter: alpha(opacity=50); + opacity: .5; } + .modal-header { - min-height: 16.42857143px; - padding: 15px; - border-bottom: 1px solid #e5e5e5; + min-height: 16.42857143px; + padding: 15px; + border-bottom: 1px solid #e5e5e5; } + .modal-header .close { - margin-top: -2px; + margin-top: -2px; } + .modal-title { - margin: 0; - line-height: 1.42857143; + margin: 0; + line-height: 1.42857143; } + .modal-body { - position: relative; - padding: 20px; + position: relative; + padding: 20px; } + .modal-footer { - padding: 19px 20px 20px; - margin-top: 15px; - text-align: right; - border-top: 1px solid #e5e5e5; + padding: 19px 20px 20px; + margin-top: 15px; + text-align: right; + border-top: 1px solid #e5e5e5; } + .modal-footer .btn + .btn { - margin-bottom: 0; - margin-left: 5px; + margin-bottom: 0; + margin-left: 5px; } + .modal-footer .btn-group .btn + .btn { - margin-left: -1px; + margin-left: -1px; } + .modal-footer .btn-block + .btn-block { - margin-left: 0; + margin-left: 0; } + @media (min-width: 768px) { - .modal-dialog { - width: 600px; - margin: 30px auto; - } - .modal-content { - -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5); - box-shadow: 0 5px 15px rgba(0, 0, 0, .5); - } - .modal-sm { - width: 300px; - } + .modal-dialog { + width: 600px; + margin: 30px auto; + } + + .modal-content { + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5); + box-shadow: 0 5px 15px rgba(0, 0, 0, .5); + } + + .modal-sm { + width: 300px; + } } + @media (min-width: 992px) { - .modal-lg { - width: 900px; - } + .modal-lg { + width: 900px; + } } + .tooltip { - position: absolute; - z-index: 1030; - display: block; - font-size: 12px; - line-height: 1.4; - visibility: visible; - filter: alpha(opacity=0); - opacity: 0; + position: absolute; + z-index: 1030; + display: block; + font-size: 12px; + line-height: 1.4; + visibility: visible; + filter: alpha(opacity=0); + opacity: 0; } + .tooltip.in { - filter: alpha(opacity=90); - opacity: .9; + filter: alpha(opacity=90); + opacity: .9; } + .tooltip.top { - padding: 5px 0; - margin-top: -3px; + padding: 5px 0; + margin-top: -3px; } + .tooltip.right { - padding: 0 5px; - margin-left: 3px; + padding: 0 5px; + margin-left: 3px; } + .tooltip.bottom { - padding: 5px 0; - margin-top: 3px; + padding: 5px 0; + margin-top: 3px; } + .tooltip.left { - padding: 0 5px; - margin-left: -3px; + padding: 0 5px; + margin-left: -3px; } + .tooltip-inner { - max-width: 200px; - padding: 3px 8px; - color: #fff; - text-align: center; - text-decoration: none; - background-color: #000; - border-radius: 4px; + max-width: 200px; + padding: 3px 8px; + color: #fff; + text-align: center; + text-decoration: none; + background-color: #000; + border-radius: 4px; } + .tooltip-arrow { - position: absolute; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; } + .tooltip.top .tooltip-arrow { - bottom: 0; - left: 50%; - margin-left: -5px; - border-width: 5px 5px 0; - border-top-color: #000; + bottom: 0; + left: 50%; + margin-left: -5px; + border-width: 5px 5px 0; + border-top-color: #000; } + .tooltip.top-left .tooltip-arrow { - bottom: 0; - left: 5px; - border-width: 5px 5px 0; - border-top-color: #000; + bottom: 0; + left: 5px; + border-width: 5px 5px 0; + border-top-color: #000; } + .tooltip.top-right .tooltip-arrow { - right: 5px; - bottom: 0; - border-width: 5px 5px 0; - border-top-color: #000; + right: 5px; + bottom: 0; + border-width: 5px 5px 0; + border-top-color: #000; } + .tooltip.right .tooltip-arrow { - top: 50%; - left: 0; - margin-top: -5px; - border-width: 5px 5px 5px 0; - border-right-color: #000; + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #000; } + .tooltip.left .tooltip-arrow { - top: 50%; - right: 0; - margin-top: -5px; - border-width: 5px 0 5px 5px; - border-left-color: #000; + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #000; } + .tooltip.bottom .tooltip-arrow { - top: 0; - left: 50%; - margin-left: -5px; - border-width: 0 5px 5px; - border-bottom-color: #000; + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; } + .tooltip.bottom-left .tooltip-arrow { - top: 0; - left: 5px; - border-width: 0 5px 5px; - border-bottom-color: #000; + top: 0; + left: 5px; + border-width: 0 5px 5px; + border-bottom-color: #000; } + .tooltip.bottom-right .tooltip-arrow { - top: 0; - right: 5px; - border-width: 0 5px 5px; - border-bottom-color: #000; + top: 0; + right: 5px; + border-width: 0 5px 5px; + border-bottom-color: #000; } + .popover { - position: absolute; - top: 0; - left: 0; - z-index: 1010; - display: none; - max-width: 276px; - padding: 1px; - text-align: left; - white-space: normal; - background-color: #fff; - background-clip: padding-box; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, .2); - border-radius: 6px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2); - box-shadow: 0 5px 10px rgba(0, 0, 0, .2); + position: absolute; + top: 0; + left: 0; + z-index: 1010; + display: none; + max-width: 276px; + padding: 1px; + text-align: left; + white-space: normal; + background-color: #fff; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2); + box-shadow: 0 5px 10px rgba(0, 0, 0, .2); } + .popover.top { - margin-top: -10px; + margin-top: -10px; } + .popover.right { - margin-left: 10px; + margin-left: 10px; } + .popover.bottom { - margin-top: 10px; + margin-top: 10px; } + .popover.left { - margin-left: -10px; + margin-left: -10px; } + .popover-title { - padding: 8px 14px; - margin: 0; - font-size: 14px; - font-weight: normal; - line-height: 18px; - background-color: #f7f7f7; - border-bottom: 1px solid #ebebeb; - border-radius: 5px 5px 0 0; + padding: 8px 14px; + margin: 0; + font-size: 14px; + font-weight: normal; + line-height: 18px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-radius: 5px 5px 0 0; } + .popover-content { - padding: 9px 14px; + padding: 9px 14px; } + .popover > .arrow, .popover > .arrow:after { - position: absolute; - display: block; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; } + .popover > .arrow { - border-width: 11px; + border-width: 11px; } + .popover > .arrow:after { - content: ""; - border-width: 10px; + content: ""; + border-width: 10px; } + .popover.top > .arrow { - bottom: -11px; - left: 50%; - margin-left: -11px; - border-top-color: #999; - border-top-color: rgba(0, 0, 0, .25); - border-bottom-width: 0; + bottom: -11px; + left: 50%; + margin-left: -11px; + border-top-color: #999; + border-top-color: rgba(0, 0, 0, .25); + border-bottom-width: 0; } + .popover.top > .arrow:after { - bottom: 1px; - margin-left: -10px; - content: " "; - border-top-color: #fff; - border-bottom-width: 0; + bottom: 1px; + margin-left: -10px; + content: " "; + border-top-color: #fff; + border-bottom-width: 0; } + .popover.right > .arrow { - top: 50%; - left: -11px; - margin-top: -11px; - border-right-color: #999; - border-right-color: rgba(0, 0, 0, .25); - border-left-width: 0; + top: 50%; + left: -11px; + margin-top: -11px; + border-right-color: #999; + border-right-color: rgba(0, 0, 0, .25); + border-left-width: 0; } + .popover.right > .arrow:after { - bottom: -10px; - left: 1px; - content: " "; - border-right-color: #fff; - border-left-width: 0; + bottom: -10px; + left: 1px; + content: " "; + border-right-color: #fff; + border-left-width: 0; } + .popover.bottom > .arrow { - top: -11px; - left: 50%; - margin-left: -11px; - border-top-width: 0; - border-bottom-color: #999; - border-bottom-color: rgba(0, 0, 0, .25); + top: -11px; + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: #999; + border-bottom-color: rgba(0, 0, 0, .25); } + .popover.bottom > .arrow:after { - top: 1px; - margin-left: -10px; - content: " "; - border-top-width: 0; - border-bottom-color: #fff; + top: 1px; + margin-left: -10px; + content: " "; + border-top-width: 0; + border-bottom-color: #fff; } + .popover.left > .arrow { - top: 50%; - right: -11px; - margin-top: -11px; - border-right-width: 0; - border-left-color: #999; - border-left-color: rgba(0, 0, 0, .25); + top: 50%; + right: -11px; + margin-top: -11px; + border-right-width: 0; + border-left-color: #999; + border-left-color: rgba(0, 0, 0, .25); } + .popover.left > .arrow:after { - right: 1px; - bottom: -10px; - content: " "; - border-right-width: 0; - border-left-color: #fff; + right: 1px; + bottom: -10px; + content: " "; + border-right-width: 0; + border-left-color: #fff; } + .carousel { - position: relative; + position: relative; } + .carousel-inner { - position: relative; - width: 100%; - overflow: hidden; + position: relative; + width: 100%; + overflow: hidden; } + .carousel-inner > .item { - position: relative; - display: none; - -webkit-transition: .6s ease-in-out left; - transition: .6s ease-in-out left; + position: relative; + display: none; + -webkit-transition: .6s ease-in-out left; + transition: .6s ease-in-out left; } + .carousel-inner > .item > img, .carousel-inner > .item > a > img { - line-height: 1; + line-height: 1; } + .carousel-inner > .active, .carousel-inner > .next, .carousel-inner > .prev { - display: block; + display: block; } + .carousel-inner > .active { - left: 0; + left: 0; } + .carousel-inner > .next, .carousel-inner > .prev { - position: absolute; - top: 0; - width: 100%; + position: absolute; + top: 0; + width: 100%; } + .carousel-inner > .next { - left: 100%; + left: 100%; } + .carousel-inner > .prev { - left: -100%; + left: -100%; } + .carousel-inner > .next.left, .carousel-inner > .prev.right { - left: 0; + left: 0; } + .carousel-inner > .active.left { - left: -100%; + left: -100%; } + .carousel-inner > .active.right { - left: 100%; + left: 100%; } + .carousel-control { - position: absolute; - top: 0; - bottom: 0; - left: 0; - width: 15%; - font-size: 20px; - color: #fff; - text-align: center; - text-shadow: 0 1px 2px rgba(0, 0, 0, .6); - filter: alpha(opacity=50); - opacity: .5; + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 15%; + font-size: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, .6); + filter: alpha(opacity=50); + opacity: .5; } + .carousel-control.left { - background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, .5) 0%), color-stop(rgba(0, 0, 0, .0001) 100%)); - background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); - background-repeat: repeat-x; + background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, .5) 0%), color-stop(rgba(0, 0, 0, .0001) 100%)); + background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); + background-repeat: repeat-x; } + .carousel-control.right { - right: 0; - left: auto; - background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, .0001) 0%), color-stop(rgba(0, 0, 0, .5) 100%)); - background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); - background-repeat: repeat-x; + right: 0; + left: auto; + background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, .0001) 0%), color-stop(rgba(0, 0, 0, .5) 100%)); + background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); + background-repeat: repeat-x; } + .carousel-control:hover, .carousel-control:focus { - color: #fff; - text-decoration: none; - filter: alpha(opacity=90); - outline: none; - opacity: .9; + color: #fff; + text-decoration: none; + filter: alpha(opacity=90); + outline: none; + opacity: .9; } + .carousel-control .icon-prev, .carousel-control .icon-next, .carousel-control .glyphicon-chevron-left, .carousel-control .glyphicon-chevron-right { - position: absolute; - top: 0%; - z-index: 5; - display: inline-block; + position: absolute; + top: 0%; + z-index: 5; + display: inline-block; } + .carousel-control .icon-prev, .carousel-control .glyphicon-chevron-left { - left: 50%; + left: 50%; } + .carousel-control .icon-next, .carousel-control .glyphicon-chevron-right { - right: 50%; + right: 50%; } + .carousel-control .icon-prev, .carousel-control .icon-next { - width: 20px; - height: 20px; - margin-top: -10px; - margin-left: -10px; - font-family: serif; + width: 20px; + height: 20px; + margin-top: -10px; + margin-left: -10px; + font-family: serif; } + .carousel-control .icon-prev:before { - content: '\2039'; + content: '\2039'; } + .carousel-control .icon-next:before { - content: '\203a'; + content: '\203a'; } + .carousel-indicators { - position: absolute; - bottom: 10px; - left: 50%; - z-index: 15; - width: 60%; - padding-left: 0; - margin-left: -30%; - text-align: center; - list-style: none; + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + padding-left: 0; + margin-left: -30%; + text-align: center; + list-style: none; } + .carousel-indicators li { - display: inline-block; - width: 10px; - height: 10px; - margin: 1px; - text-indent: -999px; - cursor: pointer; - background-color: #000 \9; - background-color: rgba(0, 0, 0, 0); - border: 1px solid #fff; - border-radius: 10px; + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + cursor: pointer; + background-color: #000 \9; + background-color: rgba(0, 0, 0, 0); + border: 1px solid #fff; + border-radius: 10px; } + .carousel-indicators .active { - width: 12px; - height: 12px; - margin: 0; - background-color: #fff; + width: 12px; + height: 12px; + margin: 0; + background-color: #fff; } + .carousel-caption { - position: absolute; - right: 15%; - bottom: 20px; - left: 15%; - z-index: 10; - padding-top: 20px; - padding-bottom: 20px; - color: #fff; - text-align: center; - text-shadow: 0 1px 2px rgba(0, 0, 0, .6); + position: absolute; + right: 15%; + bottom: 20px; + left: 15%; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, .6); } + .carousel-caption .btn { - text-shadow: none; + text-shadow: none; } + @media screen and (min-width: 768px) { - .carousel-control .glyphicon-chevron-left, - .carousel-control .glyphicon-chevron-right, - .carousel-control .icon-prev, - .carousel-control .icon-next { - width: 30px; - height: 30px; - margin-top: -15px; - margin-left: -15px; - font-size: 30px; - } - .carousel-caption { - right: 20%; - left: 20%; - padding-bottom: 30px; - } - .carousel-indicators { - bottom: 20px; - } + .carousel-control .glyphicon-chevron-left, + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-prev, + .carousel-control .icon-next { + width: 30px; + height: 30px; + margin-top: -15px; + margin-left: -15px; + font-size: 30px; + } + + .carousel-caption { + right: 20%; + left: 20%; + padding-bottom: 30px; + } + + .carousel-indicators { + bottom: 20px; + } } + .clearfix:before, .clearfix:after, .container:before, @@ -5617,9 +6839,10 @@ button.close { .panel-body:after, .modal-footer:before, .modal-footer:after { - display: table; - content: " "; + display: table; + content: " "; } + .clearfix:after, .container:after, .container-fluid:after, @@ -5634,152 +6857,190 @@ button.close { .pager:after, .panel-body:after, .modal-footer:after { - clear: both; + clear: both; } + .center-block { - display: block; - margin-right: auto; - margin-left: auto; + display: block; + margin-right: auto; + margin-left: auto; } + .pull-right { - float: right !important; + float: right !important; } + .pull-left { - float: left !important; + float: left !important; } + .hide { - display: none !important; + display: none !important; } + .show { - display: block !important; + display: block !important; } + .invisible { - visibility: hidden; + visibility: hidden; } + .text-hide { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; } + .hidden { - display: none !important; - visibility: hidden !important; + display: none !important; + visibility: hidden !important; } + .affix { - position: fixed; + position: fixed; } + @-ms-viewport { - width: device-width; + width: device-width; } + .visible-xs, .visible-sm, .visible-md, .visible-lg { - display: none !important; + display: none !important; } + @media (max-width: 767px) { - .visible-xs { - display: block !important; - } - table.visible-xs { - display: table; - } - tr.visible-xs { - display: table-row !important; - } - th.visible-xs, - td.visible-xs { - display: table-cell !important; - } + .visible-xs { + display: block !important; + } + + table.visible-xs { + display: table; + } + + tr.visible-xs { + display: table-row !important; + } + + th.visible-xs, + td.visible-xs { + display: table-cell !important; + } } + @media (min-width: 768px) and (max-width: 991px) { - .visible-sm { - display: block !important; - } - table.visible-sm { - display: table; - } - tr.visible-sm { - display: table-row !important; - } - th.visible-sm, - td.visible-sm { - display: table-cell !important; - } + .visible-sm { + display: block !important; + } + + table.visible-sm { + display: table; + } + + tr.visible-sm { + display: table-row !important; + } + + th.visible-sm, + td.visible-sm { + display: table-cell !important; + } } + @media (min-width: 992px) and (max-width: 1199px) { - .visible-md { - display: block !important; - } - table.visible-md { - display: table; - } - tr.visible-md { - display: table-row !important; - } - th.visible-md, - td.visible-md { - display: table-cell !important; - } + .visible-md { + display: block !important; + } + + table.visible-md { + display: table; + } + + tr.visible-md { + display: table-row !important; + } + + th.visible-md, + td.visible-md { + display: table-cell !important; + } } + @media (min-width: 1200px) { - .visible-lg { - display: block !important; - } - table.visible-lg { - display: table; - } - tr.visible-lg { - display: table-row !important; - } - th.visible-lg, - td.visible-lg { - display: table-cell !important; - } + .visible-lg { + display: block !important; + } + + table.visible-lg { + display: table; + } + + tr.visible-lg { + display: table-row !important; + } + + th.visible-lg, + td.visible-lg { + display: table-cell !important; + } } + @media (max-width: 767px) { - .hidden-xs { - display: none !important; - } + .hidden-xs { + display: none !important; + } } + @media (min-width: 768px) and (max-width: 991px) { - .hidden-sm { - display: none !important; - } + .hidden-sm { + display: none !important; + } } + @media (min-width: 992px) and (max-width: 1199px) { - .hidden-md { - display: none !important; - } + .hidden-md { + display: none !important; + } } + @media (min-width: 1200px) { - .hidden-lg { - display: none !important; - } + .hidden-lg { + display: none !important; + } } + .visible-print { - display: none !important; + display: none !important; } + @media print { - .visible-print { - display: block !important; - } - table.visible-print { - display: table; - } - tr.visible-print { - display: table-row !important; - } - th.visible-print, - td.visible-print { - display: table-cell !important; - } + .visible-print { + display: block !important; + } + + table.visible-print { + display: table; + } + + tr.visible-print { + display: table-row !important; + } + + th.visible-print, + td.visible-print { + display: table-cell !important; + } } + @media print { - .hidden-print { - display: none !important; - } + .hidden-print { + display: none !important; + } } + /*# sourceMappingURL=bootstrap.css.map */ diff --git a/len-activiti/src/main/resources/static/editor-app/libs/bootstrap_3.1.1/fonts/glyphicons-halflings-regular.svg b/len-activiti/src/main/resources/static/editor-app/libs/bootstrap_3.1.1/fonts/glyphicons-halflings-regular.svg index e3e2dc7..3d52033 100644 --- a/len-activiti/src/main/resources/static/editor-app/libs/bootstrap_3.1.1/fonts/glyphicons-halflings-regular.svg +++ b/len-activiti/src/main/resources/static/editor-app/libs/bootstrap_3.1.1/fonts/glyphicons-halflings-regular.svg @@ -1,229 +1,410 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/len-activiti/src/main/resources/static/editor-app/libs/bootstrap_3.1.1/js/bootstrap.js b/len-activiti/src/main/resources/static/editor-app/libs/bootstrap_3.1.1/js/bootstrap.js index 8ae571b..5b8a0b1 100644 --- a/len-activiti/src/main/resources/static/editor-app/libs/bootstrap_3.1.1/js/bootstrap.js +++ b/len-activiti/src/main/resources/static/editor-app/libs/bootstrap_3.1.1/js/bootstrap.js @@ -4,7 +4,9 @@ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) */ -if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript requires jQuery') } +if (typeof jQuery === 'undefined') { + throw new Error('Bootstrap\'s JavaScript requires jQuery') +} /* ======================================================================== * Bootstrap: transition.js v3.1.1 @@ -16,42 +18,46 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re +function ($) { - 'use strict'; - - // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/) - // ============================================================ - - function transitionEnd() { - var el = document.createElement('bootstrap') - - var transEndEventNames = { - 'WebkitTransition' : 'webkitTransitionEnd', - 'MozTransition' : 'transitionend', - 'OTransition' : 'oTransitionEnd otransitionend', - 'transition' : 'transitionend' - } - - for (var name in transEndEventNames) { - if (el.style[name] !== undefined) { - return { end: transEndEventNames[name] } - } - } - - return false // explicit for ie8 ( ._.) - } - - // http://blog.alexmaccaw.com/css-transitions - $.fn.emulateTransitionEnd = function (duration) { - var called = false, $el = this - $(this).one($.support.transition.end, function () { called = true }) - var callback = function () { if (!called) $($el).trigger($.support.transition.end) } - setTimeout(callback, duration) - return this - } - - $(function () { - $.support.transition = transitionEnd() - }) + 'use strict'; + + // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/) + // ============================================================ + + function transitionEnd() { + var el = document.createElement('bootstrap') + + var transEndEventNames = { + 'WebkitTransition': 'webkitTransitionEnd', + 'MozTransition': 'transitionend', + 'OTransition': 'oTransitionEnd otransitionend', + 'transition': 'transitionend' + } + + for (var name in transEndEventNames) { + if (el.style[name] !== undefined) { + return {end: transEndEventNames[name]} + } + } + + return false // explicit for ie8 ( ._.) + } + + // http://blog.alexmaccaw.com/css-transitions + $.fn.emulateTransitionEnd = function (duration) { + var called = false, $el = this + $(this).one($.support.transition.end, function () { + called = true + }) + var callback = function () { + if (!called) $($el).trigger($.support.transition.end) + } + setTimeout(callback, duration) + return this + } + + $(function () { + $.support.transition = transitionEnd() + }) }(jQuery); @@ -65,82 +71,82 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re +function ($) { - 'use strict'; + 'use strict'; - // ALERT CLASS DEFINITION - // ====================== + // ALERT CLASS DEFINITION + // ====================== - var dismiss = '[data-dismiss="alert"]' - var Alert = function (el) { - $(el).on('click', dismiss, this.close) - } + var dismiss = '[data-dismiss="alert"]' + var Alert = function (el) { + $(el).on('click', dismiss, this.close) + } - Alert.prototype.close = function (e) { - var $this = $(this) - var selector = $this.attr('data-target') + Alert.prototype.close = function (e) { + var $this = $(this) + var selector = $this.attr('data-target') - if (!selector) { - selector = $this.attr('href') - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 - } + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 + } - var $parent = $(selector) + var $parent = $(selector) - if (e) e.preventDefault() + if (e) e.preventDefault() - if (!$parent.length) { - $parent = $this.hasClass('alert') ? $this : $this.parent() - } + if (!$parent.length) { + $parent = $this.hasClass('alert') ? $this : $this.parent() + } - $parent.trigger(e = $.Event('close.bs.alert')) + $parent.trigger(e = $.Event('close.bs.alert')) - if (e.isDefaultPrevented()) return + if (e.isDefaultPrevented()) return - $parent.removeClass('in') + $parent.removeClass('in') - function removeElement() { - $parent.trigger('closed.bs.alert').remove() - } + function removeElement() { + $parent.trigger('closed.bs.alert').remove() + } - $.support.transition && $parent.hasClass('fade') ? - $parent - .one($.support.transition.end, removeElement) - .emulateTransitionEnd(150) : - removeElement() - } + $.support.transition && $parent.hasClass('fade') ? + $parent + .one($.support.transition.end, removeElement) + .emulateTransitionEnd(150) : + removeElement() + } - // ALERT PLUGIN DEFINITION - // ======================= + // ALERT PLUGIN DEFINITION + // ======================= - var old = $.fn.alert + var old = $.fn.alert - $.fn.alert = function (option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.alert') + $.fn.alert = function (option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.alert') - if (!data) $this.data('bs.alert', (data = new Alert(this))) - if (typeof option == 'string') data[option].call($this) - }) - } + if (!data) $this.data('bs.alert', (data = new Alert(this))) + if (typeof option == 'string') data[option].call($this) + }) + } - $.fn.alert.Constructor = Alert + $.fn.alert.Constructor = Alert - // ALERT NO CONFLICT - // ================= + // ALERT NO CONFLICT + // ================= - $.fn.alert.noConflict = function () { - $.fn.alert = old - return this - } + $.fn.alert.noConflict = function () { + $.fn.alert = old + return this + } - // ALERT DATA-API - // ============== + // ALERT DATA-API + // ============== - $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close) + $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close) }(jQuery); @@ -154,101 +160,101 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re +function ($) { - 'use strict'; + 'use strict'; - // BUTTON PUBLIC CLASS DEFINITION - // ============================== + // BUTTON PUBLIC CLASS DEFINITION + // ============================== - var Button = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, Button.DEFAULTS, options) - this.isLoading = false - } + var Button = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, Button.DEFAULTS, options) + this.isLoading = false + } - Button.DEFAULTS = { - loadingText: 'loading...' - } + Button.DEFAULTS = { + loadingText: 'loading...' + } - Button.prototype.setState = function (state) { - var d = 'disabled' - var $el = this.$element - var val = $el.is('input') ? 'val' : 'html' - var data = $el.data() + Button.prototype.setState = function (state) { + var d = 'disabled' + var $el = this.$element + var val = $el.is('input') ? 'val' : 'html' + var data = $el.data() - state = state + 'Text' + state = state + 'Text' - if (!data.resetText) $el.data('resetText', $el[val]()) + if (!data.resetText) $el.data('resetText', $el[val]()) - $el[val](data[state] || this.options[state]) + $el[val](data[state] || this.options[state]) - // push to event loop to allow forms to submit - setTimeout($.proxy(function () { - if (state == 'loadingText') { - this.isLoading = true - $el.addClass(d).attr(d, d) - } else if (this.isLoading) { - this.isLoading = false - $el.removeClass(d).removeAttr(d) - } - }, this), 0) - } + // push to event loop to allow forms to submit + setTimeout($.proxy(function () { + if (state == 'loadingText') { + this.isLoading = true + $el.addClass(d).attr(d, d) + } else if (this.isLoading) { + this.isLoading = false + $el.removeClass(d).removeAttr(d) + } + }, this), 0) + } - Button.prototype.toggle = function () { - var changed = true - var $parent = this.$element.closest('[data-toggle="buttons"]') + Button.prototype.toggle = function () { + var changed = true + var $parent = this.$element.closest('[data-toggle="buttons"]') - if ($parent.length) { - var $input = this.$element.find('input') - if ($input.prop('type') == 'radio') { - if ($input.prop('checked') && this.$element.hasClass('active')) changed = false - else $parent.find('.active').removeClass('active') - } - if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change') - } + if ($parent.length) { + var $input = this.$element.find('input') + if ($input.prop('type') == 'radio') { + if ($input.prop('checked') && this.$element.hasClass('active')) changed = false + else $parent.find('.active').removeClass('active') + } + if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change') + } - if (changed) this.$element.toggleClass('active') - } + if (changed) this.$element.toggleClass('active') + } - // BUTTON PLUGIN DEFINITION - // ======================== + // BUTTON PLUGIN DEFINITION + // ======================== - var old = $.fn.button + var old = $.fn.button - $.fn.button = function (option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.button') - var options = typeof option == 'object' && option + $.fn.button = function (option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.button') + var options = typeof option == 'object' && option - if (!data) $this.data('bs.button', (data = new Button(this, options))) + if (!data) $this.data('bs.button', (data = new Button(this, options))) - if (option == 'toggle') data.toggle() - else if (option) data.setState(option) - }) - } + if (option == 'toggle') data.toggle() + else if (option) data.setState(option) + }) + } - $.fn.button.Constructor = Button + $.fn.button.Constructor = Button - // BUTTON NO CONFLICT - // ================== + // BUTTON NO CONFLICT + // ================== - $.fn.button.noConflict = function () { - $.fn.button = old - return this - } + $.fn.button.noConflict = function () { + $.fn.button = old + return this + } - // BUTTON DATA-API - // =============== + // BUTTON DATA-API + // =============== - $(document).on('click.bs.button.data-api', '[data-toggle^=button]', function (e) { - var $btn = $(e.target) - if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') - $btn.button('toggle') - e.preventDefault() - }) + $(document).on('click.bs.button.data-api', '[data-toggle^=button]', function (e) { + var $btn = $(e.target) + if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') + $btn.button('toggle') + e.preventDefault() + }) }(jQuery); @@ -262,199 +268,203 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re +function ($) { - 'use strict'; + 'use strict'; - // CAROUSEL CLASS DEFINITION - // ========================= + // CAROUSEL CLASS DEFINITION + // ========================= - var Carousel = function (element, options) { - this.$element = $(element) - this.$indicators = this.$element.find('.carousel-indicators') - this.options = options - this.paused = - this.sliding = - this.interval = - this.$active = - this.$items = null + var Carousel = function (element, options) { + this.$element = $(element) + this.$indicators = this.$element.find('.carousel-indicators') + this.options = options + this.paused = + this.sliding = + this.interval = + this.$active = + this.$items = null - this.options.pause == 'hover' && this.$element - .on('mouseenter', $.proxy(this.pause, this)) - .on('mouseleave', $.proxy(this.cycle, this)) - } - - Carousel.DEFAULTS = { - interval: 5000, - pause: 'hover', - wrap: true - } - - Carousel.prototype.cycle = function (e) { - e || (this.paused = false) - - this.interval && clearInterval(this.interval) - - this.options.interval - && !this.paused - && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) - - return this - } - - Carousel.prototype.getActiveIndex = function () { - this.$active = this.$element.find('.item.active') - this.$items = this.$active.parent().children() - - return this.$items.index(this.$active) - } - - Carousel.prototype.to = function (pos) { - var that = this - var activeIndex = this.getActiveIndex() - - if (pos > (this.$items.length - 1) || pos < 0) return - - if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) - if (activeIndex == pos) return this.pause().cycle() - - return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos])) - } - - Carousel.prototype.pause = function (e) { - e || (this.paused = true) - - if (this.$element.find('.next, .prev').length && $.support.transition) { - this.$element.trigger($.support.transition.end) - this.cycle(true) - } - - this.interval = clearInterval(this.interval) - - return this - } - - Carousel.prototype.next = function () { - if (this.sliding) return - return this.slide('next') - } - - Carousel.prototype.prev = function () { - if (this.sliding) return - return this.slide('prev') - } - - Carousel.prototype.slide = function (type, next) { - var $active = this.$element.find('.item.active') - var $next = next || $active[type]() - var isCycling = this.interval - var direction = type == 'next' ? 'left' : 'right' - var fallback = type == 'next' ? 'first' : 'last' - var that = this - - if (!$next.length) { - if (!this.options.wrap) return - $next = this.$element.find('.item')[fallback]() - } - - if ($next.hasClass('active')) return this.sliding = false - - var e = $.Event('slide.bs.carousel', { relatedTarget: $next[0], direction: direction }) - this.$element.trigger(e) - if (e.isDefaultPrevented()) return - - this.sliding = true - - isCycling && this.pause() - - if (this.$indicators.length) { - this.$indicators.find('.active').removeClass('active') - this.$element.one('slid.bs.carousel', function () { - var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()]) - $nextIndicator && $nextIndicator.addClass('active') - }) - } - - if ($.support.transition && this.$element.hasClass('slide')) { - $next.addClass(type) - $next[0].offsetWidth // force reflow - $active.addClass(direction) - $next.addClass(direction) - $active - .one($.support.transition.end, function () { - $next.removeClass([type, direction].join(' ')).addClass('active') - $active.removeClass(['active', direction].join(' ')) - that.sliding = false - setTimeout(function () { that.$element.trigger('slid.bs.carousel') }, 0) - }) - .emulateTransitionEnd($active.css('transition-duration').slice(0, -1) * 1000) - } else { - $active.removeClass('active') - $next.addClass('active') - this.sliding = false - this.$element.trigger('slid.bs.carousel') - } - - isCycling && this.cycle() - - return this - } - - - // CAROUSEL PLUGIN DEFINITION - // ========================== - - var old = $.fn.carousel - - $.fn.carousel = function (option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.carousel') - var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) - var action = typeof option == 'string' ? option : options.slide - - if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) - if (typeof option == 'number') data.to(option) - else if (action) data[action]() - else if (options.interval) data.pause().cycle() - }) - } - - $.fn.carousel.Constructor = Carousel - - - // CAROUSEL NO CONFLICT - // ==================== - - $.fn.carousel.noConflict = function () { - $.fn.carousel = old - return this - } - - - // CAROUSEL DATA-API - // ================= - - $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) { - var $this = $(this), href - var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 - var options = $.extend({}, $target.data(), $this.data()) - var slideIndex = $this.attr('data-slide-to') - if (slideIndex) options.interval = false - - $target.carousel(options) - - if (slideIndex = $this.attr('data-slide-to')) { - $target.data('bs.carousel').to(slideIndex) - } - - e.preventDefault() - }) - - $(window).on('load', function () { - $('[data-ride="carousel"]').each(function () { - var $carousel = $(this) - $carousel.carousel($carousel.data()) - }) - }) + this.options.pause == 'hover' && this.$element + .on('mouseenter', $.proxy(this.pause, this)) + .on('mouseleave', $.proxy(this.cycle, this)) + } + + Carousel.DEFAULTS = { + interval: 5000, + pause: 'hover', + wrap: true + } + + Carousel.prototype.cycle = function (e) { + e || (this.paused = false) + + this.interval && clearInterval(this.interval) + + this.options.interval + && !this.paused + && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) + + return this + } + + Carousel.prototype.getActiveIndex = function () { + this.$active = this.$element.find('.item.active') + this.$items = this.$active.parent().children() + + return this.$items.index(this.$active) + } + + Carousel.prototype.to = function (pos) { + var that = this + var activeIndex = this.getActiveIndex() + + if (pos > (this.$items.length - 1) || pos < 0) return + + if (this.sliding) return this.$element.one('slid.bs.carousel', function () { + that.to(pos) + }) + if (activeIndex == pos) return this.pause().cycle() + + return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos])) + } + + Carousel.prototype.pause = function (e) { + e || (this.paused = true) + + if (this.$element.find('.next, .prev').length && $.support.transition) { + this.$element.trigger($.support.transition.end) + this.cycle(true) + } + + this.interval = clearInterval(this.interval) + + return this + } + + Carousel.prototype.next = function () { + if (this.sliding) return + return this.slide('next') + } + + Carousel.prototype.prev = function () { + if (this.sliding) return + return this.slide('prev') + } + + Carousel.prototype.slide = function (type, next) { + var $active = this.$element.find('.item.active') + var $next = next || $active[type]() + var isCycling = this.interval + var direction = type == 'next' ? 'left' : 'right' + var fallback = type == 'next' ? 'first' : 'last' + var that = this + + if (!$next.length) { + if (!this.options.wrap) return + $next = this.$element.find('.item')[fallback]() + } + + if ($next.hasClass('active')) return this.sliding = false + + var e = $.Event('slide.bs.carousel', {relatedTarget: $next[0], direction: direction}) + this.$element.trigger(e) + if (e.isDefaultPrevented()) return + + this.sliding = true + + isCycling && this.pause() + + if (this.$indicators.length) { + this.$indicators.find('.active').removeClass('active') + this.$element.one('slid.bs.carousel', function () { + var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()]) + $nextIndicator && $nextIndicator.addClass('active') + }) + } + + if ($.support.transition && this.$element.hasClass('slide')) { + $next.addClass(type) + $next[0].offsetWidth // force reflow + $active.addClass(direction) + $next.addClass(direction) + $active + .one($.support.transition.end, function () { + $next.removeClass([type, direction].join(' ')).addClass('active') + $active.removeClass(['active', direction].join(' ')) + that.sliding = false + setTimeout(function () { + that.$element.trigger('slid.bs.carousel') + }, 0) + }) + .emulateTransitionEnd($active.css('transition-duration').slice(0, -1) * 1000) + } else { + $active.removeClass('active') + $next.addClass('active') + this.sliding = false + this.$element.trigger('slid.bs.carousel') + } + + isCycling && this.cycle() + + return this + } + + + // CAROUSEL PLUGIN DEFINITION + // ========================== + + var old = $.fn.carousel + + $.fn.carousel = function (option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.carousel') + var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) + var action = typeof option == 'string' ? option : options.slide + + if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) + if (typeof option == 'number') data.to(option) + else if (action) data[action]() + else if (options.interval) data.pause().cycle() + }) + } + + $.fn.carousel.Constructor = Carousel + + + // CAROUSEL NO CONFLICT + // ==================== + + $.fn.carousel.noConflict = function () { + $.fn.carousel = old + return this + } + + + // CAROUSEL DATA-API + // ================= + + $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) { + var $this = $(this), href + var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 + var options = $.extend({}, $target.data(), $this.data()) + var slideIndex = $this.attr('data-slide-to') + if (slideIndex) options.interval = false + + $target.carousel(options) + + if (slideIndex = $this.attr('data-slide-to')) { + $target.data('bs.carousel').to(slideIndex) + } + + e.preventDefault() + }) + + $(window).on('load', function () { + $('[data-ride="carousel"]').each(function () { + var $carousel = $(this) + $carousel.carousel($carousel.data()) + }) + }) }(jQuery); @@ -468,164 +478,164 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re +function ($) { - 'use strict'; + 'use strict'; - // COLLAPSE PUBLIC CLASS DEFINITION - // ================================ + // COLLAPSE PUBLIC CLASS DEFINITION + // ================================ - var Collapse = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, Collapse.DEFAULTS, options) - this.transitioning = null + var Collapse = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, Collapse.DEFAULTS, options) + this.transitioning = null - if (this.options.parent) this.$parent = $(this.options.parent) - if (this.options.toggle) this.toggle() - } + if (this.options.parent) this.$parent = $(this.options.parent) + if (this.options.toggle) this.toggle() + } - Collapse.DEFAULTS = { - toggle: true - } + Collapse.DEFAULTS = { + toggle: true + } - Collapse.prototype.dimension = function () { - var hasWidth = this.$element.hasClass('width') - return hasWidth ? 'width' : 'height' - } + Collapse.prototype.dimension = function () { + var hasWidth = this.$element.hasClass('width') + return hasWidth ? 'width' : 'height' + } - Collapse.prototype.show = function () { - if (this.transitioning || this.$element.hasClass('in')) return + Collapse.prototype.show = function () { + if (this.transitioning || this.$element.hasClass('in')) return - var startEvent = $.Event('show.bs.collapse') - this.$element.trigger(startEvent) - if (startEvent.isDefaultPrevented()) return + var startEvent = $.Event('show.bs.collapse') + this.$element.trigger(startEvent) + if (startEvent.isDefaultPrevented()) return - var actives = this.$parent && this.$parent.find('> .panel > .in') + var actives = this.$parent && this.$parent.find('> .panel > .in') - if (actives && actives.length) { - var hasData = actives.data('bs.collapse') - if (hasData && hasData.transitioning) return - actives.collapse('hide') - hasData || actives.data('bs.collapse', null) - } + if (actives && actives.length) { + var hasData = actives.data('bs.collapse') + if (hasData && hasData.transitioning) return + actives.collapse('hide') + hasData || actives.data('bs.collapse', null) + } - var dimension = this.dimension() + var dimension = this.dimension() - this.$element - .removeClass('collapse') - .addClass('collapsing') - [dimension](0) + this.$element + .removeClass('collapse') + .addClass('collapsing') + [dimension](0) - this.transitioning = 1 + this.transitioning = 1 - var complete = function () { - this.$element - .removeClass('collapsing') - .addClass('collapse in') - [dimension]('auto') - this.transitioning = 0 - this.$element.trigger('shown.bs.collapse') - } + var complete = function () { + this.$element + .removeClass('collapsing') + .addClass('collapse in') + [dimension]('auto') + this.transitioning = 0 + this.$element.trigger('shown.bs.collapse') + } - if (!$.support.transition) return complete.call(this) + if (!$.support.transition) return complete.call(this) - var scrollSize = $.camelCase(['scroll', dimension].join('-')) + var scrollSize = $.camelCase(['scroll', dimension].join('-')) - this.$element - .one($.support.transition.end, $.proxy(complete, this)) - .emulateTransitionEnd(350) - [dimension](this.$element[0][scrollSize]) - } + this.$element + .one($.support.transition.end, $.proxy(complete, this)) + .emulateTransitionEnd(350) + [dimension](this.$element[0][scrollSize]) + } - Collapse.prototype.hide = function () { - if (this.transitioning || !this.$element.hasClass('in')) return + Collapse.prototype.hide = function () { + if (this.transitioning || !this.$element.hasClass('in')) return - var startEvent = $.Event('hide.bs.collapse') - this.$element.trigger(startEvent) - if (startEvent.isDefaultPrevented()) return + var startEvent = $.Event('hide.bs.collapse') + this.$element.trigger(startEvent) + if (startEvent.isDefaultPrevented()) return - var dimension = this.dimension() + var dimension = this.dimension() - this.$element - [dimension](this.$element[dimension]()) - [0].offsetHeight + this.$element + [dimension](this.$element[dimension]()) + [0].offsetHeight - this.$element - .addClass('collapsing') - .removeClass('collapse') - .removeClass('in') + this.$element + .addClass('collapsing') + .removeClass('collapse') + .removeClass('in') - this.transitioning = 1 + this.transitioning = 1 - var complete = function () { - this.transitioning = 0 - this.$element - .trigger('hidden.bs.collapse') - .removeClass('collapsing') - .addClass('collapse') - } + var complete = function () { + this.transitioning = 0 + this.$element + .trigger('hidden.bs.collapse') + .removeClass('collapsing') + .addClass('collapse') + } - if (!$.support.transition) return complete.call(this) + if (!$.support.transition) return complete.call(this) - this.$element - [dimension](0) - .one($.support.transition.end, $.proxy(complete, this)) - .emulateTransitionEnd(350) - } + this.$element + [dimension](0) + .one($.support.transition.end, $.proxy(complete, this)) + .emulateTransitionEnd(350) + } - Collapse.prototype.toggle = function () { - this[this.$element.hasClass('in') ? 'hide' : 'show']() - } + Collapse.prototype.toggle = function () { + this[this.$element.hasClass('in') ? 'hide' : 'show']() + } - // COLLAPSE PLUGIN DEFINITION - // ========================== + // COLLAPSE PLUGIN DEFINITION + // ========================== - var old = $.fn.collapse + var old = $.fn.collapse - $.fn.collapse = function (option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.collapse') - var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) + $.fn.collapse = function (option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.collapse') + var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) - if (!data && options.toggle && option == 'show') option = !option - if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) - if (typeof option == 'string') data[option]() - }) - } + if (!data && options.toggle && option == 'show') option = !option + if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) + if (typeof option == 'string') data[option]() + }) + } - $.fn.collapse.Constructor = Collapse + $.fn.collapse.Constructor = Collapse - // COLLAPSE NO CONFLICT - // ==================== + // COLLAPSE NO CONFLICT + // ==================== - $.fn.collapse.noConflict = function () { - $.fn.collapse = old - return this - } + $.fn.collapse.noConflict = function () { + $.fn.collapse = old + return this + } - // COLLAPSE DATA-API - // ================= + // COLLAPSE DATA-API + // ================= - $(document).on('click.bs.collapse.data-api', '[data-toggle=collapse]', function (e) { - var $this = $(this), href - var target = $this.attr('data-target') - || e.preventDefault() - || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 - var $target = $(target) - var data = $target.data('bs.collapse') - var option = data ? 'toggle' : $this.data() - var parent = $this.attr('data-parent') - var $parent = parent && $(parent) + $(document).on('click.bs.collapse.data-api', '[data-toggle=collapse]', function (e) { + var $this = $(this), href + var target = $this.attr('data-target') + || e.preventDefault() + || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 + var $target = $(target) + var data = $target.data('bs.collapse') + var option = data ? 'toggle' : $this.data() + var parent = $this.attr('data-parent') + var $parent = parent && $(parent) - if (!data || !data.transitioning) { - if ($parent) $parent.find('[data-toggle=collapse][data-parent="' + parent + '"]').not($this).addClass('collapsed') - $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed') - } + if (!data || !data.transitioning) { + if ($parent) $parent.find('[data-toggle=collapse][data-parent="' + parent + '"]').not($this).addClass('collapsed') + $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed') + } - $target.collapse(option) - }) + $target.collapse(option) + }) }(jQuery); @@ -639,141 +649,143 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re +function ($) { - 'use strict'; + 'use strict'; - // DROPDOWN CLASS DEFINITION - // ========================= + // DROPDOWN CLASS DEFINITION + // ========================= - var backdrop = '.dropdown-backdrop' - var toggle = '[data-toggle=dropdown]' - var Dropdown = function (element) { - $(element).on('click.bs.dropdown', this.toggle) - } + var backdrop = '.dropdown-backdrop' + var toggle = '[data-toggle=dropdown]' + var Dropdown = function (element) { + $(element).on('click.bs.dropdown', this.toggle) + } - Dropdown.prototype.toggle = function (e) { - var $this = $(this) + Dropdown.prototype.toggle = function (e) { + var $this = $(this) - if ($this.is('.disabled, :disabled')) return + if ($this.is('.disabled, :disabled')) return - var $parent = getParent($this) - var isActive = $parent.hasClass('open') + var $parent = getParent($this) + var isActive = $parent.hasClass('open') - clearMenus() + clearMenus() - if (!isActive) { - if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { - // if mobile we use a backdrop because click events don't delegate - $('