(window.webpackJsonp=window.webpackJsonp||[]).push([[25],{144:function(e,t,r){"use strict";r.d(t,"a",(function(){return p})),r.d(t,"b",(function(){return f}));var n=r(0),a=r.n(n);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function s(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function c(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var l=a.a.createContext({}),u=function(e){var t=a.a.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):s(s({},t),e)),r},p=function(e){var t=u(e.components);return a.a.createElement(l.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},b=a.a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,i=e.parentName,l=c(e,["components","mdxType","originalType","parentName"]),p=u(r),b=n,f=p["".concat(i,".").concat(b)]||p[b]||m[b]||o;return r?a.a.createElement(f,s(s({ref:t},l),{},{components:r})):a.a.createElement(f,s({ref:t},l))}));function f(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,i=new Array(o);i[0]=b;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s.mdxType="string"==typeof e?e:n,i[1]=s;for(var l=2;l<o;l++)i[l]=r[l];return a.a.createElement.apply(null,i)}return a.a.createElement.apply(null,r)}b.displayName="MDXCreateElement"},92:function(e,t,r){"use strict";r.r(t),r.d(t,"frontMatter",(function(){return i})),r.d(t,"metadata",(function(){return s})),r.d(t,"toc",(function(){return c})),r.d(t,"default",(function(){return u}));var n=r(3),a=r(7),o=(r(0),r(144)),i={title:"Apache Submarine Release 0.2.0"},s={unversionedId:"releases/submarine-release-0.2.0",id:"releases/submarine-release-0.2.0",isDocsHomePage:!1,title:"Apache Submarine Release 0.2.0",description:"\x3c!--",source:"@site/docs/releases/submarine-release-0.2.0.md",slug:"/releases/submarine-release-0.2.0",permalink:"/docs/releases/submarine-release-0.2.0",editUrl:"https://github.com/apache/submarine/edit/master/website/docs/releases/submarine-release-0.2.0.md",version:"current",sidebar:"docs",previous:{title:"Security Implementation",permalink:"/docs/designDocs/wip-designs/security-implementation"},next:{title:"Apache Submarine Release 0.3.0",permalink:"/docs/releases/submarine-release-0.3.0"}},c=[],l={toc:c};function u(e){var t=e.components,r=Object(a.a)(e,["components"]);return Object(o.b)("wrapper",Object(n.a)({},l,r,{components:t,mdxType:"MDXLayout"}),Object(o.b)("p",null,"The Apache Submarine community is pleased to announce the availability of the ",Object(o.b)("inlineCode",{parentName:"p"},"0.2.0")," release."),Object(o.b)("p",null,"The community put significant effort into improving Apache Submarine since the last release.\n46 patches for improvements and bug fixes."),Object(o.b)("p",null,"We encourage to ",Object(o.b)("a",{parentName:"p",href:"../download"},"download")," the latest release. Feedback through the ",Object(o.b)("a",{parentName:"p",href:"../community/README"},"mailing lists")," is very welcome."),Object(o.b)("p",null,"You can visit ",Object(o.b)("a",{parentName:"p",href:"https://issues.apache.org/jira/secure/ReleaseNote.jspa?version=12343240&styleName=&projectId=12316221"},"issue tracker")," for full list of issues that are resolved."))}u.isMDXComponent=!0}}]);